Initial project's source code check-in.

This commit is contained in:
ptsurbeleu 2011-07-13 16:07:32 -07:00
commit b03b0b373f
4573 changed files with 981205 additions and 0 deletions

12
.hgignore Normal file
View file

@ -0,0 +1,12 @@
syntax: glob
*.suo
obj
bin/Debug
bin/Release
MySql.Data.dll
SDNSAPI.dll
bin
*.vshost.*
*.pdb
*.vs10x
*.user

0
CREDITS.txt Normal file
View file

27
LICENSE.txt Normal file
View file

@ -0,0 +1,27 @@
Copyright (c) 2011, Outercurve Foundation.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
- Neither the name of the Outercurve Foundation nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,64 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>WebsitePanel Hyper-V Utils - Readme</title>
</head>
<body>
<h1>
WebsitePanel Hyper-V Utils - Readme</h1>
<p>
WebsitePanel Hyper-V Utils is a simple command-line utility to perform the
following operations:</p>
<ul>
<li>Mount VHD</li>
<li>Unmount VHD</li>
</ul>
<h2>
License</h2>
<p>
WebsitePanel Hyper-V Utils is released under BSD license. Please see LICENSE.txt file in the
root folder of this project.</p>
<h2>
Project Structure</h2>
<p>
The project has the following folders structure:</p>
<ul>
<li><strong>\Trunk</strong> - project version currently in development<ul>
<li><strong>\Sources</strong> - project source codes. Each solution project is
placed in its own sub-folder. All solution files are placed in the root of this
folder.<ul>
<li>Solution1.sln</li>
<li>Solution2.sln</li>
<li>ProjectName.build - MS Build file for the entire project</li>
</ul>
</li>
<li><strong>\Lib</strong> - all referenced 3rd-party assemblies required to build
the solution are placed in this folder.</li>
<li><strong>\Docs</strong> - project documentation<ul>
<li><strong>\Developer</strong> - technical documentation (specs, diagrams, POCs,
etc.) for developers working on the project</li>
<li><strong>\User</strong> - user-related documentation (user guides, how-tows,
etc.) for end-users using the product</li>
</ul>
</li>
<li><strong>\Build</strong> - optional folder containing solution assemblies that
are referenced from other projects</li>
</ul>
</li>
<li><strong>\Releases</strong> - contains all project releases</li>
<li><strong>\Branches</strong> - contains project branches for proof-of-concepts,
new development, bug fixing, etc.</li>
<li><strong>LICENSE.txt</strong> - project license</li>
<li><strong>Readme.htm</strong> - the file you are reading right now</li>
<li><strong>ReleaseNotes.htm</strong> - project release notes</li>
</ul>
<h2>
Build How-To</h2>
<p>
Open WebsitePanel.HyperV.Utils.sln solution in Visual Studio 2010 and build it.</p>
</body>
</html>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>WebsitePanel Hyper-V Utils - Release Notes</title>
</head>
<body>
<h1>WebsitePanel Hyper-V Utils - Release Notes</h1>
<p>
<strong>March 15, 2011 - v1.2</strong></p>
<ul>
<li>Migrated the project to .NET Framework 4.0.</li>
</ul>
<p>
<strong>April 16, 2010 - v1.0</strong></p>
<ul>
<li>Initial release of WebsitePanel Hyper-V Utils under BSD license.</li>
<li>Added diagnostics messages during VHD mounting.</li>
<li>MountVHD displays index for mounted disk that could be used in DiskPart utility.</li>
<li>MountVHD function now uses VDS.</li>
</ul>
<p>
&nbsp;</p>
</body>
</html>

View file

@ -0,0 +1,20 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.225
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Outercurve Foundation")]
[assembly: AssemblyCopyright("Copyright © 2011 Outercurve Foundation.")]
[assembly: AssemblyVersion("1.2.0.0")]
[assembly: AssemblyFileVersion("1.2.0.34")]
[assembly: AssemblyInformationalVersion("1.2.0")]

View file

@ -0,0 +1,27 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{58249F88-194C-4F6C-872D-94AA37B62E6D}"
ProjectSection(SolutionItems) = preProject
..\..\LICENSE.txt = ..\..\LICENSE.txt
..\..\Readme.htm = ..\..\Readme.htm
..\..\ReleaseNotes.htm = ..\..\ReleaseNotes.htm
VersionInfo.cs = VersionInfo.cs
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.HyperV.Utils", "WebsitePanel.HyperV.Utils\WebsitePanel.HyperV.Utils.csproj", "{824FB237-2208-4BD7-9F61-413DC2A32827}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{824FB237-2208-4BD7-9F61-413DC2A32827}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{824FB237-2208-4BD7-9F61-413DC2A32827}.Debug|Any CPU.Build.0 = Debug|Any CPU
{824FB237-2208-4BD7-9F61-413DC2A32827}.Release|Any CPU.ActiveCfg = Release|Any CPU
{824FB237-2208-4BD7-9F61-413DC2A32827}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,48 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
namespace WebsitePanel.HyperV.Utils
{
public class ConcreteJob
{
public string Id { get; set; }
public ConcreteJobState JobState { get; set; }
public string Caption { get; set; }
public string Description { get; set; }
public DateTime ElapsedTime { get; set; }
public DateTime StartTime { get; set; }
public int ErrorCode { get; set; }
public string ErrorDescription { get; set; }
public int PercentComplete { get; set; }
}
}

View file

@ -0,0 +1,47 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
namespace WebsitePanel.HyperV.Utils
{
public enum ConcreteJobState
{
New = 2,
Starting = 3,
Running = 4,
Suspended = 5,
ShuttingDown = 6,
Completed = 7,
Terminated = 8,
Killed = 9,
Exception = 10
}
}

View file

@ -0,0 +1,40 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
namespace WebsitePanel.HyperV.Utils
{
public class JobResult
{
public ConcreteJob Job { get; set; }
public ReturnCode ReturnValue { get; set; }
}
}

View file

@ -0,0 +1,445 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Management;
using Vds = Microsoft.Storage.Vds;
using System.Diagnostics;
namespace WebsitePanel.HyperV.Utils
{
class Program
{
// command line parameters
private const string ns = @"root\virtualization";
private static Wmi wmi = null;
private static string computer = null;
private static string command = null;
private static Dictionary<string, string> Parameters = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
static void Main(string[] args)
{
// display welcome screen
DisplayWelcome();
// parse parameters
if (!ParseParameters(args))
{
DisplayUsage();
return;
}
// connect WMI
wmi = new Wmi(computer, ns);
try
{
// run command
if (String.Equals(command, "MountVHD", StringComparison.CurrentCultureIgnoreCase))
MountVHD();
else if (String.Equals(command, "UnmountVHD", StringComparison.CurrentCultureIgnoreCase))
UnmountVHD();
else
{
Console.WriteLine("Unknown command: " + command);
DisplayUsage();
}
}
catch (Exception ex)
{
Console.WriteLine("\nError: " + ex.Message);
if (ex.InnerException != null)
Console.WriteLine("System message: " + ex.InnerException.Message);
}
}
private static void MountVHD()
{
// check parameters
AssertParameter("path");
string vhdPath = Parameters["path"];
ManagementObject objImgSvc = GetImageManagementService();
Console.WriteLine("Mount VHD: " + vhdPath);
// get method params
ManagementBaseObject inParams = objImgSvc.GetMethodParameters("Mount");
inParams["Path"] = vhdPath;
ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("Mount", inParams, null);
JobResult result = CreateJobResultFromWmiMethodResults(outParams);
// load storage job
if (result.ReturnValue != ReturnCode.JobStarted
|| result.Job.JobState == ConcreteJobState.Exception)
{
throw new Exception("Mount job failed to start with the following message: " + result.Job.ErrorDescription);
}
ManagementObject objJob = wmi.GetWmiObject("msvm_StorageJob", "InstanceID = '{0}'", result.Job.Id);
if (JobCompleted(result.Job))
{
// load output data
ManagementObject objImage = wmi.GetRelatedWmiObject(objJob, "Msvm_MountedStorageImage");
int pathId = Convert.ToInt32(objImage["PathId"]);
int portNumber = Convert.ToInt32(objImage["PortNumber"]);
int targetId = Convert.ToInt32(objImage["TargetId"]);
int lun = Convert.ToInt32(objImage["Lun"]);
string diskAddress = String.Format("Port{0}Path{1}Target{2}Lun{3}", portNumber, pathId, targetId, lun);
// find mounted disk using VDS
Vds.Advanced.AdvancedDisk advancedDisk = null;
Vds.Pack diskPack = null;
// first attempt
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Querying mounted disk...");
FindVdsDisk(diskAddress, out advancedDisk, out diskPack);
// second attempt
if (advancedDisk == null)
{
System.Threading.Thread.Sleep(20000);
Console.WriteLine("Querying mounted disk - second attempt...");
FindVdsDisk(diskAddress, out advancedDisk, out diskPack);
}
if (advancedDisk == null)
throw new Exception("Could not find mounted disk");
List<string> volumes = new List<string>();
Console.WriteLine("Disk flags: " + advancedDisk.Flags);
// clear READONLY
if ((advancedDisk.Flags & Vds.DiskFlags.ReadOnly) == Vds.DiskFlags.ReadOnly)
{
Console.Write("Clearing disk Read-Only flag...");
advancedDisk.ClearFlags(Vds.DiskFlags.ReadOnly);
while ((advancedDisk.Flags & Vds.DiskFlags.ReadOnly) == Vds.DiskFlags.ReadOnly)
{
System.Threading.Thread.Sleep(100);
advancedDisk.Refresh();
}
Console.WriteLine("Done");
}
// bring disk ONLINE
if (advancedDisk.Status == Vds.DiskStatus.Offline)
{
Console.Write("Bringing disk online...");
advancedDisk.Online();
while (advancedDisk.Status == Vds.DiskStatus.Offline)
{
System.Threading.Thread.Sleep(100);
advancedDisk.Refresh();
}
Console.WriteLine("Done");
}
// determine disk index for DiskPart
Wmi cimv2 = new Wmi(computer, "root\\CIMV2");
ManagementObject objDisk = cimv2.GetWmiObject("win32_diskdrive",
"Model='Msft Virtual Disk SCSI Disk Device' and ScsiTargetID={0} and ScsiLogicalUnit={1} and scsiPort={2}",
targetId, lun, portNumber);
if (objDisk != null)
{
Console.WriteLine("DiskPart disk index: " + Convert.ToInt32(objDisk["Index"]));
}
// find volume
diskPack.Refresh();
foreach (Vds.Volume volume in diskPack.Volumes)
{
volumes.Add(volume.DriveLetter.ToString());
}
if (volumes.Count == 0 && objDisk != null)
{
// find volumes using WMI
foreach (ManagementObject objPartition in objDisk.GetRelated("Win32_DiskPartition"))
{
foreach (ManagementObject objVolume in objPartition.GetRelated("Win32_LogicalDisk"))
{
volumes.Add(objVolume["Name"].ToString().TrimEnd(':'));
}
}
}
foreach (string volume in volumes)
{
Console.WriteLine("Volume found: " + volume);
}
//// find disk index
//Wmi win32 = new Wmi(computer, @"root\cimv2");
//System.Threading.Thread.Sleep(1000); // small pause
//ManagementObject objDisk = win32.GetWmiObject("win32_DiskDrive",
// "Model='Msft Virtual Disk SCSI Disk Device' and ScsiTargetID={0} and ScsiLogicalUnit={1} and ScsiPort={2}",
// targetId, lun, portNumber);
//int diskIndex = Convert.ToInt32(objDisk["Index"]);
Console.WriteLine("\nDisk has been mounted.\n");
//Console.WriteLine("Disk index: " + advancedDisk.);
}
}
private static void FindVdsDisk(string diskAddress, out Vds.Advanced.AdvancedDisk advancedDisk, out Vds.Pack diskPack)
{
advancedDisk = null;
diskPack = null;
Vds.ServiceLoader serviceLoader = new Vds.ServiceLoader();
Vds.Service vds = serviceLoader.LoadService(computer);
vds.WaitForServiceReady();
foreach (Vds.Disk disk in vds.UnallocatedDisks)
{
if (disk.DiskAddress == diskAddress)
{
advancedDisk = (Vds.Advanced.AdvancedDisk)disk;
break;
}
}
if (advancedDisk == null)
{
vds.HardwareProvider = false;
vds.SoftwareProvider = true;
foreach (Vds.SoftwareProvider provider in vds.Providers)
foreach (Vds.Pack pack in provider.Packs)
foreach (Vds.Disk disk in pack.Disks)
if (disk.DiskAddress == diskAddress)
{
diskPack = pack;
advancedDisk = (Vds.Advanced.AdvancedDisk)disk;
break;
}
}
}
private static void UnmountVHD()
{
// check parameters
AssertParameter("path");
string vhdPath = Parameters["path"];
Console.WriteLine("Unmount VHD: " + vhdPath);
ManagementObject objImgSvc = GetImageManagementService();
// get method params
ManagementBaseObject inParams = objImgSvc.GetMethodParameters("Unmount");
inParams["Path"] = vhdPath;
ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("Unmount", inParams, null);
ReturnCode result = (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]);
if (result != ReturnCode.OK)
{
throw new Exception("Unmount task failed with the \"" + result + "\" code");
}
Console.WriteLine("\nDisk has been unmounted.");
}
#region Jobs
private static bool JobCompleted(ConcreteJob job)
{
bool jobCompleted = true;
while (job.JobState == ConcreteJobState.Starting ||
job.JobState == ConcreteJobState.Running)
{
System.Threading.Thread.Sleep(200);
job = GetJob(job.Id);
}
if (job.JobState != ConcreteJobState.Completed)
{
jobCompleted = false;
}
return jobCompleted;
}
public static ConcreteJob GetJob(string jobId)
{
ManagementObject objJob = GetJobWmiObject(jobId);
return CreateJobFromWmiObject(objJob);
}
private static ConcreteJob CreateJobFromWmiMethodResults(ManagementBaseObject outParams)
{
ManagementBaseObject objJob = wmi.GetWmiObjectByPath((string)outParams["Job"]);
if (objJob == null || objJob.Properties.Count == 0)
return null;
return CreateJobFromWmiObject(objJob);
}
private static JobResult CreateJobResultFromWmiMethodResults(ManagementBaseObject outParams)
{
JobResult result = new JobResult();
// return value
result.ReturnValue = (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]);
// job
ManagementBaseObject objJob = wmi.GetWmiObjectByPath((string)outParams["Job"]);
if (objJob != null && objJob.Properties.Count > 0)
{
result.Job = CreateJobFromWmiObject(objJob);
}
return result;
}
private static ManagementObject GetJobWmiObject(string id)
{
return wmi.GetWmiObject("CIM_ConcreteJob", "InstanceID = '{0}'", id);
}
private static ConcreteJob CreateJobFromWmiObject(ManagementBaseObject objJob)
{
if (objJob == null || objJob.Properties.Count == 0)
return null;
ConcreteJob job = new ConcreteJob();
job.Id = (string)objJob["InstanceID"];
job.JobState = (ConcreteJobState)Convert.ToInt32(objJob["JobState"]);
job.Caption = (string)objJob["Caption"];
job.Description = (string)objJob["Description"];
job.ElapsedTime = wmi.ToDateTime((string)objJob["ElapsedTime"]);
job.StartTime = wmi.ToDateTime((string)objJob["StartTime"]);
job.ErrorCode = Convert.ToInt32(objJob["ErrorCode"]);
job.ErrorDescription = (string)objJob["ErrorDescription"];
job.PercentComplete = Convert.ToInt32(objJob["PercentComplete"]);
return job;
}
#endregion
#region Managers
private static ManagementObject GetVirtualSystemManagementService()
{
return wmi.GetWmiObject("msvm_VirtualSystemManagementService");
}
private static ManagementObject GetVirtualSwitchManagementService()
{
return wmi.GetWmiObject("msvm_VirtualSwitchManagementService");
}
private static ManagementObject GetImageManagementService()
{
return wmi.GetWmiObject("msvm_ImageManagementService");
}
#endregion
private static void DisplayWelcome()
{
string ver = Assembly.GetExecutingAssembly().GetName().Version.ToString(2);
Console.WriteLine("VmUtils - utility to work with Hyper-V virtual resources. Version " + ver);
Console.WriteLine("Copyright (C) 2011 by Outercurve Foundation. All rights reserved.\n");
}
private static bool ParseParameters(string[] args)
{
if (args == null || args.Length == 0)
return false;
// command
command = args[0];
for (int i = 1; i < args.Length; i++)
{
if (!args[i].StartsWith("-"))
return false; // wrong parameter format
string name = args[i].Substring(1);
if (i == (args.Length - 1))
return false; // no parameter value
string val = args[i + 1];
i++;
// add parameter to the hash
Parameters.Add(name, val);
if (String.Equals(name, "computer", StringComparison.CurrentCultureIgnoreCase))
computer = val;
}
return true;
}
private static void AssertParameter(string name)
{
if (!Parameters.ContainsKey(name))
{
throw new Exception(String.Format("Command \"{0}\" expect \"{1}\" parameter which was not supplied.", command, name));
}
}
private static void DisplayUsage()
{
Console.WriteLine("\nUSAGE:");
Console.WriteLine(" vmutils <command> [-parameter1 value1 -parameter2 value2 ...]\n");
Console.WriteLine("EXAMPLE:");
Console.WriteLine(" vmtuils MountVHD -path \"c:\\templates\\Windows 2008.vhd\" -computer HYPERV01\n");
Console.WriteLine("SUPPORTED COMMANDS:");
Console.WriteLine(" MountVHD - mounts VHD.");
Console.WriteLine(" Parameters:");
Console.WriteLine(" -path - path to VHD file.");
Console.WriteLine(" -computer - (optional) remote computer with Hyper-V role installed.");
Console.WriteLine("");
Console.WriteLine(" UnmountVHD - unmounts VHD.");
Console.WriteLine(" Parameters:");
Console.WriteLine(" -path - path to VHD file.");
Console.WriteLine(" -computer - (optional) remote computer with Hyper-V role installed.");
}
}
}

View file

@ -0,0 +1,21 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Hyper-V Utilities")]
[assembly: AssemblyDescription("Utility to work with Hyper-V virtual resources.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("VmUtils")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c72a836b-0d6e-482f-afba-8c03964d9933")]

View file

@ -0,0 +1,51 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
namespace WebsitePanel.HyperV.Utils
{
public enum ReturnCode
{
OK = 0,
JobStarted = 4096,
Failed = 32768,
AccessDenied = 32769,
NotSupported = 32770,
Unknown = 32771,
Timeout = 32772,
InvalidParameter = 32773,
SystemIsInUse = 32774,
InvalidStateForThisOperation = 32775,
IncorrectDataType = 32776,
SystemIsNotAvailable = 32777,
OutOfMemory = 32778
}
}

View file

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{824FB237-2208-4BD7-9F61-413DC2A32827}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WebsitePanel.HyperV.Utils</RootNamespace>
<AssemblyName>WebsitePanel.HyperV.Utils</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<StartupObject>WebsitePanel.HyperV.Utils.Program</StartupObject>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation />
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Storage.Vds, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\Microsoft.Storage.Vds.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Management" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\VersionInfo.cs">
<Link>VersionInfo.cs</Link>
</Compile>
<Compile Include="ConcreteJob.cs" />
<Compile Include="ConcreteJobState.cs" />
<Compile Include="JobResult.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ResultCode.cs" />
<Compile Include="Wmi.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</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.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -0,0 +1,306 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
using System.Diagnostics;
namespace WebsitePanel.HyperV.Utils
{
internal class Wmi
{
string nameSpace = null;
string computerName = null;
ManagementScope scope = null;
public Wmi(string nameSpace)
: this(nameSpace, null)
{
}
public Wmi(string computerName, string nameSpace)
{
this.nameSpace = nameSpace;
this.computerName = computerName;
}
internal ManagementObjectCollection ExecuteWmiQuery(string query, params object[] args)
{
if (args != null && args.Length > 0)
query = String.Format(query, args);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(GetScope(),
new ObjectQuery(query));
return searcher.Get();
}
internal ManagementObject GetWmiObject(string className, string filter, params object[] args)
{
ManagementObjectCollection col = GetWmiObjects(className, filter, args);
ManagementObjectCollection.ManagementObjectEnumerator enumerator = col.GetEnumerator();
return enumerator.MoveNext() ? (ManagementObject)enumerator.Current : null;
}
internal ManagementObject GetWmiObject(string className)
{
return GetWmiObject(className, null);
}
internal ManagementObjectCollection GetWmiObjects(string className, string filter, params object[] args)
{
string query = "select * from " + className;
if (!String.IsNullOrEmpty(filter))
query += " where " + filter;
return ExecuteWmiQuery(query, args);
}
internal ManagementObjectCollection GetWmiObjects(string className)
{
return GetWmiObjects(className, null);
}
internal ManagementObject GetWmiObjectByPath(string path)
{
return new ManagementObject(GetScope(), new ManagementPath(path), null);
}
internal ManagementClass GetWmiClass(string className)
{
return new ManagementClass(GetScope(), new ManagementPath(className), null);
}
internal ManagementObject GetRelatedWmiObject(ManagementObject obj, string className)
{
ManagementObjectCollection col = obj.GetRelated(className);
ManagementObjectCollection.ManagementObjectEnumerator enumerator = col.GetEnumerator();
enumerator.MoveNext();
return (ManagementObject)enumerator.Current;
}
internal void Dump(ManagementBaseObject obj)
{
#if DEBUG
foreach (PropertyData prop in obj.Properties)
{
string typeName = prop.Value == null ? "null" : prop.Value.GetType().ToString();
Debug.WriteLine(prop.Name + ": " + prop.Value + " (" + typeName + ")");
}
#endif
}
// Converts a given datetime in DMTF format to System.DateTime object.
internal System.DateTime ToDateTime(string dmtfDate)
{
System.DateTime initializer = System.DateTime.MinValue;
int year = initializer.Year;
int month = initializer.Month;
int day = initializer.Day;
int hour = initializer.Hour;
int minute = initializer.Minute;
int second = initializer.Second;
long ticks = 0;
string dmtf = dmtfDate;
System.DateTime datetime = System.DateTime.MinValue;
string tempString = string.Empty;
if (String.IsNullOrEmpty(dmtf))
{
return DateTime.MinValue;
}
else if ((dmtf.Length != 25))
{
throw new System.ArgumentOutOfRangeException();
}
try
{
tempString = dmtf.Substring(0, 4);
if (("****" != tempString))
{
year = int.Parse(tempString);
}
tempString = dmtf.Substring(4, 2);
if (("**" != tempString))
{
month = int.Parse(tempString);
}
tempString = dmtf.Substring(6, 2);
if (("**" != tempString))
{
day = int.Parse(tempString);
}
tempString = dmtf.Substring(8, 2);
if (("**" != tempString))
{
hour = int.Parse(tempString);
}
tempString = dmtf.Substring(10, 2);
if (("**" != tempString))
{
minute = int.Parse(tempString);
}
tempString = dmtf.Substring(12, 2);
if (("**" != tempString))
{
second = int.Parse(tempString);
}
tempString = dmtf.Substring(15, 6);
if (("******" != tempString))
{
ticks = (long.Parse(tempString) * ((long)((System.TimeSpan.TicksPerMillisecond / 1000))));
}
if (((((((((year < 0)
|| (month < 0))
|| (day < 0))
|| (hour < 0))
|| (minute < 0))
|| (minute < 0))
|| (second < 0))
|| (ticks < 0)))
{
throw new System.ArgumentOutOfRangeException();
}
}
catch (System.Exception e)
{
throw new System.ArgumentOutOfRangeException(null, e.Message);
}
if (year == 0
&& month == 0
&& day == 0
&& hour == 0
&& minute == 0
&& second == 0
&& ticks == 0)
return DateTime.MinValue;
datetime = new System.DateTime(year, month, day, hour, minute, second, 0);
datetime = datetime.AddTicks(ticks);
System.TimeSpan tickOffset = System.TimeZone.CurrentTimeZone.GetUtcOffset(datetime);
int UTCOffset = 0;
int OffsetToBeAdjusted = 0;
long OffsetMins = ((long)((tickOffset.Ticks / System.TimeSpan.TicksPerMinute)));
tempString = dmtf.Substring(22, 3);
if ((tempString != "******"))
{
tempString = dmtf.Substring(21, 4);
try
{
UTCOffset = int.Parse(tempString);
}
catch (System.Exception e)
{
throw new System.ArgumentOutOfRangeException(null, e.Message);
}
OffsetToBeAdjusted = ((int)((OffsetMins - UTCOffset)));
datetime = datetime.AddMinutes(((double)(OffsetToBeAdjusted)));
}
return datetime;
}
// Converts a given System.DateTime object to DMTF datetime format.
internal string ToDmtfDateTime(System.DateTime date)
{
string utcString = string.Empty;
System.TimeSpan tickOffset = System.TimeZone.CurrentTimeZone.GetUtcOffset(date);
long OffsetMins = ((long)((tickOffset.Ticks / System.TimeSpan.TicksPerMinute)));
if ((System.Math.Abs(OffsetMins) > 999))
{
date = date.ToUniversalTime();
utcString = "+000";
}
else
{
if ((tickOffset.Ticks >= 0))
{
utcString = string.Concat("+", ((System.Int64)((tickOffset.Ticks / System.TimeSpan.TicksPerMinute))).ToString().PadLeft(3, '0'));
}
else
{
string strTemp = ((System.Int64)(OffsetMins)).ToString();
utcString = string.Concat("-", strTemp.Substring(1, (strTemp.Length - 1)).PadLeft(3, '0'));
}
}
string dmtfDateTime = ((System.Int32)(date.Year)).ToString().PadLeft(4, '0');
dmtfDateTime = string.Concat(dmtfDateTime, ((System.Int32)(date.Month)).ToString().PadLeft(2, '0'));
dmtfDateTime = string.Concat(dmtfDateTime, ((System.Int32)(date.Day)).ToString().PadLeft(2, '0'));
dmtfDateTime = string.Concat(dmtfDateTime, ((System.Int32)(date.Hour)).ToString().PadLeft(2, '0'));
dmtfDateTime = string.Concat(dmtfDateTime, ((System.Int32)(date.Minute)).ToString().PadLeft(2, '0'));
dmtfDateTime = string.Concat(dmtfDateTime, ((System.Int32)(date.Second)).ToString().PadLeft(2, '0'));
dmtfDateTime = string.Concat(dmtfDateTime, ".");
System.DateTime dtTemp = new System.DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, 0);
long microsec = ((long)((((date.Ticks - dtTemp.Ticks)
* 1000)
/ System.TimeSpan.TicksPerMillisecond)));
string strMicrosec = ((System.Int64)(microsec)).ToString();
if ((strMicrosec.Length > 6))
{
strMicrosec = strMicrosec.Substring(0, 6);
}
dmtfDateTime = string.Concat(dmtfDateTime, strMicrosec.PadLeft(6, '0'));
dmtfDateTime = string.Concat(dmtfDateTime, utcString);
return dmtfDateTime;
}
public ManagementScope GetScope()
{
if (scope != null)
return scope;
// create new scope
if (String.IsNullOrEmpty(computerName))
{
// local
scope = new ManagementScope(nameSpace);
}
else
{
// remote
ConnectionOptions options = new ConnectionOptions();
string path = String.Format(@"\\{0}\{1}", computerName, nameSpace);
scope = new ManagementScope(path, options);
}
// connect
try
{
scope.Connect();
}
catch (Exception ex)
{
string computer = "";
if (!String.IsNullOrEmpty(computerName))
computer = " on computer \"" + computerName + "\"";
throw new Exception("Hyper-V service could not be connected" + computer, ex);
}
return scope;
}
}
}

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,45 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>WebsitePanel Installer - Readme</title>
</head>
<body>
<h1>
WebsitePanel Installer - Readme</h1>
<p>
WebsitePanel Installer is a Windows-based application to install and update WebsitePanel
components.</p>
<h2>
License</h2>
<p>
WebsitePanel Installer is released under BSD license. Please see LICENSE.txt file
in the root folder of this project.</p>
<h2>
Project Structure</h2>
<p>
The project has the following folders structure:</p>
<ul>
<li><strong>\Trunk</strong> - project version currently in development<ul>
<li><strong>\Sources</strong> - project source codes.</li>
<li><strong>\Lib</strong> - all referenced 3rd-party assemblies required to build the
solution are placed in this folder.</li>
<li><strong>\Docs</strong> - project documentation</li>
</ul>
</li>
<ul>
<li><strong>\Build</strong> - optional folder containing solution assemblies that are
referenced from other projects</li>
</ul>
<li><strong>\Releases</strong> - contains all project releases</li>
<li><strong>\Branches</strong> - contains project branches for proof-of-concepts, new
development, bug fixing, etc.</li>
<li><strong>LICENSE.txt</strong> - project license</li>
<li><strong>Readme.htm</strong> - the file you are reading right now</li>
<li><strong>ReleaseNotes.htm</strong> - project release notes</li>
</ul>
<h2>
Build How-To</h2>
<p>
Open WebsitePanel.Installer.sln solution in Visual Studio 2010 and build it.</p>
</body>
</html>

View file

@ -0,0 +1,20 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>WebsitePanel Installer - Release Notes</title>
</head>
<body>
<h1>
WebsitePanel Installer - Release Notes</h1>
<p>
<strong>March 15, 2011 - v1.2</strong></p>
<ul>
<li>Migrated project to .NET Framework 4.0</li>
</ul>
<p>
<strong>April 16, 2010 - v1.0</strong></p>
<ul>
<li>Initial release of WebsitePanel Installer under BSD license.</li>
</ul>
</body>
</html>

View file

@ -0,0 +1,10 @@
@ECHO OFF
set basedir=
IF %1.==. GOTO NoArg
set basedir=%1
:NoArg
set sourcedir=%basedir%WebsitePanel.Updater\bin
set targetdir=%basedir%WebsitePanel.Installer
"%basedir%ILMerge.exe" "%sourcedir%\WebsitePanel.Updater.exe" "%sourcedir%\..\Lib\Ionic.Zip.Reduced.dll" /out:%targetdir%\Updater.exe
del %targetdir%\Updater.pdb

View file

@ -0,0 +1,6 @@
@ECHO OFF
fciv.exe "..\Build\debug\WebsitePanelInstaller11.msi" -sha1 > "..\Build\debug\SHA1.log"
fciv.exe "..\Build\release\WebsitePanelInstaller11.msi" -sha1 > "..\Build\release\SHA1.log"
PAUSE

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
[DEFAULT]
BASEURL=http://help.websitepanel.net/
[InternetShortcut]
URL=http://help.websitepanel.net/
IDList=
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2

View file

@ -0,0 +1,9 @@
[DEFAULT]
BASEURL=http://www.websitepanel.net/
[InternetShortcut]
URL=http://www.websitepanel.net/
IDList=
IconFile=http://www.websitepanel.net/__utility/img/favicon.ico
IconIndex=1
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2

View file

@ -0,0 +1,41 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System.Reflection;
// Release information for an assembly consists of the following four values:
//
// Major Release
// Minor Release
// Build Number
// Revision
//
[assembly: AssemblyCompany("Outercurve Foundation")]
[assembly: AssemblyCopyright("Copyright © 2011 Outercurve Foundation.")]
[assembly: AssemblyVersion("1.2.0.0")]
[assembly: AssemblyFileVersion("1.2.0.38")]
[assembly: AssemblyInformationalVersion("1.2.0")]

View file

@ -0,0 +1,107 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using WebsitePanel.Installer.Common;
using System.Configuration;
using WebsitePanel.Installer.Configuration;
using System.IO;
using System.Reflection;
namespace WebsitePanel.Installer.Core
{
public sealed class AppConfigManager
{
private static System.Configuration.Configuration appConfig;
public const string AppConfigFileNameWithoutExtension = "WebsitePanel.Installer.exe";
static AppConfigManager()
{
LoadConfiguration();
}
#region Core.Configuration
/// <summary>
/// Loads application configuration
/// </summary>
public static void LoadConfiguration()
{
Log.WriteStart("Loading application configuration");
//
var exePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppConfigFileNameWithoutExtension);
//
appConfig = ConfigurationManager.OpenExeConfiguration(exePath);
//
Log.WriteEnd("Application configuration loaded");
}
/// <summary>
/// Returns application configuration section
/// </summary>
public static InstallerSection AppConfiguration
{
get
{
return appConfig.GetSection("installer") as InstallerSection;
}
}
/// <summary>
/// Saves application configuration
/// </summary>
public static void SaveConfiguration(bool showAlert)
{
if (appConfig != null)
{
try
{
Log.WriteStart("Saving application configuration");
appConfig.Save();
Log.WriteEnd("Application configuration saved");
if (showAlert)
{
//ShowInfo("Application settings updated successfully.");
}
}
catch (Exception ex)
{
Log.WriteError("Core.Configuration error", ex);
if (showAlert)
{
//ShowError(ex);
}
}
}
}
#endregion
}
}

View file

@ -0,0 +1,100 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Security.Policy;
using System.Diagnostics;
using System.Reflection;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Lifetime;
namespace WebsitePanel.Installer.Common
{
[Serializable]
public class AssemblyLoader : MarshalByRefObject
{
public object RemoteRun(string fileName, string typeName, string methodName, object[] parameters)
{
Assembly assembly = Assembly.LoadFrom(fileName);
Type type = assembly.GetType(typeName);
MethodInfo method = type.GetMethod(methodName);
return method.Invoke(Activator.CreateInstance(type), parameters);
}
public void AddTraceListener(TraceListener traceListener)
{
Trace.Listeners.Add(traceListener);
}
public static object Execute(string fileName, string typeName, string methodName, object[] parameters)
{
AppDomain domain = null;
try
{
Evidence securityInfo = AppDomain.CurrentDomain.Evidence;
AppDomainSetup info = new AppDomainSetup();
info.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
domain = AppDomain.CreateDomain("Remote Domain", securityInfo, info);
domain.InitializeLifetimeService();
domain.UnhandledException += new UnhandledExceptionEventHandler(OnDomainUnhandledException);
AssemblyLoader loader = (AssemblyLoader)domain.CreateInstanceAndUnwrap(
typeof(AssemblyLoader).Assembly.FullName,
typeof(AssemblyLoader).FullName);
foreach (TraceListener listener in Trace.Listeners)
{
loader.AddTraceListener(listener);
}
object ret = loader.RemoteRun(fileName, typeName, methodName, parameters);
AppDomain.Unload(domain);
return ret;
}
catch (Exception)
{
if (domain != null)
{
AppDomain.Unload(domain);
}
throw;
}
}
static void OnDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Log.WriteError("Remote domain error", (Exception)e.ExceptionObject);
}
public static string GetShellVersion()
{
return Assembly.GetEntryAssembly().GetName().Version.ToString();
}
}
}

View file

@ -0,0 +1,271 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace WebsitePanel.Installer.Common
{
/// <summary>
/// File utils.
/// </summary>
public sealed class FileUtils
{
/// <summary>
/// Initializes a new instance of the class.
/// </summary>
private FileUtils()
{
}
/// <summary>
/// Creates drectory with the specified directory.
/// </summary>
/// <param name="path">The directory path to create.</param>
public static void CreateDirectory(string path)
{
string dir = Path.GetDirectoryName(path);
if(!Directory.Exists(dir))
{
// create directory structure
Directory.CreateDirectory(dir);
}
}
/// <summary>
/// Saves file content.
/// </summary>
/// <param name="fileName">File name.</param>
/// <param name="content">The array of bytes to write.</param>
public static void SaveFileContent(string fileName, byte[] content)
{
FileStream stream = new FileStream(fileName, FileMode.Create);
stream.Write(content, 0, content.Length);
stream.Close();
}
/// <summary>
/// Saves file content.
/// </summary>
/// <param name="fileName">File name.</param>
/// <param name="content">The array of bytes to write.</param>
public static void AppendFileContent(string fileName, byte[] content)
{
FileStream stream = new FileStream(fileName, FileMode.Append, FileAccess.Write);
stream.Write(content, 0, content.Length);
stream.Close();
}
/// <summary>
/// Deletes the specified file.
/// </summary>
/// <param name="fileName">The name of the file to be deleted.</param>
public static void DeleteFile(string fileName)
{
int attempts = 0;
while (true)
{
try
{
DeleteFileInternal(fileName);
break;
}
catch (Exception)
{
if (attempts > 2)
throw;
attempts++;
System.Threading.Thread.Sleep(1000);
}
}
}
/// <summary>
/// Deletes the specified file.
/// </summary>
/// <param name="fileName">The name of the file to be deleted.</param>
private static void DeleteReadOnlyFile(string fileName)
{
FileInfo info = new FileInfo(fileName);
info.Attributes = FileAttributes.Normal;
info.Delete();
}
/// <summary>
/// Deletes the specified file.
/// </summary>
/// <param name="fileName">The name of the file to be deleted.</param>
private static void DeleteFileInternal(string fileName)
{
try
{
File.Delete(fileName);
}
catch (UnauthorizedAccessException)
{
DeleteReadOnlyFile(fileName);
}
}
/// <summary>
/// Deletes the specified directory.
/// </summary>
/// <param name="directory">The name of the directory to be deleted.</param>
public static void DeleteDirectory(string directory)
{
if (!Directory.Exists(directory))
return;
// iterate through child folders
string[] dirs = Directory.GetDirectories(directory);
foreach (string dir in dirs)
{
DeleteDirectory(dir);
}
// iterate through child files
string[] files = Directory.GetFiles(directory);
foreach (string file in files)
{
DeleteFile(file);
}
//try to delete dir for 3 times
int attempts = 0;
while (true)
{
try
{
DeleteDirectoryInternal(directory);
break;
}
catch (Exception)
{
if (attempts > 2)
throw;
attempts++;
System.Threading.Thread.Sleep(1000);
}
}
}
/// <summary>
/// Deletes the specified directory.
/// </summary>
/// <param name="directory">The name of the directory to be deleted.</param>
private static void DeleteDirectoryInternal(string directory)
{
try
{
Directory.Delete(directory);
}
catch (IOException)
{
DeleteReadOnlyDirectory(directory);
}
}
/// <summary>
/// Deletes the specified directory.
/// </summary>
/// <param name="directory">The name of the directory to be deleted.</param>
private static void DeleteReadOnlyDirectory(string directory)
{
DirectoryInfo info = new DirectoryInfo(directory);
info.Attributes = FileAttributes.Normal;
info.Delete();
}
/// <summary>
/// Determines whether the specified file exists.
/// </summary>
/// <param name="fileName">The path to check.</param>
/// <returns></returns>
public static bool FileExists(string fileName)
{
return File.Exists(fileName);
}
/// <summary>
/// Determines whether the given path refers to an existing directory on disk.
/// </summary>
/// <param name="path">The path to test.</param>
/// <returns></returns>
public static bool DirectoryExists(string path)
{
return Directory.Exists(path);
}
/// <summary>
/// Returns current application path.
/// </summary>
/// <returns>Curent application path.</returns>
public static string GetCurrentDirectory()
{
return AppDomain.CurrentDomain.BaseDirectory;
}
/// <summary>
/// Returns application temp directory.
/// </summary>
/// <returns>Application temp directory.</returns>
public static string GetTempDirectory()
{
return Path.Combine(GetCurrentDirectory(), "Tmp");
}
/// <summary>
/// Returns application data directory.
/// </summary>
/// <returns>Application data directory.</returns>
public static string GetDataDirectory()
{
return Path.Combine(GetCurrentDirectory(), "Data");
}
/// <summary>
/// Deletes application temp directory.
/// </summary>
public static void DeleteTempDirectory()
{
try
{
DeleteDirectory(GetTempDirectory());
}
catch (Exception ex)
{
Log.WriteError("IO Error", ex);
}
}
}
}

View file

@ -0,0 +1,250 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.EnterpriseServices;
namespace WebsitePanel.Installer.Common
{
public class Global
{
public const string VisualInstallerShell = "VisualInstallerShell";
public const string SilentInstallerShell = "SilentInstallerShell";
public const string DefaultInstallPathRoot = @"C:\WebsitePanel";
public const string LoopbackIPv4 = "127.0.0.1";
public const string InstallerProductCode = "cfg core";
public abstract class Parameters
{
public const string ComponentId = "ComponentId";
public const string EnterpriseServerUrl = "EnterpriseServerUrl";
public const string ShellMode = "ShellMode";
public const string ShellVersion = "ShellVersion";
public const string IISVersion = "IISVersion";
public const string BaseDirectory = "BaseDirectory";
public const string Installer = "Installer";
public const string InstallerType = "InstallerType";
public const string InstallerPath = "InstallerPath";
public const string InstallerFolder = "InstallerFolder";
public const string Version = "Version";
public const string ComponentDescription = "ComponentDescription";
public const string ComponentCode = "ComponentCode";
public const string ApplicationName = "ApplicationName";
public const string ComponentName = "ComponentName";
public const string WebSiteIP = "WebSiteIP";
public const string WebSitePort = "WebSitePort";
public const string WebSiteDomain = "WebSiteDomain";
public const string ServerPassword = "ServerPassword";
public const string UserDomain = "UserDomain";
public const string UserAccount = "UserAccount";
public const string UserPassword = "UserPassword";
public const string CryptoKey = "CryptoKey";
public const string ServerAdminPassword = "ServerAdminPassword";
public const string SetupXml = "SetupXml";
public const string ParentForm = "ParentForm";
public const string Component = "Component";
public const string FullFilePath = "FullFilePath";
public const string DatabaseServer = "DatabaseServer";
public const string DbServerAdmin = "DbServerAdmin";
public const string DbServerAdminPassword = "DbServerAdminPassword";
public const string DatabaseName = "DatabaseName";
public const string ConnectionString = "ConnectionString";
public const string InstallConnectionString = "InstallConnectionString";
public const string Release = "Release";
}
public abstract class Messages
{
public const string NotEnoughPermissionsError = "You do not have the appropriate permissions to perform this operation. Make sure you are running the application from the local disk and you have local system administrator privileges.";
public const string InstallerVersionIsObsolete = "WebsitePanel Installer {0} or higher required.";
public const string ComponentIsAlreadyInstalled = "Component or its part is already installed.";
public const string AnotherInstanceIsRunning = "Another instance of the installation process is already running.";
public const string NoInputParametersSpecified = "No input parameters specified";
public const int InstallationError = -1000;
public const int UnknownComponentCodeError = -999;
public const int SuccessInstallation = 0;
public const int AnotherInstanceIsRunningError = -998;
public const int NotEnoughPermissionsErrorCode = -997;
public const int NoInputParametersSpecifiedError = -996;
public const int ComponentIsAlreadyInstalledError = -995;
}
public abstract class Server
{
public abstract class CLI
{
public const string ServerPassword = "passw";
};
public const string ComponentName = "Server";
public const string ComponentCode = "server";
public const string ComponentDescription = "WebsitePanel Server is a set of services running on the remote server to be controlled. Server application should be reachable from Enterprise Server one.";
public const string ServiceAccount = "WPServer";
public const string DefaultPort = "9003";
public const string DefaultIP = "127.0.0.1";
public const string SetupController = "Server";
}
public abstract class StandaloneServer
{
public const string SetupController = "StandaloneServerSetup";
public const string ComponentCode = "standalone";
public const string ComponentName = "Standalone Server Setup";
}
public abstract class WebPortal
{
public const string ComponentName = "Portal";
public const string ComponentDescription = "WebsitePanel Portal is a control panel itself with user interface which allows managing user accounts, hosting spaces, web sites, FTP accounts, files, etc.";
public const string ServiceAccount = "WPPortal";
public const string DefaultPort = "9001";
public const string DefaultIP = "";
public const string DefaultEntServURL = "http://127.0.0.1:9002";
public const string ComponentCode = "portal";
public const string SetupController = "Portal";
public static string[] ServiceUserMembership
{
get
{
if (IISVersion.Major == 7)
{
return new string[] { "IIS_IUSRS" };
}
//
return new string[] { "IIS_WPG" };
}
}
public abstract class CLI
{
public const string EnterpriseServerUrl = "esurl";
}
}
public abstract class EntServer
{
public const string ComponentName = "Enterprise Server";
public const string ComponentDescription = "Enterprise Server is the heart of WebsitePanel system. It includes all business logic of the application. Enterprise Server should have access to Server and be accessible from Portal applications.";
public const string ServiceAccount = "WPEnterpriseServer";
public const string DefaultPort = "9002";
public const string DefaultIP = "127.0.0.1";
public const string DefaultDbServer = @"localhost\sqlexpress";
public const string DefaultDatabase = "WebsitePanel";
public const string AspNetConnectionStringFormat = "server={0};database={1};uid={2};pwd={3};";
public const string ComponentCode = "enterprise server";
public const string SetupController = "EnterpriseServer";
public static string[] ServiceUserMembership
{
get
{
if (IISVersion.Major == 7)
{
return new string[] { "IIS_IUSRS" };
}
//
return new string[] { "IIS_WPG" };
}
}
public abstract class CLI
{
public const string ServeradminPassword = "passw";
public const string DatabaseName = "dbname";
public const string DatabaseServer = "dbserver";
public const string DbServerAdmin = "dbadmin";
public const string DbServerAdminPassword = "dbapassw";
}
}
public abstract class CLI
{
public const string WebSiteIP = "webip";
public const string ServiceAccountPassword = "upassw";
public const string ServiceAccountDomain = "udomaim";
public const string ServiceAccountName = "uname";
public const string WebSitePort = "webport";
public const string WebSiteDomain = "webdom";
}
private Global()
{
}
private static Version iisVersion;
//
public static Version IISVersion
{
get
{
if (iisVersion == null)
{
iisVersion = RegistryUtils.GetIISVersion();
}
//
return iisVersion;
}
}
//
private static OS.WindowsVersion osVersion = OS.WindowsVersion.Unknown;
/// <summary>
/// Represents Setup Control Panel Accounts system settings set (SCPA)
/// </summary>
public class SCPA
{
public const string SettingsKeyName = "EnabledSCPA";
}
public static OS.WindowsVersion OSVersion
{
get
{
if (osVersion == OS.WindowsVersion.Unknown)
{
osVersion = OS.GetVersion();
}
//
return osVersion;
}
}
public static XmlDocument SetupXmlDocument { get; set; }
}
public class SetupEventArgs<T> : EventArgs
{
public T EventData { get; set; }
public string EventMessage { get; set; }
}
}

View file

@ -0,0 +1,245 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using WebsitePanel.Installer.Configuration;
using System.Security.Principal;
using WebsitePanel.Installer.Core;
using System.Reflection;
namespace WebsitePanel.Installer.Common
{
/// <summary>
/// Installer Log.
/// </summary>
public sealed class Log
{
/// <summary>
/// Initializes a new instance of the class.
/// </summary>
private Log()
{
}
/// <summary>
/// Initializes trace listeners.
/// </summary>
static Log()
{
Initialize();
}
static void Initialize()
{
string fileName = LogFile;
//
Trace.Listeners.Clear();
//
FileStream fileLog = new FileStream(fileName, FileMode.Append);
//
TextWriterTraceListener fileListener = new TextWriterTraceListener(fileLog);
fileListener.TraceOutputOptions = TraceOptions.DateTime;
Trace.Listeners.Add(fileListener);
//
Trace.AutoFlush = true;
}
internal static string LogFile
{
get
{
string fileName = "WebsitePanel.Installer.log";
//
if (string.IsNullOrEmpty(fileName))
{
fileName = "Installer.log";
}
// Ensure the path is correct
if (!Path.IsPathRooted(fileName))
{
fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
}
//
return fileName;
}
}
/// <summary>
/// Write error to the log.
/// </summary>
/// <param name="message">Error message.</param>
/// <param name="ex">Exception.</param>
public static void WriteError(string message, Exception ex)
{
try
{
string line = string.Format("[{0:G}] ERROR: {1}", DateTime.Now, message);
Trace.WriteLine(line);
Trace.WriteLine(ex);
}
catch { }
}
/// <summary>
/// Write error to the log.
/// </summary>
/// <param name="message">Error message.</param>
public static void WriteError(string message)
{
try
{
string line = string.Format("[{0:G}] ERROR: {1}", DateTime.Now, message);
Trace.WriteLine(line);
}
catch { }
}
/// <summary>
/// Write to log
/// </summary>
/// <param name="message"></param>
public static void Write(string message)
{
try
{
string line = string.Format("[{0:G}] {1}", DateTime.Now, message);
Trace.Write(line);
}
catch { }
}
/// <summary>
/// Write line to log
/// </summary>
/// <param name="message"></param>
public static void WriteLine(string message)
{
try
{
string line = string.Format("[{0:G}] {1}", DateTime.Now, message);
Trace.WriteLine(line);
}
catch { }
}
/// <summary>
/// Writes formatted informational message into the log
/// </summary>
/// <param name="format"></param>
/// <param name="args"></param>
public static void WriteInfo(string format, params object[] args)
{
WriteInfo(String.Format(format, args));
}
/// <summary>
/// Write info message to log
/// </summary>
/// <param name="message"></param>
public static void WriteInfo(string message)
{
try
{
string line = string.Format("[{0:G}] INFO: {1}", DateTime.Now, message);
Trace.WriteLine(line);
}
catch { }
}
/// <summary>
/// Write start message to log
/// </summary>
/// <param name="message"></param>
public static void WriteStart(string message)
{
try
{
string line = string.Format("[{0:G}] START: {1}", DateTime.Now, message);
Trace.WriteLine(line);
}
catch { }
}
/// <summary>
/// Write end message to log
/// </summary>
/// <param name="message"></param>
public static void WriteEnd(string message)
{
try
{
string line = string.Format("[{0:G}] END: {1}", DateTime.Now, message);
Trace.WriteLine(line);
}
catch { }
}
public static void WriteApplicationStart()
{
try
{
string name = Assembly.GetEntryAssembly().GetName().Name;
string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
string identity = WindowsIdentity.GetCurrent().Name;
string line = string.Format("[{0:G}] {1} {2} Started by {3}", DateTime.Now, name, version, identity);
Trace.WriteLine(line);
}
catch { }
}
public static void WriteApplicationEnd()
{
try
{
string name = Assembly.GetEntryAssembly().GetName().Name;
string line = string.Format("[{0:G}] {1} Ended", DateTime.Now, name);
Trace.WriteLine(line);
}
catch { }
}
/// <summary>
/// Opens notepad to view log file.
/// </summary>
public static void ShowLogFile()
{
try
{
string path = LogFile;
path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path);
Process.Start("notepad.exe", path);
}
catch { }
}
}
}

View file

@ -0,0 +1,386 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace WebsitePanel.Installer.Common
{
public sealed class OS
{
[StructLayout(LayoutKind.Sequential)]
public struct OSVERSIONINFO
{
public Int32 dwOSVersionInfoSize;
public Int32 dwMajorVersion;
public Int32 dwMinorVersion;
public Int32 dwBuildNumber;
public Int32 dwPlatformID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string szCSDVersion;
}
[StructLayout(LayoutKind.Sequential)]
public struct OSVERSIONINFOEX
{
public Int32 dwOSVersionInfoSize;
public Int32 dwMajorVersion;
public Int32 dwMinorVersion;
public Int32 dwBuildNumber;
public Int32 dwPlatformID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string szCSDVersion;
public short wServicePackMajor;
public short wServicePackMinor;
public short wSuiteMask;
public byte wProductType;
public byte wReserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
public Int32 dwOemID;
public Int32 dwPageSize;
public Int32 wProcessorArchitecture;
public Int32 lpMinimumApplicationAddress;
public Int32 lpMaximumApplicationAddress;
public Int32 dwActiveProcessorMask;
public Int32 dwNumberOrfProcessors;
public Int32 dwProcessorType;
public Int32 dwAllocationGranularity;
public Int32 dwReserved;
}
public enum WinSuiteMask : int
{
VER_SUITE_SMALLBUSINESS = 1,
VER_SUITE_ENTERPRISE = 2,
VER_SUITE_BACKOFFICE = 4,
VER_SUITE_COMMUNICATIONS = 8,
VER_SUITE_TERMINAL = 16,
VER_SUITE_SMALLBUSINESS_RESTRICTED = 32,
VER_SUITE_EMBEDDEDNT = 64,
VER_SUITE_DATACENTER = 128,
VER_SUITE_SINGLEUSERTS = 256,
VER_SUITE_PERSONAL = 512,
VER_SUITE_BLADE = 1024,
VER_SUITE_STORAGE_SERVER = 8192,
VER_SUITE_COMPUTE_SERVER = 16384
}
public enum WinPlatform : byte
{
VER_NT_WORKSTATION = 1,
VER_NT_DOMAIN_CONTROLLER = 2,
VER_NT_SERVER = 3
}
public enum OSMajorVersion : byte
{
VER_OS_NT4 = 4,
VER_OS_2K_XP_2K3 = 5,
VER_OS_VISTA_LONGHORN = 6
}
private const Int32 SM_SERVERR2 = 89;
private const Int32 SM_MEDIACENTER = 87;
private const Int32 SM_TABLETPC = 86;
[DllImport("kernel32")]
private static extern int GetSystemInfo(ref SYSTEM_INFO lpSystemInfo);
[DllImport("user32")]
private static extern int GetSystemMetrics(int nIndex);
[DllImport("kernel32", EntryPoint = "GetVersion")]
private static extern int GetVersionAdv(ref OSVERSIONINFO lpVersionInformation);
[DllImport("kernel32")]
private static extern int GetVersionEx(ref OSVERSIONINFOEX lpVersionInformation);
/*public static string GetVersionEx()
{
OSVERSIONINFO osvi = new OSVERSIONINFO();
OSVERSIONINFOEX xosvi = new OSVERSIONINFOEX();
Int32 iRet = 0;
string strDetails = string.Empty;
osvi.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFO));
xosvi.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX));
try
{
iRet = (int)System.Environment.OSVersion.Platform;
if (iRet == 1)
{
iRet = GetVersionAdv(ref osvi);
strDetails = Environment.NewLine + "Version: " + osvi.dwMajorVersion + "." + osvi.dwMinorVersion + "." + osvi.dwBuildNumber + Environment.NewLine + osvi.szCSDVersion;
if (Len(osvi) == 0)
{
return "Windows 95" + strDetails;
}
else if (Len(osvi) == 10)
{
return "Windows 98" + strDetails;
}
else if (Len(osvi) == 9)
{
return "Windows ME" + strDetails;
}
}
else
{
iRet = GetVersionEx(xosvi);
strDetails = Environment.NewLine + "Version: " + xosvi.dwMajorVersion + "." + xosvi.dwMinorVersion + "." + xosvi.dwBuildNumber + Environment.NewLine + xosvi.szCSDVersion + " (" + xosvi.wServicePackMajor + "." + xosvi.wServicePackMinor + ")";
if (xosvi.dwMajorVersion == (byte)OSMajorVersion.VER_OS_NT4)
{
return "Windows NT 4" + strDetails;
}
else if (xosvi.dwMajorVersion == OSMajorVersion.VER_OS_2K_XP_2K3)
{
if (xosvi.dwMinorVersion == 0)
{
if (xosvi.wProductType == WinPlatform.VER_NT_WORKSTATION)
{
return "Windows 2000 Pro" + strDetails;
}
else if (xosvi.wProductType == WinPlatform.VER_NT_SERVER)
{
if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_DATACENTER) == WinSuiteMask.VER_SUITE_DATACENTER)
{
return "Windows 2000 Datacenter Server" + strDetails;
}
else if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_ENTERPRISE) == WinSuiteMask.VER_SUITE_ENTERPRISE)
{
return "Windows 2000 Advanced Server" + strDetails;
}
else if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_SMALLBUSINESS) == WinSuiteMask.VER_SUITE_SMALLBUSINESS)
{
return "Windows 2000 Small Business Server" + strDetails;
}
else
{
return "Windows 2000 Server" + strDetails;
}
}
else if (xosvi.wProductType == WinPlatform.VER_NT_DOMAIN_CONTROLLER)
{
if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_DATACENTER) == WinSuiteMask.VER_SUITE_DATACENTER)
{
return "Windows 2000 Datacenter Server Domain Controller" + strDetails;
}
else if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_ENTERPRISE) == WinSuiteMask.VER_SUITE_ENTERPRISE)
{
return "Windows 2000 Advanced Server Domain Controller" + strDetails;
}
else if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_SMALLBUSINESS) == WinSuiteMask.VER_SUITE_SMALLBUSINESS)
{
return "Windows 2000 Small Business Server Domain Controller" + strDetails;
}
else
{
return "Windows 2000 Server Domain Controller" + strDetails;
}
}
}
else if (xosvi.dwMinorVersion == 1)
{
if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_PERSONAL) == WinSuiteMask.VER_SUITE_PERSONAL)
{
return "Windows XP Home Edition" + strDetails;
}
else
{
return "Windows XP Professional Edition" + strDetails;
}
}
else if (xosvi.dwMinorVersion == 2)
{
if (xosvi.wProductType == WinPlatform.VER_NT_WORKSTATION)
{
return "Windows XP Professional x64 Edition" + strDetails;
}
else if (xosvi.wProductType == WinPlatform.VER_NT_SERVER)
{
if (GetSystemMetrics(SM_SERVERR2) == 1)
{
return "Windows Server 2003 R2" + strDetails;
}
else
{
return "Windows Server 2003" + strDetails;
}
}
else if (xosvi.wProductType == WinPlatform.VER_NT_DOMAIN_CONTROLLER)
{
if (GetSystemMetrics(SM_SERVERR2) == 1)
{
return "Windows Server 2003 R2 Domain Controller" + strDetails;
}
else
{
return "Windows Server 2003 Domain Controller" + strDetails;
}
}
}
}
else if (xosvi.dwMajorVersion == OSMajorVersion.VER_OS_VISTA_LONGHORN)
{
if (xosvi.wProductType == WinPlatform.VER_NT_WORKSTATION)
{
if ((xosvi.wSuiteMask & WinSuiteMask.VER_SUITE_PERSONAL) == WinSuiteMask.VER_SUITE_PERSONAL)
{
return "Windows Vista (Home Premium, Home Basic, or Home Ultimate) Edition";
}
else
{
return "Windows Vista (Enterprize or Business)" + strDetails;
}
}
else
{
return "Windows Server (Longhorn)" + strDetails;
}
}
}
}
catch
{
MessageBox.Show(GetLastError.ToString);
return string.Empty;
}
}*/
public enum WindowsVersion
{
Unknown = 0,
Windows95,
Windows98,
WindowsMe,
WindowsNT351,
WindowsNT4,
Windows2000,
WindowsXP,
WindowsServer2003,
Vista,
WindowsServer2008
}
/// <summary>
/// Determine OS version
/// </summary>
/// <returns></returns>
public static WindowsVersion GetVersion()
{
WindowsVersion ret = WindowsVersion.Unknown;
OSVERSIONINFOEX info = new OSVERSIONINFOEX();
info.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX));
GetVersionEx(ref info);
// Get OperatingSystem information from the system namespace.
System.OperatingSystem osInfo = System.Environment.OSVersion;
// Determine the platform.
switch (osInfo.Platform)
{
// Platform is Windows 95, Windows 98, Windows 98 Second Edition, or Windows Me.
case System.PlatformID.Win32Windows:
switch (osInfo.Version.Minor)
{
case 0:
ret = WindowsVersion.Windows95;
break;
case 10:
ret = WindowsVersion.Windows98;
break;
case 90:
ret = WindowsVersion.WindowsMe;
break;
}
break;
// Platform is Windows NT 3.51, Windows NT 4.0, Windows 2000, or Windows XP.
case System.PlatformID.Win32NT:
switch (osInfo.Version.Major)
{
case 3:
ret = WindowsVersion.WindowsNT351;
break;
case 4:
ret = WindowsVersion.WindowsNT4;
break;
case 5:
switch (osInfo.Version.Minor)
{
case 0:
ret = WindowsVersion.Windows2000;
break;
case 1:
ret = WindowsVersion.WindowsXP;
break;
case 2:
int i = GetSystemMetrics(SM_SERVERR2);
if (i != 0)
{
//Server 2003 R2
ret = WindowsVersion.WindowsServer2003;
}
else
{
if (info.wProductType == (byte)WinPlatform.VER_NT_WORKSTATION)
{
//XP Pro x64
ret = WindowsVersion.WindowsXP;
}
else
{
ret = WindowsVersion.WindowsServer2003;
}
break;
}
break;
}
break;
case 6:
if (info.wProductType == (byte)WinPlatform.VER_NT_WORKSTATION)
ret = WindowsVersion.Vista;
else
ret = WindowsVersion.WindowsServer2008;
break;
}
break;
}
return ret;
}
/// <summary>
/// Returns Windows directory
/// </summary>
/// <returns></returns>
public static string GetWindowsDirectory()
{
return Environment.GetEnvironmentVariable("windir");
}
}
}

View file

@ -0,0 +1,212 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using Microsoft.Win32;
namespace WebsitePanel.Installer.Common
{
/// <summary>
/// Registry helper class.
/// </summary>
public sealed class RegistryUtils
{
/// <summary>
/// Initializes a new instance of the class.
/// </summary>
private RegistryUtils()
{
}
/// <summary>
/// Retrieves the specified value from the subkey.
/// </summary>
/// <param name="subkey">Subkey.</param>
/// <param name="name">Name of value to retrieve.</param>
/// <returns>The data associated with name.</returns>
public static string GetRegistryKeyStringValue(string subkey, string name)
{
string ret = null;
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.OpenSubKey(subkey);
if ( rk != null )
{
ret = (string)rk.GetValue(name, string.Empty);
}
return ret;
}
/// <summary>
/// Retrieves the specified value from the subkey.
/// </summary>
/// <param name="subkey">Subkey.</param>
/// <param name="name">Name of value to retrieve.</param>
/// <returns>The data associated with name.</returns>
public static int GetRegistryKeyInt32Value(string subkey, string name)
{
int ret = 0;
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.OpenSubKey(subkey);
if ( rk != null )
{
ret = (int)rk.GetValue(name, 0);
}
return ret;
}
/// <summary>
/// Retrieves an array of strings that contains all the value names associated with this key.
/// </summary>
/// <param name="subkey">Subkey.</param>
/// <returns>An array of strings that contains the value names for the current key.</returns>
public static string[] GetRegistryKeyValues(string subkey)
{
string[] ret = null;
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.OpenSubKey(subkey);
if (rk != null)
{
ret = rk.GetValueNames();
}
return ret;
}
public static RegistryValueKind GetRegistryKeyValueKind(string subkey, string name)
{
RegistryValueKind ret = RegistryValueKind.Unknown;
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.OpenSubKey(subkey);
if (rk != null)
{
ret = rk.GetValueKind(name);
}
return ret;
}
/// <summary>
/// Retrieves the specified value from the subkey.
/// </summary>
/// <param name="subkey">Subkey.</param>
/// <param name="name">Name of value to retrieve.</param>
/// <returns>The data associated with name.</returns>
public static bool GetRegistryKeyBooleanValue(string subkey, string name)
{
bool ret = false;
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.OpenSubKey(subkey);
if ( rk != null )
{
string strValue = (string)rk.GetValue(name, "False");
ret = Boolean.Parse(strValue);
}
return ret;
}
/// <summary>
/// Deletes a registry subkey and any child subkeys.
/// </summary>
/// <param name="subkey">Subkey to delete.</param>
public static void DeleteRegistryKey(string subkey)
{
RegistryKey root = Registry.LocalMachine;
root.DeleteSubKeyTree(subkey);
}
/// <summary>
/// Sets the specified value to the subkey.
/// </summary>
/// <param name="subkey">Subkey.</param>
/// <param name="name">Name of value to store data in.</param>
/// <param name="value">Data to store. </param>
public static void SetRegistryKeyStringValue(string subkey, string name, string value)
{
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.CreateSubKey(subkey);
if ( rk != null )
{
rk.SetValue(name, value);
}
}
/// <summary>
/// Sets the specified value to the subkey.
/// </summary>
/// <param name="subkey">Subkey.</param>
/// <param name="name">Name of value to store data in.</param>
/// <param name="value">Data to store. </param>
public static void SetRegistryKeyInt32Value(string subkey, string name, int value)
{
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.CreateSubKey(subkey);
if ( rk != null )
{
rk.SetValue(name, value);
}
}
/// <summary>
/// Sets the specified value to the subkey.
/// </summary>
/// <param name="subkey">Subkey.</param>
/// <param name="name">Name of value to store data in.</param>
/// <param name="value">Data to store. </param>
public static void SetRegistryKeyBooleanValue(string subkey, string name, bool value)
{
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.CreateSubKey(subkey);
if ( rk != null )
{
rk.SetValue(name, value);
}
}
/// <summary>
/// Return the list of sub keys for the specified registry key.
/// </summary>
/// <param name="subkey">The name of the registry key</param>
/// <returns>The array of subkey names.</returns>
public static string[] GetRegistrySubKeys(string subkey)
{
string[] ret = new string[0];
RegistryKey root = Registry.LocalMachine;
RegistryKey rk = root.OpenSubKey(subkey);
if (rk != null)
ret = rk.GetSubKeyNames();
return ret;
}
public static Version GetIISVersion()
{
int major = GetRegistryKeyInt32Value("SOFTWARE\\Microsoft\\InetStp", "MajorVersion");
int minor = GetRegistryKeyInt32Value("SOFTWARE\\Microsoft\\InetStp", "MinorVersion");
return new Version(major, minor);
}
}
}

View file

@ -0,0 +1,393 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.Security.Principal;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Threading;
using WebsitePanel.Installer.Core;
using WebsitePanel.Installer.Configuration;
using System.Xml;
namespace WebsitePanel.Installer.Common
{
public class UserDecisionEventArgs : EventArgs
{
public bool Accepted { get; set; }
public string UserMessage { get; set; }
}
public static class Utils
{
public static void FixConfigurationSectionDefinition()
{
var appConfigPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, String.Concat(AppConfigManager.AppConfigFileNameWithoutExtension, ".config"));
//
try
{
var configXmlDoc = new XmlDocument();
//
configXmlDoc.Load(appConfigPath);
//
var sectionDef = configXmlDoc.SelectSingleNode("//configSections/section[@name='installer']");
//
if (sectionDef == null)
{
return;
}
//
var typeDefString = sectionDef.Attributes["type"].Value;
//
if (typeDefString.EndsWith("WebsitePanel.Installer.Core") == false)
{
sectionDef.Attributes["type"].Value = "WebsitePanel.Installer.Configuration.InstallerSection, WebsitePanel.Installer.Core";
//
configXmlDoc.Save(appConfigPath);
}
}
catch (Exception ex)
{
Trace.TraceError("Failed to fix configuration section definition. Exception: {0}", ex);
}
}
#region DB
/// <summary>
/// Converts db value to string
/// </summary>
/// <param name="val">Value</param>
/// <returns>string</returns>
public static string GetDbString(object val)
{
string ret = string.Empty;
if ((val != null) && (val != DBNull.Value))
ret = (string)val;
return ret;
}
/// <summary>
/// Converts db value to short
/// </summary>
/// <param name="val">Value</param>
/// <returns>short</returns>
public static short GetDbShort(object val)
{
short ret = 0;
if ((val != null) && (val != DBNull.Value))
ret = (short)val;
return ret;
}
/// <summary>
/// Converts db value to int
/// </summary>
/// <param name="val">Value</param>
/// <returns>int</returns>
public static int GetDbInt32(object val)
{
int ret = 0;
if ((val != null) && (val != DBNull.Value))
ret = (int)val;
return ret;
}
/// <summary>
/// Converts db value to bool
/// </summary>
/// <param name="val">Value</param>
/// <returns>bool</returns>
public static bool GetDbBool(object val)
{
bool ret = false;
if ((val != null) && (val != DBNull.Value))
ret = Convert.ToBoolean(val);
return ret;
}
/// <summary>
/// Converts db value to decimal
/// </summary>
/// <param name="val">Value</param>
/// <returns>decimal</returns>
public static decimal GetDbDecimal(object val)
{
decimal ret = 0;
if ((val != null) && (val != DBNull.Value))
ret = (decimal)val;
return ret;
}
/// <summary>
/// Converts db value to datetime
/// </summary>
/// <param name="val">Value</param>
/// <returns>DateTime</returns>
public static DateTime GetDbDateTime(object val)
{
DateTime ret = DateTime.MinValue;
if ((val != null) && (val != DBNull.Value))
ret = (DateTime)val;
return ret;
}
#endregion
public static void ShowConsoleErrorMessage(string format, params object[] args)
{
Console.WriteLine(String.Format(format, args));
}
public static bool CheckForInstalledComponent(string componentCode)
{
bool ret = false;
List<string> installedComponents = new List<string>();
foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components)
{
string code = componentConfig.Settings[Global.Parameters.ComponentCode].Value;
installedComponents.Add(code);
if (code == componentCode)
{
ret = true;
break;
}
}
//
if (componentCode == "standalone")
{
if (installedComponents.Contains("server") ||
installedComponents.Contains("enterprise server") ||
installedComponents.Contains("portal"))
ret = true;
}
//
return ret;
}
public static bool IsThreadAbortException(Exception ex)
{
Exception innerException = ex;
while (innerException != null)
{
if (innerException is System.Threading.ThreadAbortException)
return true;
innerException = innerException.InnerException;
}
string str = ex.ToString();
return str.Contains("System.Threading.ThreadAbortException");
}
public static bool IsSecurityException(Exception ex)
{
if (ex is System.Security.SecurityException)
return true;
Exception innerException = ex;
while (innerException != null)
{
if (innerException is System.Security.SecurityException)
return true;
innerException = innerException.InnerException;
}
string str = ex.ToString();
return str.Contains("System.Security.SecurityException");
}
public static bool IsWin64()
{
return (IntPtr.Size == 8);
}
public static void SetObjectProperty(DirectoryEntry oDE, string name, object value)
{
if (value != null)
{
if (oDE.Properties.Contains(name))
{
oDE.Properties[name][0] = value;
}
else
{
oDE.Properties[name].Add(value);
}
}
}
public static object GetObjectProperty(DirectoryEntry entry, string name)
{
if (entry.Properties.Contains(name))
return entry.Properties[name][0];
else
return null;
}
public static bool IIS32Enabled()
{
bool enabled = false;
DirectoryEntry obj = new DirectoryEntry("IIS://LocalHost/W3SVC/AppPools");
object objProperty = GetObjectProperty(obj, "Enable32bitAppOnWin64");
if (objProperty != null)
{
enabled = (bool)objProperty;
}
return enabled;
}
public static void CheckWin64(EventHandler<UserDecisionEventArgs> callback)
{
if (IsWin64())
{
Log.WriteInfo("x64 detected");
string check = AppConfigManager.AppConfiguration.GetStringSetting(ConfigKeys.Settings_IIS64);
if (check == "False")
return;
//ignore win64 check on IIS7
if (Global.IISVersion.Major == 7)
return;
if (!IIS32Enabled())
{
Log.WriteInfo("IIS 32-bit mode disabled");
var args = new UserDecisionEventArgs
{
UserMessage = "WebsitePanel Installer has detected that Microsoft Internet Information Services (IIS) " +
"are running in 64-bit mode. It is recommended to switch IIS to 32-bit mode to " +
"enable compatibility with 32-bit applications. " +
"Please note that 64-bit web applications will not work in 32-bit mode.\n" +
"Do you want WebsitePanel Installer to switch IIS to 32-bit mode?"
};
if (callback != null)
{
callback(null, args);
}
if (AppConfigManager.AppConfiguration.Settings[ConfigKeys.Settings_IIS64] != null)
AppConfigManager.AppConfiguration.Settings[ConfigKeys.Settings_IIS64].Value = "False";
else
AppConfigManager.AppConfiguration.Settings.Add(ConfigKeys.Settings_IIS64, "False");
//
AppConfigManager.SaveConfiguration(false);
if (args.Accepted)
{
EnableIIS32();
}
}
else
{
Log.WriteInfo("IIS 32-bit mode enabled");
}
}
else
{
Log.WriteInfo("x86 detected");
}
}
private static void EnableIIS32()
{
Log.WriteStart("Enabling IIS 32-bit mode");
DirectoryEntry obj = new DirectoryEntry("IIS://LocalHost/W3SVC/AppPools");
SetObjectProperty(obj, "Enable32bitAppOnWin64", true);
obj.CommitChanges();
Log.WriteEnd("Enabled IIS 32-bit mode");
Log.WriteStart("Starting aspnet_regiis -i");
string path = Path.Combine(OS.GetWindowsDirectory(), @"Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe");
ProcessStartInfo info = new ProcessStartInfo(path, "-i");
//info.WindowStyle = ProcessWindowStyle.Minimized;
Process process = Process.Start(info);
process.WaitForExit();
Log.WriteEnd("Finished aspnet_regiis -i");
Log.WriteStart("Enabling Web Service Extension");
DirectoryEntry iis = new DirectoryEntry("IIS://LocalHost/W3SVC");
iis.Invoke("EnableWebServiceExtension", "ASP.NET v2.0.50727 (32-bit)");
iis.CommitChanges();
Log.WriteEnd("Enabled Web Service Extension");
}
/// <summary>
/// Check security permissions
/// </summary>
public static bool CheckSecurity()
{
try
{
PermissionSet set = new PermissionSet(PermissionState.Unrestricted);
set.Demand();
}
catch
{
return false;
}
return true;
}
public static bool IsAdministrator()
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
private static Mutex mutex = null;
public static void SaveMutex()
{
GC.KeepAlive(mutex);
}
public static bool IsNewInstance()
{
//check only one instance
bool createdNew = true;
mutex = new Mutex(true, "WebsitePanel Installer", out createdNew);
return createdNew;
}
}
}

View file

@ -0,0 +1,209 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Configuration;
using System.Text;
namespace WebsitePanel.Installer.Configuration
{
/// <summary>
/// Represents <connections> configuration element containing a collection of child elements.
/// </summary>
public class ComponentCollection : ConfigurationElementCollection
{
/// <summary>
/// Creates a new instance of the ConnectionCollection class.
/// </summary>
public ComponentCollection()
{
AddElementName = "component";
}
/// <summary>
/// Gets the type of the ConfigurationElementCollection.
/// </summary>
public override ConfigurationElementCollectionType CollectionType
{
get
{
return ConfigurationElementCollectionType.AddRemoveClearMap;
}
}
/// <summary>
/// Creates a new ConfigurationElement.
/// </summary>
/// <returns></returns>
protected override ConfigurationElement CreateNewElement()
{
return new ComponentConfigElement();
}
/// <summary>
/// Creates a new ConfigurationElement.
/// </summary>
/// <param name="elementName"></param>
/// <returns></returns>
protected override ConfigurationElement CreateNewElement(string id)
{
return new ComponentConfigElement(id);
}
/// <summary>
///
/// </summary>
/// <param name="element"></param>
/// <returns></returns>
protected override Object GetElementKey(ConfigurationElement element)
{
ComponentConfigElement componentConfigElement = element as ComponentConfigElement;
return componentConfigElement.ID;
}
/* public new string AddElementName
{
get
{
return base.AddElementName;
}
set
{
base.AddElementName = value;
}
}
public new string ClearElementName
{
get
{ return base.ClearElementName; }
set
{ base.AddElementName = value; }
}
public new string RemoveElementName
{
get
{ return base.RemoveElementName; }
}
public new int Count
{
get { return base.Count; }
}
*/
/// <summary>
/// Gets or sets a child element of this ConnectionCollection object.
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public ComponentConfigElement this[int index]
{
get
{
return (ComponentConfigElement)BaseGet(index);
}
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}
/// <summary>
/// Gets or sets a child element of this ConnectionCollection object.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public new ComponentConfigElement this[string id]
{
get
{
return (ComponentConfigElement)BaseGet(id);
}
}
/// <summary>
/// The index of the specified PluginConfigElement.
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
public int IndexOf(ComponentConfigElement element)
{
return BaseIndexOf(element);
}
/// <summary>
/// Adds a PluginConfigElement to the ConnectionCollection instance.
/// </summary>
/// <param name="c"></param>
public void Add(ComponentConfigElement c)
{
BaseAdd(c);
// Add custom code here.
}
public void Remove(ComponentConfigElement c)
{
if (BaseIndexOf(c) >= 0)
BaseRemove(c.ID);
}
public void RemoveAt(int index)
{
BaseRemoveAt(index);
}
public void Remove(string id)
{
BaseRemove(id);
}
public void Clear()
{
BaseClear();
// Add custom code here.
}
}
}

View file

@ -0,0 +1,253 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Configuration;
using System.Text;
namespace WebsitePanel.Installer.Configuration
{
/// <summary>
/// Represents a configuration element containing component info.
/// </summary>
public class ComponentConfigElement : ConfigurationElement
{
/// <summary>
/// Creates a new instance of the ServerConfigElement class.
/// </summary>
public ComponentConfigElement() : this(string.Empty)
{
}
/// <summary>
/// Creates a new instance of the ServerConfigElement class.
/// </summary>
public ComponentConfigElement(string id)
{
ID = id;
}
[ConfigurationProperty("id", IsRequired = true, IsKey = true)]
public string ID
{
get
{
return (string)this["id"];
}
set
{
this["id"] = value;
}
}
[ConfigurationProperty("settings", IsDefaultCollection = false)]
public KeyValueConfigurationCollection Settings
{
get
{
return (KeyValueConfigurationCollection)base["settings"];
}
}
public string GetStringSetting(string key)
{
string ret = null;
if (Settings[key] != null)
{
ret = Settings[key].Value;
}
return ret;
}
public int GetInt32Setting(string key)
{
int ret = 0;
if (Settings[key] != null)
{
string val = Settings[key].Value;
Int32.TryParse(val, out ret);
}
return ret;
}
public bool GetBooleanSetting(string key)
{
bool ret = false;
if (Settings[key] != null)
{
string val = Settings[key].Value;
Boolean.TryParse(val, out ret);
}
return ret;
}
/*
/// <summary>
/// Gets the type of the ConfigurationElementCollection.
/// </summary>
public override ConfigurationElementCollectionType CollectionType
{
get
{
return ConfigurationElementCollectionType.AddRemoveClearMap;
}
}
/// <summary>
/// Creates a new ConfigurationElement.
/// </summary>
/// <returns></returns>
protected override ConfigurationElement CreateNewElement()
{
//return new ModuleConfigElement();
return null;
}*/
/// <summary>
/// Creates a new ConfigurationElement.
/// </summary>
/// <param name="elementName"></param>
/// <returns></returns>
/*protected override ConfigurationElement CreateNewElement(string elementName)
{
return new ModuleConfigElement(elementName);
}*/
/*
/// <summary>
///
/// </summary>
/// <param name="element"></param>
/// <returns></returns>
protected override Object GetElementKey(ConfigurationElement element)
{
//ModuleConfigElement moduleConfigElement = element as ModuleConfigElement;
//return userConfigElement.Module;
return null;
}*/
/* public new string AddElementName
{
get
{
return base.AddElementName;
}
set
{
base.AddElementName = value;
}
}
public new string ClearElementName
{
get
{ return base.ClearElementName; }
set
{ base.AddElementName = value; }
}
public new string RemoveElementName
{
get
{ return base.RemoveElementName; }
}
public new int Count
{
get { return base.Count; }
}
*/
/// <summary>
/// Gets or sets a child element of this ServerConfigElement object.
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
/*public UserConfigElement this[int index]
{
get
{
return (UserConfigElement)BaseGet(index);
}
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}*/
/* /// <summary>
/// Gets or sets a child element of this ServerConfigElement object.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
new public UserConfigElement this[string name]
{
get
{
return (UserConfigElement)BaseGet(name);
}
}*/
/// <summary>
/// The index of the specified PluginConfigElement.
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
/*public int IndexOf(UserConfigElement connection)
{
return BaseIndexOf(connection);
}*/
/// <summary>
/// Adds a PluginConfigElement to the ServerConfigElement instance.
/// </summary>
/// <param name="c"></param>
/*public void Add(UserConfigElement c)
{
BaseAdd(c);
// Add custom code here.
}*/
}
}

View file

@ -0,0 +1,46 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
namespace WebsitePanel.Installer.Configuration
{
public class ConfigKeys
{
public const string Web_Service = "Web.Service";
public const string Web_AutoCheck = "Web.AutoCheck";
public const string Web_Proxy_UseProxy = "Web.Proxy.UseProxy";
public const string Web_Proxy_Address = "Web.Proxy.Address";
public const string Web_Proxy_UserName = "Web.Proxy.UserName";
public const string Web_Proxy_Password = "Web.Proxy.Password";
public const string Settings_ImportSettings = "Settings.ImportSettings";
public const string Settings_IIS64 = "Settings.CheckIIS64";
}
}

View file

@ -0,0 +1,103 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace WebsitePanel.Installer.Configuration
{
/// <summary>
/// Provides configuration system support for the <installerSettings> configuration section.
/// </summary>
public class InstallerSection : ConfigurationSection
{
/// <summary>
/// Creates a new instance of the StudioSection class.
/// </summary>
public InstallerSection()
{
}
/// <summary>
/// Declare <connections> collection element represented
/// in the configuration file by the sub-section.
/// </summary>
[ConfigurationProperty("components", IsDefaultCollection = false)]
public ComponentCollection Components
{
get
{
ComponentCollection componentCollection = (ComponentCollection)base["components"];
return componentCollection;
}
}
[ConfigurationProperty("settings", IsDefaultCollection = false)]
public KeyValueConfigurationCollection Settings
{
get
{
return (KeyValueConfigurationCollection)base["settings"];
}
}
public string GetStringSetting(string key)
{
string ret = null;
if (Settings[key] != null)
{
ret = Settings[key].Value;
}
return ret;
}
public int GetInt32Setting(string key)
{
int ret = 0;
if (Settings[key] != null)
{
string val = Settings[key].Value;
Int32.TryParse(val, out ret);
}
return ret;
}
public bool GetBooleanSetting(string key)
{
bool ret = false;
if (Settings[key] != null)
{
string val = Settings[key].Value;
Boolean.TryParse(val, out ret);
}
return ret;
}
}
}

View file

@ -0,0 +1,415 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using Ionic.Zip;
using WebsitePanel.Installer.Common;
namespace WebsitePanel.Installer.Core
{
public class LoaderEventArgs<T> : EventArgs
{
public string StatusMessage { get; set; }
public T EventData { get; set; }
public bool Cancellable { get; set; }
}
/// <summary>
/// Loader form.
/// </summary>
public partial class Loader
{
public const string ConnectingRemotServiceMessage = "Connecting...";
public const string DownloadingSetupFilesMessage = "Downloading setup files...";
public const string CopyingSetupFilesMessage = "Copying setup files...";
public const string PreparingSetupFilesMessage = "Please wait while Setup prepares the necessary files...";
public const string DownloadProgressMessage = "{0} KB of {1} KB";
public const string PrepareSetupProgressMessage = "{0}%";
private const int ChunkSize = 262144;
private Thread thread;
private string localFile;
private string remoteFile;
private string componentCode;
private string version;
public event EventHandler<LoaderEventArgs<String>> StatusChanged;
public event EventHandler<LoaderEventArgs<Exception>> OperationFailed;
public event EventHandler<LoaderEventArgs<Int32>> ProgressChanged;
public event EventHandler<EventArgs> OperationCompleted;
public Loader(string remoteFile)
{
this.remoteFile = remoteFile;
}
public Loader(string localFile, string componentCode, string version)
{
this.localFile = localFile;
this.componentCode = componentCode;
this.version = version;
}
public void LoadAppDistributive()
{
thread = new Thread(new ThreadStart(LoadAppDistributiveInternal));
thread.Start();
}
private void RaiseOnStatusChangedEvent(string statusMessage)
{
RaiseOnStatusChangedEvent(statusMessage, String.Empty);
}
private void RaiseOnStatusChangedEvent(string statusMessage, string eventData)
{
RaiseOnStatusChangedEvent(statusMessage, eventData, true);
}
private void RaiseOnStatusChangedEvent(string statusMessage, string eventData, bool cancellable)
{
if (StatusChanged == null)
{
return;
}
// No event data for status updates
StatusChanged(this, new LoaderEventArgs<String> {
StatusMessage = statusMessage,
EventData = eventData,
Cancellable = cancellable
});
}
private void RaiseOnProgressChangedEvent(int eventData)
{
RaiseOnProgressChangedEvent(eventData, true);
}
private void RaiseOnProgressChangedEvent(int eventData, bool cancellable)
{
if (ProgressChanged == null)
{
return;
}
//
ProgressChanged(this, new LoaderEventArgs<int> {
EventData = eventData,
Cancellable = cancellable
});
}
private void RaiseOnOperationFailedEvent(Exception ex)
{
if (OperationFailed == null)
{
return;
}
//
OperationFailed(this, new LoaderEventArgs<Exception> { EventData = ex });
}
private void RaiseOnOperationCompletedEvent()
{
if (OperationCompleted == null)
{
return;
}
//
OperationCompleted(this, EventArgs.Empty);
}
/// <summary>
/// Displays process progress.
/// </summary>
private void LoadAppDistributiveInternal()
{
//
try
{
var service = ServiceProviderProxy.GetInstallerWebService();
//
string dataFolder = FileUtils.GetDataDirectory();
string tmpFolder = FileUtils.GetTempDirectory();
if (!Directory.Exists(dataFolder))
{
Directory.CreateDirectory(dataFolder);
Log.WriteInfo("Data directory created");
}
if (Directory.Exists(tmpFolder))
{
FileUtils.DeleteTempDirectory();
}
if (!Directory.Exists(tmpFolder))
{
Directory.CreateDirectory(tmpFolder);
Log.WriteInfo("Tmp directory created");
}
string fileToDownload = null;
if (!string.IsNullOrEmpty(localFile))
{
fileToDownload = localFile;
}
else
{
fileToDownload = Path.GetFileName(remoteFile);
}
string destinationFile = Path.Combine(dataFolder, fileToDownload);
string tmpFile = Path.Combine(tmpFolder, fileToDownload);
//check whether file already downloaded
if (!File.Exists(destinationFile))
{
if (string.IsNullOrEmpty(remoteFile))
{
//need to get remote file name
RaiseOnStatusChangedEvent(ConnectingRemotServiceMessage);
//
RaiseOnProgressChangedEvent(0);
//
DataSet ds = service.GetReleaseFileInfo(componentCode, version);
//
RaiseOnProgressChangedEvent(100);
//
if (ds != null &&
ds.Tables.Count > 0 &&
ds.Tables[0].Rows.Count > 0)
{
DataRow row = ds.Tables[0].Rows[0];
remoteFile = row["FullFilePath"].ToString();
fileToDownload = Path.GetFileName(remoteFile);
destinationFile = Path.Combine(dataFolder, fileToDownload);
tmpFile = Path.Combine(tmpFolder, fileToDownload);
}
else
{
throw new Exception("Installer not found");
}
}
// download file to tmp folder
RaiseOnStatusChangedEvent(DownloadingSetupFilesMessage);
//
RaiseOnProgressChangedEvent(0);
//
DownloadFile(remoteFile, tmpFile);
//
RaiseOnProgressChangedEvent(100);
// copy downloaded file to data folder
RaiseOnStatusChangedEvent(CopyingSetupFilesMessage);
//
RaiseOnProgressChangedEvent(0);
// Ensure that the target does not exist.
if (File.Exists(destinationFile))
FileUtils.DeleteFile(destinationFile);
File.Move(tmpFile, destinationFile);
//
RaiseOnProgressChangedEvent(100);
}
// unzip file
RaiseOnStatusChangedEvent(PreparingSetupFilesMessage);
//
RaiseOnProgressChangedEvent(0);
//
UnzipFile(destinationFile, tmpFolder);
//
RaiseOnProgressChangedEvent(100);
//
RaiseOnOperationCompletedEvent();
}
catch (Exception ex)
{
if (Utils.IsThreadAbortException(ex))
return;
Log.WriteError("Loader module error", ex);
//
RaiseOnOperationFailedEvent(ex);
}
}
private void DownloadFile(string sourceFile, string destinationFile)
{
try
{
var service = ServiceProviderProxy.GetInstallerWebService();
//
Log.WriteStart("Downloading file");
Log.WriteInfo(string.Format("Downloading file \"{0}\" to \"{1}\"", sourceFile, destinationFile));
long downloaded = 0;
long fileSize = service.GetFileSize(sourceFile);
if (fileSize == 0)
{
throw new FileNotFoundException("Service returned empty file.", sourceFile);
}
byte[] content;
while (downloaded < fileSize)
{
content = service.GetFileChunk(sourceFile, (int)downloaded, ChunkSize);
if (content == null)
{
throw new FileNotFoundException("Service returned NULL file content.", sourceFile);
}
FileUtils.AppendFileContent(destinationFile, content);
downloaded += content.Length;
//update progress bar
RaiseOnStatusChangedEvent(DownloadingSetupFilesMessage,
string.Format(DownloadProgressMessage, downloaded / 1024, fileSize / 1024));
//
RaiseOnProgressChangedEvent(Convert.ToInt32((downloaded * 100) / fileSize));
if (content.Length < ChunkSize)
break;
}
//
RaiseOnStatusChangedEvent(DownloadingSetupFilesMessage, "100%");
//
Log.WriteEnd(string.Format("Downloaded {0} bytes", downloaded));
}
catch (Exception ex)
{
if (Utils.IsThreadAbortException(ex))
return;
throw;
}
}
private void UnzipFile(string zipFile, string destFolder)
{
try
{
int val = 0;
// Negative value means no progress made yet
int progress = -1;
//
Log.WriteStart("Unzipping file");
Log.WriteInfo(string.Format("Unzipping file \"{0}\" to the folder \"{1}\"", zipFile, destFolder));
long zipSize = 0;
var zipInfo = ZipFile.Read(zipFile);
try
{
foreach (ZipEntry entry in zipInfo)
{
if (!entry.IsDirectory)
zipSize += entry.UncompressedSize;
}
}
finally
{
if (zipInfo != null)
{
zipInfo.Dispose();
}
}
long unzipped = 0;
//
var zip = ZipFile.Read(zipFile);
//
try
{
foreach (ZipEntry entry in zip)
{
//
entry.Extract(destFolder, ExtractExistingFileAction.OverwriteSilently);
//
if (!entry.IsDirectory)
unzipped += entry.UncompressedSize;
if (zipSize != 0)
{
val = Convert.ToInt32(unzipped * 100 / zipSize);
// Skip to raise the progress event change when calculated progress
// and the current progress value are even
if (val == progress)
{
continue;
}
//
RaiseOnStatusChangedEvent(
PreparingSetupFilesMessage,
String.Format(PrepareSetupProgressMessage, val),
false);
//
RaiseOnProgressChangedEvent(val, false);
}
}
// Notify client the operation can be cancelled at this time
RaiseOnProgressChangedEvent(100);
//
Log.WriteEnd("Unzipped file");
}
finally
{
if (zip != null)
{
zip.Dispose();
}
}
}
catch (Exception ex)
{
if (Utils.IsThreadAbortException(ex))
return;
//
RaiseOnOperationFailedEvent(ex);
}
}
public void AbortOperation()
{
if (thread != null)
{
if (thread.IsAlive)
{
thread.Abort();
}
thread.Join();
}
}
}
}

View file

@ -0,0 +1,31 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("WebsitePanel Installer Core")]
[assembly: AssemblyDescription("WebsitePanel Installer Core")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("WebsitePanel Installer Core")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("419351db-5137-4a0d-ab64-fd90f0d52d45")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:

View file

@ -0,0 +1,36 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.1
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WebsitePanel.Installer.Core.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)]
[global::System.Configuration.DefaultSettingValueAttribute("http://www.websitepanel.net/Services/InstallerService.asmx")]
public string WebsitePanel_Installer_Core_InstallerService_InstallerService {
get {
return ((string)(this["WebsitePanel_Installer_Core_InstallerService_InstallerService"]));
}
}
}
}

View file

@ -0,0 +1,9 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="WebsitePanel.Installer.Core.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="WebsitePanel_Installer_Core_InstallerService_InstallerService" Type="(Web Service URL)" Scope="Application">
<Value Profile="(Default)">http://www.websitepanel.net/Services/InstallerService.asmx</Value>
</Setting>
</Settings>
</SettingsFile>

View file

@ -0,0 +1,73 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using WebsitePanel.Installer.Configuration;
using System.Net;
using WebsitePanel.Installer.Services;
namespace WebsitePanel.Installer.Core
{
public class ServiceProviderProxy
{
public static InstallerService GetInstallerWebService()
{
var webService = new InstallerService();
string url = AppConfigManager.AppConfiguration.GetStringSetting(ConfigKeys.Web_Service);
if (!String.IsNullOrEmpty(url))
{
webService.Url = url;
}
else
{
webService.Url = "http://www.websitepanel.net/Services/InstallerService.asmx";
}
// check if we need to add a proxy to access Internet
bool useProxy = AppConfigManager.AppConfiguration.GetBooleanSetting(ConfigKeys.Web_Proxy_UseProxy);
if (useProxy)
{
string proxyServer = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Address].Value;
if (!String.IsNullOrEmpty(proxyServer))
{
IWebProxy proxy = new WebProxy(proxyServer);
string proxyUsername = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_UserName].Value;
string proxyPassword = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Password].Value;
if (!String.IsNullOrEmpty(proxyUsername))
proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword);
webService.Proxy = proxy;
}
}
return webService;
}
}
}

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/">
<contractRef ref="http://www.websitepanel.net/Services/InstallerService.asmx?wsdl" docRef="http://www.websitepanel.net/Services/InstallerService.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address="http://www.websitepanel.net/Services/InstallerService.asmx" xmlns:q1="http://websitepanel.net/services" binding="q1:InstallerServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address="http://www.websitepanel.net/Services/InstallerService.asmx" xmlns:q2="http://websitepanel.net/services" binding="q2:InstallerServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
</discovery>

View file

@ -0,0 +1,303 @@
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://websitepanel.net/services" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://websitepanel.net/services" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://websitepanel.net/services">
<s:element name="GetReleaseFileInfo">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="componentCode" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="version" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetReleaseFileInfoResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetReleaseFileInfoResult">
<s:complexType>
<s:sequence>
<s:element ref="s:schema" />
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetFileChunk">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="offset" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="size" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetFileChunkResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetFileChunkResult" type="s:base64Binary" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetFileSize">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetFileSizeResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetFileSizeResult" type="s:long" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetAvailableComponents">
<s:complexType />
</s:element>
<s:element name="GetAvailableComponentsResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetAvailableComponentsResult">
<s:complexType>
<s:sequence>
<s:element ref="s:schema" />
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetLatestComponentUpdate">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="componentCode" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetLatestComponentUpdateResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetLatestComponentUpdateResult">
<s:complexType>
<s:sequence>
<s:element ref="s:schema" />
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetComponentUpdate">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="componentCode" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="release" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetComponentUpdateResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetComponentUpdateResult">
<s:complexType>
<s:sequence>
<s:element ref="s:schema" />
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="GetReleaseFileInfoSoapIn">
<wsdl:part name="parameters" element="tns:GetReleaseFileInfo" />
</wsdl:message>
<wsdl:message name="GetReleaseFileInfoSoapOut">
<wsdl:part name="parameters" element="tns:GetReleaseFileInfoResponse" />
</wsdl:message>
<wsdl:message name="GetFileChunkSoapIn">
<wsdl:part name="parameters" element="tns:GetFileChunk" />
</wsdl:message>
<wsdl:message name="GetFileChunkSoapOut">
<wsdl:part name="parameters" element="tns:GetFileChunkResponse" />
</wsdl:message>
<wsdl:message name="GetFileSizeSoapIn">
<wsdl:part name="parameters" element="tns:GetFileSize" />
</wsdl:message>
<wsdl:message name="GetFileSizeSoapOut">
<wsdl:part name="parameters" element="tns:GetFileSizeResponse" />
</wsdl:message>
<wsdl:message name="GetAvailableComponentsSoapIn">
<wsdl:part name="parameters" element="tns:GetAvailableComponents" />
</wsdl:message>
<wsdl:message name="GetAvailableComponentsSoapOut">
<wsdl:part name="parameters" element="tns:GetAvailableComponentsResponse" />
</wsdl:message>
<wsdl:message name="GetLatestComponentUpdateSoapIn">
<wsdl:part name="parameters" element="tns:GetLatestComponentUpdate" />
</wsdl:message>
<wsdl:message name="GetLatestComponentUpdateSoapOut">
<wsdl:part name="parameters" element="tns:GetLatestComponentUpdateResponse" />
</wsdl:message>
<wsdl:message name="GetComponentUpdateSoapIn">
<wsdl:part name="parameters" element="tns:GetComponentUpdate" />
</wsdl:message>
<wsdl:message name="GetComponentUpdateSoapOut">
<wsdl:part name="parameters" element="tns:GetComponentUpdateResponse" />
</wsdl:message>
<wsdl:portType name="InstallerServiceSoap">
<wsdl:operation name="GetReleaseFileInfo">
<wsdl:input message="tns:GetReleaseFileInfoSoapIn" />
<wsdl:output message="tns:GetReleaseFileInfoSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetFileChunk">
<wsdl:input message="tns:GetFileChunkSoapIn" />
<wsdl:output message="tns:GetFileChunkSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetFileSize">
<wsdl:input message="tns:GetFileSizeSoapIn" />
<wsdl:output message="tns:GetFileSizeSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetAvailableComponents">
<wsdl:input message="tns:GetAvailableComponentsSoapIn" />
<wsdl:output message="tns:GetAvailableComponentsSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetLatestComponentUpdate">
<wsdl:input message="tns:GetLatestComponentUpdateSoapIn" />
<wsdl:output message="tns:GetLatestComponentUpdateSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetComponentUpdate">
<wsdl:input message="tns:GetComponentUpdateSoapIn" />
<wsdl:output message="tns:GetComponentUpdateSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="InstallerServiceSoap" type="tns:InstallerServiceSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetReleaseFileInfo">
<soap:operation soapAction="http://websitepanel.net/services/GetReleaseFileInfo" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetFileChunk">
<soap:operation soapAction="http://websitepanel.net/services/GetFileChunk" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetFileSize">
<soap:operation soapAction="http://websitepanel.net/services/GetFileSize" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAvailableComponents">
<soap:operation soapAction="http://websitepanel.net/services/GetAvailableComponents" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetLatestComponentUpdate">
<soap:operation soapAction="http://websitepanel.net/services/GetLatestComponentUpdate" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetComponentUpdate">
<soap:operation soapAction="http://websitepanel.net/services/GetComponentUpdate" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="InstallerServiceSoap12" type="tns:InstallerServiceSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetReleaseFileInfo">
<soap12:operation soapAction="http://websitepanel.net/services/GetReleaseFileInfo" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetFileChunk">
<soap12:operation soapAction="http://websitepanel.net/services/GetFileChunk" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetFileSize">
<soap12:operation soapAction="http://websitepanel.net/services/GetFileSize" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAvailableComponents">
<soap12:operation soapAction="http://websitepanel.net/services/GetAvailableComponents" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetLatestComponentUpdate">
<soap12:operation soapAction="http://websitepanel.net/services/GetLatestComponentUpdate" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetComponentUpdate">
<soap12:operation soapAction="http://websitepanel.net/services/GetComponentUpdate" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="InstallerService">
<wsdl:port name="InstallerServiceSoap" binding="tns:InstallerServiceSoap">
<soap:address location="http://www.websitepanel.net/Services/InstallerService.asmx" />
</wsdl:port>
<wsdl:port name="InstallerServiceSoap12" binding="tns:InstallerServiceSoap12">
<soap12:address location="http://www.websitepanel.net/Services/InstallerService.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

View file

@ -0,0 +1,458 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.1
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
//
// This source code was auto-generated by Microsoft.VSDesigner, Version 4.0.30319.1.
//
#pragma warning disable 1591
namespace WebsitePanel.Installer.Services {
using System;
using System.Web.Services;
using System.Diagnostics;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Xml.Serialization;
using System.Data;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="InstallerServiceSoap", Namespace="http://websitepanel.net/services")]
public partial class InstallerService : System.Web.Services.Protocols.SoapHttpClientProtocol {
private System.Threading.SendOrPostCallback GetReleaseFileInfoOperationCompleted;
private System.Threading.SendOrPostCallback GetFileChunkOperationCompleted;
private System.Threading.SendOrPostCallback GetFileSizeOperationCompleted;
private System.Threading.SendOrPostCallback GetAvailableComponentsOperationCompleted;
private System.Threading.SendOrPostCallback GetLatestComponentUpdateOperationCompleted;
private System.Threading.SendOrPostCallback GetComponentUpdateOperationCompleted;
private bool useDefaultCredentialsSetExplicitly;
/// <remarks/>
public InstallerService() {
this.Url = global::WebsitePanel.Installer.Core.Properties.Settings.Default.WebsitePanel_Installer_Core_InstallerService_InstallerService;
if ((this.IsLocalFileSystemWebService(this.Url) == true)) {
this.UseDefaultCredentials = true;
this.useDefaultCredentialsSetExplicitly = false;
}
else {
this.useDefaultCredentialsSetExplicitly = true;
}
}
public new string Url {
get {
return base.Url;
}
set {
if ((((this.IsLocalFileSystemWebService(base.Url) == true)
&& (this.useDefaultCredentialsSetExplicitly == false))
&& (this.IsLocalFileSystemWebService(value) == false))) {
base.UseDefaultCredentials = false;
}
base.Url = value;
}
}
public new bool UseDefaultCredentials {
get {
return base.UseDefaultCredentials;
}
set {
base.UseDefaultCredentials = value;
this.useDefaultCredentialsSetExplicitly = true;
}
}
/// <remarks/>
public event GetReleaseFileInfoCompletedEventHandler GetReleaseFileInfoCompleted;
/// <remarks/>
public event GetFileChunkCompletedEventHandler GetFileChunkCompleted;
/// <remarks/>
public event GetFileSizeCompletedEventHandler GetFileSizeCompleted;
/// <remarks/>
public event GetAvailableComponentsCompletedEventHandler GetAvailableComponentsCompleted;
/// <remarks/>
public event GetLatestComponentUpdateCompletedEventHandler GetLatestComponentUpdateCompleted;
/// <remarks/>
public event GetComponentUpdateCompletedEventHandler GetComponentUpdateCompleted;
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://websitepanel.net/services/GetReleaseFileInfo", RequestNamespace="http://websitepanel.net/services", ResponseNamespace="http://websitepanel.net/services", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public System.Data.DataSet GetReleaseFileInfo(string componentCode, string version) {
object[] results = this.Invoke("GetReleaseFileInfo", new object[] {
componentCode,
version});
return ((System.Data.DataSet)(results[0]));
}
/// <remarks/>
public void GetReleaseFileInfoAsync(string componentCode, string version) {
this.GetReleaseFileInfoAsync(componentCode, version, null);
}
/// <remarks/>
public void GetReleaseFileInfoAsync(string componentCode, string version, object userState) {
if ((this.GetReleaseFileInfoOperationCompleted == null)) {
this.GetReleaseFileInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetReleaseFileInfoOperationCompleted);
}
this.InvokeAsync("GetReleaseFileInfo", new object[] {
componentCode,
version}, this.GetReleaseFileInfoOperationCompleted, userState);
}
private void OnGetReleaseFileInfoOperationCompleted(object arg) {
if ((this.GetReleaseFileInfoCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetReleaseFileInfoCompleted(this, new GetReleaseFileInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://websitepanel.net/services/GetFileChunk", RequestNamespace="http://websitepanel.net/services", ResponseNamespace="http://websitepanel.net/services", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")]
public byte[] GetFileChunk(string fileName, int offset, int size) {
object[] results = this.Invoke("GetFileChunk", new object[] {
fileName,
offset,
size});
return ((byte[])(results[0]));
}
/// <remarks/>
public void GetFileChunkAsync(string fileName, int offset, int size) {
this.GetFileChunkAsync(fileName, offset, size, null);
}
/// <remarks/>
public void GetFileChunkAsync(string fileName, int offset, int size, object userState) {
if ((this.GetFileChunkOperationCompleted == null)) {
this.GetFileChunkOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFileChunkOperationCompleted);
}
this.InvokeAsync("GetFileChunk", new object[] {
fileName,
offset,
size}, this.GetFileChunkOperationCompleted, userState);
}
private void OnGetFileChunkOperationCompleted(object arg) {
if ((this.GetFileChunkCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetFileChunkCompleted(this, new GetFileChunkCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://websitepanel.net/services/GetFileSize", RequestNamespace="http://websitepanel.net/services", ResponseNamespace="http://websitepanel.net/services", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public long GetFileSize(string fileName) {
object[] results = this.Invoke("GetFileSize", new object[] {
fileName});
return ((long)(results[0]));
}
/// <remarks/>
public void GetFileSizeAsync(string fileName) {
this.GetFileSizeAsync(fileName, null);
}
/// <remarks/>
public void GetFileSizeAsync(string fileName, object userState) {
if ((this.GetFileSizeOperationCompleted == null)) {
this.GetFileSizeOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFileSizeOperationCompleted);
}
this.InvokeAsync("GetFileSize", new object[] {
fileName}, this.GetFileSizeOperationCompleted, userState);
}
private void OnGetFileSizeOperationCompleted(object arg) {
if ((this.GetFileSizeCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetFileSizeCompleted(this, new GetFileSizeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://websitepanel.net/services/GetAvailableComponents", RequestNamespace="http://websitepanel.net/services", ResponseNamespace="http://websitepanel.net/services", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public System.Data.DataSet GetAvailableComponents() {
object[] results = this.Invoke("GetAvailableComponents", new object[0]);
return ((System.Data.DataSet)(results[0]));
}
/// <remarks/>
public void GetAvailableComponentsAsync() {
this.GetAvailableComponentsAsync(null);
}
/// <remarks/>
public void GetAvailableComponentsAsync(object userState) {
if ((this.GetAvailableComponentsOperationCompleted == null)) {
this.GetAvailableComponentsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetAvailableComponentsOperationCompleted);
}
this.InvokeAsync("GetAvailableComponents", new object[0], this.GetAvailableComponentsOperationCompleted, userState);
}
private void OnGetAvailableComponentsOperationCompleted(object arg) {
if ((this.GetAvailableComponentsCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetAvailableComponentsCompleted(this, new GetAvailableComponentsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://websitepanel.net/services/GetLatestComponentUpdate", RequestNamespace="http://websitepanel.net/services", ResponseNamespace="http://websitepanel.net/services", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public System.Data.DataSet GetLatestComponentUpdate(string componentCode) {
object[] results = this.Invoke("GetLatestComponentUpdate", new object[] {
componentCode});
return ((System.Data.DataSet)(results[0]));
}
/// <remarks/>
public void GetLatestComponentUpdateAsync(string componentCode) {
this.GetLatestComponentUpdateAsync(componentCode, null);
}
/// <remarks/>
public void GetLatestComponentUpdateAsync(string componentCode, object userState) {
if ((this.GetLatestComponentUpdateOperationCompleted == null)) {
this.GetLatestComponentUpdateOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLatestComponentUpdateOperationCompleted);
}
this.InvokeAsync("GetLatestComponentUpdate", new object[] {
componentCode}, this.GetLatestComponentUpdateOperationCompleted, userState);
}
private void OnGetLatestComponentUpdateOperationCompleted(object arg) {
if ((this.GetLatestComponentUpdateCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetLatestComponentUpdateCompleted(this, new GetLatestComponentUpdateCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://websitepanel.net/services/GetComponentUpdate", RequestNamespace="http://websitepanel.net/services", ResponseNamespace="http://websitepanel.net/services", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public System.Data.DataSet GetComponentUpdate(string componentCode, string release) {
object[] results = this.Invoke("GetComponentUpdate", new object[] {
componentCode,
release});
return ((System.Data.DataSet)(results[0]));
}
/// <remarks/>
public void GetComponentUpdateAsync(string componentCode, string release) {
this.GetComponentUpdateAsync(componentCode, release, null);
}
/// <remarks/>
public void GetComponentUpdateAsync(string componentCode, string release, object userState) {
if ((this.GetComponentUpdateOperationCompleted == null)) {
this.GetComponentUpdateOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetComponentUpdateOperationCompleted);
}
this.InvokeAsync("GetComponentUpdate", new object[] {
componentCode,
release}, this.GetComponentUpdateOperationCompleted, userState);
}
private void OnGetComponentUpdateOperationCompleted(object arg) {
if ((this.GetComponentUpdateCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetComponentUpdateCompleted(this, new GetComponentUpdateCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
public new void CancelAsync(object userState) {
base.CancelAsync(userState);
}
private bool IsLocalFileSystemWebService(string url) {
if (((url == null)
|| (url == string.Empty))) {
return false;
}
System.Uri wsUri = new System.Uri(url);
if (((wsUri.Port >= 1024)
&& (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) {
return true;
}
return false;
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
public delegate void GetReleaseFileInfoCompletedEventHandler(object sender, GetReleaseFileInfoCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetReleaseFileInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetReleaseFileInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public System.Data.DataSet Result {
get {
this.RaiseExceptionIfNecessary();
return ((System.Data.DataSet)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
public delegate void GetFileChunkCompletedEventHandler(object sender, GetFileChunkCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetFileChunkCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetFileChunkCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public byte[] Result {
get {
this.RaiseExceptionIfNecessary();
return ((byte[])(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
public delegate void GetFileSizeCompletedEventHandler(object sender, GetFileSizeCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetFileSizeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetFileSizeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public long Result {
get {
this.RaiseExceptionIfNecessary();
return ((long)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
public delegate void GetAvailableComponentsCompletedEventHandler(object sender, GetAvailableComponentsCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetAvailableComponentsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetAvailableComponentsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public System.Data.DataSet Result {
get {
this.RaiseExceptionIfNecessary();
return ((System.Data.DataSet)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
public delegate void GetLatestComponentUpdateCompletedEventHandler(object sender, GetLatestComponentUpdateCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetLatestComponentUpdateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetLatestComponentUpdateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public System.Data.DataSet Result {
get {
this.RaiseExceptionIfNecessary();
return ((System.Data.DataSet)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
public delegate void GetComponentUpdateCompletedEventHandler(object sender, GetComponentUpdateCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetComponentUpdateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetComponentUpdateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public System.Data.DataSet Result {
get {
this.RaiseExceptionIfNecessary();
return ((System.Data.DataSet)(this.results[0]));
}
}
}
}
#pragma warning restore 1591

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<DiscoveryClientResultsFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Results>
<DiscoveryClientResult referenceType="System.Web.Services.Discovery.ContractReference" url="http://www.websitepanel.net/Services/InstallerService.asmx?wsdl" filename="InstallerService.wsdl" />
<DiscoveryClientResult referenceType="System.Web.Services.Discovery.DiscoveryDocumentReference" url="http://www.websitepanel.net/Services/InstallerService.asmx?disco" filename="InstallerService.disco" />
</Results>
</DiscoveryClientResultsFile>

View file

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WebsitePanel.Installer.Core</RootNamespace>
<AssemblyName>WebsitePanel.Installer.Core</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Ionic.Zip.Reduced">
<HintPath>..\..\Lib\Ionic.Zip.Reduced.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Data" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\VersionInfo.cs">
<Link>VersionInfo.cs</Link>
</Compile>
<Compile Include="AppConfigManager.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Common\AssemblyLoader.cs" />
<Compile Include="Common\FileUtils.cs" />
<Compile Include="Common\Global.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Common\Log.cs" />
<Compile Include="Common\OS.cs" />
<Compile Include="Common\RegistryUtils.cs" />
<Compile Include="Common\Utils.cs" />
<Compile Include="Configuration\ComponentCollection.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Configuration\ComponentConfigElement.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Configuration\ConfigKeys.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Configuration\InstallerSection.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Loader.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<Compile Include="ServiceProviderProxy.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Web References\InstallerService\Reference.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Reference.map</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<WebReferences Include="Web References\" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<None Include="Web References\InstallerService\InstallerService.wsdl" />
<None Include="Web References\InstallerService\Reference.map">
<Generator>MSDiscoCodeGenerator</Generator>
<LastGenOutput>Reference.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<WCFMetadata Include="Service References\" />
</ItemGroup>
<ItemGroup>
<WebReferenceUrl Include="http://www.websitepanel.net/Services/InstallerService.asmx">
<UrlBehavior>Dynamic</UrlBehavior>
<RelPath>Web References\InstallerService\</RelPath>
<UpdateFromURL>http://www.websitepanel.net/Services/InstallerService.asmx</UpdateFromURL>
<ServiceLocationURL>
</ServiceLocationURL>
<CachedDynamicPropName>
</CachedDynamicPropName>
<CachedAppSettingsObjectName>Settings</CachedAppSettingsObjectName>
<CachedSettingsPropName>WebsitePanel_Installer_Core_InstallerService_InstallerService</CachedSettingsPropName>
</WebReferenceUrl>
</ItemGroup>
<ItemGroup>
<None Include="Web References\InstallerService\InstallerService.disco" />
</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.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="WebsitePanel.Installer.Core.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<system.serviceModel>
<bindings />
<client />
</system.serviceModel>
<applicationSettings>
<WebsitePanel.Installer.Core.Properties.Settings>
<setting name="WebsitePanel_Installer_Core_InstallerService_InstallerService"
serializeAs="String">
<value>http://www.websitepanel.net/Services/InstallerService.asmx</value>
</setting>
</WebsitePanel.Installer.Core.Properties.Settings>
</applicationSettings>
</configuration>

View file

@ -0,0 +1,104 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{129305D5-A9E6-4DCE-BFF6-41809E13EEEE}"
ProjectSection(SolutionItems) = preProject
..\..\LICENSE.txt = ..\..\LICENSE.txt
..\..\Readme.htm = ..\..\Readme.htm
..\..\ReleaseNotes.htm = ..\..\ReleaseNotes.htm
VersionInfo.cs = VersionInfo.cs
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Installer", "WebsitePanel.Installer\WebsitePanel.Installer.csproj", "{A358C6E2-F57D-4AB9-B13D-FD3048134143}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Updater", "WebsitePanel.Updater\WebsitePanel.Updater.csproj", "{F01A019E-1501-45A2-94D8-C621866A3ECD}"
ProjectSection(ProjectDependencies) = postProject
{A358C6E2-F57D-4AB9-B13D-FD3048134143} = {A358C6E2-F57D-4AB9-B13D-FD3048134143}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Setup", "WebsitePanel.Setup\WebsitePanel.Setup.csproj", "{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup", "Setup\Setup.vdproj", "{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.SilentInstaller", "WebsitePanel.SilentInstaller\WebsitePanel.SilentInstaller.csproj", "{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebsitePanel.Installer.Core", "WebsitePanel.Installer.Core\WebsitePanel.Installer.Core.csproj", "{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Debug|x86.ActiveCfg = Debug|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Release|Any CPU.Build.0 = Release|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{A358C6E2-F57D-4AB9-B13D-FD3048134143}.Release|x86.ActiveCfg = Release|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Debug|x86.ActiveCfg = Debug|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Release|Any CPU.Build.0 = Release|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{F01A019E-1501-45A2-94D8-C621866A3ECD}.Release|x86.ActiveCfg = Release|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Debug|x86.ActiveCfg = Debug|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Release|Any CPU.Build.0 = Release|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3951C0EC-BD98-450E-B228-CDBE5BD4AD49}.Release|x86.ActiveCfg = Release|Any CPU
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Debug|Any CPU.ActiveCfg = Debug
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Debug|Any CPU.Build.0 = Debug
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Debug|Mixed Platforms.ActiveCfg = Debug
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Debug|Mixed Platforms.Build.0 = Debug
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Debug|x86.ActiveCfg = Debug
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Debug|x86.Build.0 = Debug
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Release|Any CPU.ActiveCfg = Release
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Release|Any CPU.Build.0 = Release
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Release|Mixed Platforms.ActiveCfg = Release
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Release|Mixed Platforms.Build.0 = Release
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Release|x86.ActiveCfg = Release
{2D271041-201E-4E9C-8AB1-B62DC5B0B0E1}.Release|x86.Build.0 = Release
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Debug|Any CPU.ActiveCfg = Debug|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Debug|Any CPU.Build.0 = Debug|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Debug|Mixed Platforms.Build.0 = Debug|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Debug|x86.ActiveCfg = Debug|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Debug|x86.Build.0 = Debug|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Release|Any CPU.ActiveCfg = Release|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Release|Any CPU.Build.0 = Release|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Release|Mixed Platforms.ActiveCfg = Release|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Release|Mixed Platforms.Build.0 = Release|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Release|x86.ActiveCfg = Release|x86
{CD3E79C3-AEEF-43E6-A9ED-1130840FB2CD}.Release|x86.Build.0 = Release|x86
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Debug|x86.ActiveCfg = Debug|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Release|Any CPU.Build.0 = Release|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{0E4A3F5B-0BB1-4F63-863D-7B0182B378CF}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="installer" type="WebsitePanel.Installer.Configuration.InstallerSection, WebsitePanel.Installer.Core"/>
</configSections>
<installer>
<!-- Installed components -->
<components/>
<!-- Studio settings -->
<settings>
<add key="Log.FileName" value="WebsitePanel.Installer.log" />
<add key="Web.Service" value="http://www.websitepanel.net/Services/InstallerService-Beta.asmx" />
<add key="Web.AutoCheck" value="False" />
<add key="Web.Proxy.UseProxy" value="false" />
<add key="Web.Proxy.Address" value="" />
<add key="Web.Proxy.UserName" value="" />
<add key="Web.Proxy.Password" value="" />
</settings>
</installer>
</configuration>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="installer" type="WebsitePanel.Installer.Configuration.InstallerSection, WebsitePanel.Installer.Core"/>
</configSections>
<installer>
<!-- Installed components -->
<components/>
<!-- Studio settings -->
<settings>
<add key="Log.FileName" value="WebsitePanel.Installer.log" />
<add key="Web.Service" value="" />
<add key="Web.AutoCheck" value="False" />
<add key="Web.Proxy.UseProxy" value="false" />
<add key="Web.Proxy.Address" value="" />
<add key="Web.Proxy.UserName" value="" />
<add key="Web.Proxy.Password" value="" />
</settings>
</installer>
</configuration>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="installer" type="WebsitePanel.Installer.Configuration.InstallerSection, WebsitePanel.Installer.Core"/>
</configSections>
<installer>
<!-- Installed components -->
<components/>
<!-- Studio settings -->
<settings>
<add key="Log.FileName" value="WebsitePanel.Installer.log" />
<add key="Web.Service" value="http://www.websitepanel.net/Services/InstallerService-Beta.asmx" />
<add key="Web.AutoCheck" value="False" />
<add key="Web.Proxy.UseProxy" value="false" />
<add key="Web.Proxy.Address" value="" />
<add key="Web.Proxy.UserName" value="" />
<add key="Web.Proxy.Password" value="" />
</settings>
</installer>
</configuration>

View file

@ -0,0 +1,243 @@
namespace WebsitePanel.Installer
{
partial class ApplicationForm
{
/// <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.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ApplicationForm));
this.statusBar = new System.Windows.Forms.StatusStrip();
this.statusBarLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.splitContainer = new System.Windows.Forms.SplitContainer();
this.scopeTree = new System.Windows.Forms.TreeView();
this.smallImages = new System.Windows.Forms.ImageList(this.components);
this.pnlRight = new System.Windows.Forms.Panel();
this.pnlResultView = new System.Windows.Forms.Panel();
this.pnlDescription = new System.Windows.Forms.Panel();
this.lblResultViewPath = new System.Windows.Forms.Label();
this.lblResultViewTitle = new System.Windows.Forms.Label();
this.pictureBox = new System.Windows.Forms.PictureBox();
this.backgroundWorker = new System.ComponentModel.BackgroundWorker();
this.lineBox2 = new WebsitePanel.Installer.LineBox();
this.topLogoControl = new WebsitePanel.Installer.TopLogoControl();
this.statusBar.SuspendLayout();
this.splitContainer.Panel1.SuspendLayout();
this.splitContainer.Panel2.SuspendLayout();
this.splitContainer.SuspendLayout();
this.pnlRight.SuspendLayout();
this.pnlDescription.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
this.SuspendLayout();
//
// statusBar
//
this.statusBar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Visible;
this.statusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.statusBarLabel});
this.statusBar.Location = new System.Drawing.Point(0, 431);
this.statusBar.Name = "statusBar";
this.statusBar.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
this.statusBar.Size = new System.Drawing.Size(632, 22);
this.statusBar.TabIndex = 1;
//
// statusBarLabel
//
this.statusBarLabel.Name = "statusBarLabel";
this.statusBarLabel.Size = new System.Drawing.Size(39, 17);
this.statusBarLabel.Text = "Ready";
//
// splitContainer
//
this.splitContainer.BackColor = System.Drawing.SystemColors.Control;
this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer.Location = new System.Drawing.Point(0, 63);
this.splitContainer.Name = "splitContainer";
//
// splitContainer.Panel1
//
this.splitContainer.Panel1.Controls.Add(this.scopeTree);
this.splitContainer.Panel1.Padding = new System.Windows.Forms.Padding(0, 1, 0, 0);
//
// splitContainer.Panel2
//
this.splitContainer.Panel2.Controls.Add(this.pnlRight);
this.splitContainer.Panel2.Padding = new System.Windows.Forms.Padding(0, 1, 0, 0);
this.splitContainer.Size = new System.Drawing.Size(632, 368);
this.splitContainer.SplitterDistance = 250;
this.splitContainer.SplitterWidth = 2;
this.splitContainer.TabIndex = 2;
//
// scopeTree
//
this.scopeTree.Dock = System.Windows.Forms.DockStyle.Fill;
this.scopeTree.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.scopeTree.HideSelection = false;
this.scopeTree.ImageIndex = 0;
this.scopeTree.ImageList = this.smallImages;
this.scopeTree.ItemHeight = 19;
this.scopeTree.Location = new System.Drawing.Point(0, 1);
this.scopeTree.Name = "scopeTree";
this.scopeTree.SelectedImageIndex = 0;
this.scopeTree.ShowLines = false;
this.scopeTree.Size = new System.Drawing.Size(250, 367);
this.scopeTree.TabIndex = 0;
this.scopeTree.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.OnScopeTreeBeforeExpand);
this.scopeTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnScopeTreeAfterSelect);
//
// smallImages
//
this.smallImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
this.smallImages.ImageSize = new System.Drawing.Size(16, 16);
this.smallImages.TransparentColor = System.Drawing.Color.Transparent;
//
// pnlRight
//
this.pnlRight.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.pnlRight.Controls.Add(this.pnlResultView);
this.pnlRight.Controls.Add(this.pnlDescription);
this.pnlRight.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlRight.Location = new System.Drawing.Point(0, 1);
this.pnlRight.Name = "pnlRight";
this.pnlRight.Size = new System.Drawing.Size(380, 367);
this.pnlRight.TabIndex = 0;
//
// pnlResultView
//
this.pnlResultView.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlResultView.Location = new System.Drawing.Point(0, 63);
this.pnlResultView.Name = "pnlResultView";
this.pnlResultView.Size = new System.Drawing.Size(376, 300);
this.pnlResultView.TabIndex = 14;
//
// pnlDescription
//
this.pnlDescription.Controls.Add(this.lineBox2);
this.pnlDescription.Controls.Add(this.lblResultViewPath);
this.pnlDescription.Controls.Add(this.lblResultViewTitle);
this.pnlDescription.Controls.Add(this.pictureBox);
this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Top;
this.pnlDescription.Location = new System.Drawing.Point(0, 0);
this.pnlDescription.Name = "pnlDescription";
this.pnlDescription.Size = new System.Drawing.Size(376, 63);
this.pnlDescription.TabIndex = 13;
//
// lblResultViewPath
//
this.lblResultViewPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblResultViewPath.AutoEllipsis = true;
this.lblResultViewPath.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblResultViewPath.Location = new System.Drawing.Point(47, 28);
this.lblResultViewPath.Name = "lblResultViewPath";
this.lblResultViewPath.Size = new System.Drawing.Size(251, 21);
this.lblResultViewPath.TabIndex = 15;
this.lblResultViewPath.Text = "Path";
//
// lblResultViewTitle
//
this.lblResultViewTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblResultViewTitle.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblResultViewTitle.Location = new System.Drawing.Point(47, 8);
this.lblResultViewTitle.Name = "lblResultViewTitle";
this.lblResultViewTitle.Size = new System.Drawing.Size(318, 20);
this.lblResultViewTitle.TabIndex = 14;
this.lblResultViewTitle.Text = "Title";
//
// pictureBox
//
this.pictureBox.Location = new System.Drawing.Point(9, 8);
this.pictureBox.Name = "pictureBox";
this.pictureBox.Size = new System.Drawing.Size(32, 32);
this.pictureBox.TabIndex = 13;
this.pictureBox.TabStop = false;
//
// lineBox2
//
this.lineBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lineBox2.Location = new System.Drawing.Point(6, 51);
this.lineBox2.Name = "lineBox2";
this.lineBox2.Size = new System.Drawing.Size(366, 2);
this.lineBox2.TabIndex = 16;
this.lineBox2.TabStop = false;
this.lineBox2.Text = "lineBox2";
//
// topLogoControl
//
this.topLogoControl.BackColor = System.Drawing.Color.White;
this.topLogoControl.Dock = System.Windows.Forms.DockStyle.Top;
this.topLogoControl.Location = new System.Drawing.Point(0, 0);
this.topLogoControl.Name = "topLogoControl";
this.topLogoControl.Size = new System.Drawing.Size(632, 63);
this.topLogoControl.TabIndex = 3;
//
// ApplicationForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(632, 453);
this.Controls.Add(this.splitContainer);
this.Controls.Add(this.statusBar);
this.Controls.Add(this.topLogoControl);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(640, 480);
this.Name = "ApplicationForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "WebsitePanel Installer";
this.Shown += new System.EventHandler(this.OnApplicationFormShown);
this.statusBar.ResumeLayout(false);
this.statusBar.PerformLayout();
this.splitContainer.Panel1.ResumeLayout(false);
this.splitContainer.Panel2.ResumeLayout(false);
this.splitContainer.ResumeLayout(false);
this.pnlRight.ResumeLayout(false);
this.pnlDescription.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.StatusStrip statusBar;
private System.Windows.Forms.SplitContainer splitContainer;
private System.Windows.Forms.Panel pnlRight;
private TopLogoControl topLogoControl;
private System.Windows.Forms.TreeView scopeTree;
private System.Windows.Forms.Panel pnlDescription;
private LineBox lineBox2;
private System.Windows.Forms.Label lblResultViewPath;
private System.Windows.Forms.Label lblResultViewTitle;
private System.Windows.Forms.PictureBox pictureBox;
private System.Windows.Forms.ToolStripStatusLabel statusBarLabel;
private System.Windows.Forms.ImageList smallImages;
private System.Windows.Forms.Panel pnlResultView;
private System.ComponentModel.BackgroundWorker backgroundWorker;
}
}

View file

@ -0,0 +1,650 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Diagnostics;
using System.Net;
using System.Configuration;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using WebsitePanel.Installer.Common;
using WebsitePanel.Installer.Controls;
using WebsitePanel.Installer.Services;
using WebsitePanel.Installer.Configuration;
using System.Xml;
using System.Runtime.Remoting.Lifetime;
using WebsitePanel.Installer.Core;
namespace WebsitePanel.Installer
{
/// <summary>
/// Main application form
/// </summary>
internal partial class ApplicationForm : Form
{
private ProgressManager progressManager;
private ScopeNode activeScopeNode;
private static ApplicationForm instance;
delegate void VoidCallback();
#region Constructor
/// <summary>
/// Initializes a new instance of the ApplicationForm class.
/// </summary>
internal ApplicationForm()
{
InitializeComponent();
if (DesignMode)
{
return;
}
}
#endregion
#region Scope tree
/// <summary>
/// Adds predefined nodes
/// </summary>
private void AddDefaultNodes()
{
scopeTree.Nodes.Clear();
ScopeNode componentsNode = AddScopeNode(null, "Components", Properties.Resources.Folder32, Properties.Resources.Folder16, new ComponentsControl(), NodeType.Components, null);
AddScopeNode(null, "Application Settings", Properties.Resources.Tool32, Properties.Resources.Tool16, new SettingsControl(), NodeType.Settings, null);
componentsNode.Expand();
ExpandScopeNode(componentsNode);
scopeTree.SelectedNode = componentsNode;
}
/// <summary>
/// Adds scope node to the scope tree
/// </summary>
internal ScopeNode AddScopeNode(ScopeNode parent, string text, Icon largeIcon, Icon smallIcon, ResultViewControl resultView, NodeType nodeType, object tag)
{
string smallIconName = smallIcon.GetHashCode().ToString();
if (!this.smallImages.Images.ContainsKey(smallIconName))
{
this.smallImages.Images.Add(smallIconName, smallIcon);
}
ScopeNode node = new ScopeNode();
node.Text = text;
node.ResultView = resultView;
node.SmallIcon = smallIcon;
node.LargeIcon = largeIcon;
node.ImageKey = smallIconName;
node.SelectedImageKey = smallIconName;
node.NodeType = nodeType;
node.Populated = false;
node.Tag = tag;
if (parent == null)
{
scopeTree.Nodes.Add(node);
}
else
{
parent.Nodes.Add(node);
}
//add fake node to show +
node.Nodes.Add(" ");
return node;
}
/// <summary>
/// Adds component node to the scope tree
/// </summary>
internal ScopeNode AddComponentNode(ScopeNode parent, string text, object tag)
{
return AddScopeNode(parent, text, Properties.Resources.Service32, Properties.Resources.Service16, new ComponentControl(), NodeType.Component, tag);
}
/// <summary>
/// Actions on select node in the scope tree
/// </summary>
private void OnScopeTreeAfterSelect(object sender, TreeViewEventArgs e)
{
ScopeNode node = e.Node as ScopeNode;
//node.ContextMenuStrip = scopeItemContextMenu;
ExpandScopeNode(node);
PopulateResultView(node);
activeScopeNode = node;
}
/// <summary>
/// Expands scope node in the scope tree
/// </summary>
private void ExpandScopeNode(ScopeNode node)
{
if (node != null)
{
if (!node.Populated)
{
node.Nodes.Clear();
StartProgress("Loading...");
string text = node.Text;
node.Text += " expanding...";
scopeTree.Update();
scopeTree.BeginUpdate();
switch (node.NodeType)
{
/*case NodeType.Servers:
LoadServers(node);
break;
case NodeType.Server:
LoadServerComponents(node);
break;*/
case NodeType.Components:
LoadInstalledComponents(node);
break;
}
node.Text = text;
node.Populated = true;
node.Expand();
scopeTree.EndUpdate();
FinishProgress();
}
}
}
/// <summary>
/// Action on expanding scope tree node
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnScopeTreeBeforeExpand(object sender, TreeViewCancelEventArgs e)
{
ScopeNode node = e.Node as ScopeNode;
ExpandScopeNode(node);
}
#endregion
#region Result view
/// <summary>
/// Displays result view control
/// </summary>
/// <param name="parentNode"></param>
private void PopulateResultView(ScopeNode parentNode)
{
this.SuspendLayout();
pnlResultView.Controls.Clear();
if (parentNode.LargeIcon != null)
{
pictureBox.Image = parentNode.LargeIcon.ToBitmap();
}
else
{
pictureBox.Image = Properties.Resources.Folder32.ToBitmap();
}
lblResultViewTitle.Text = parentNode.Text;
lblResultViewPath.Text = parentNode.FullPath;
ResultViewControl control = parentNode.ResultView;
if (control != null)
{
pnlResultView.Controls.Add(control);
control.Dock = DockStyle.Fill;
try
{
AppContext context = new AppContext();
context.AppForm = this;
context.ScopeNode = parentNode;
control.ShowControl(context);
}
catch (Exception ex)
{
Log.WriteError("Console error", ex);
ShowError(ex);
}
}
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
#region Console
/// <summary>
/// Application form instance
/// </summary>
internal static ApplicationForm Instance
{
get { return instance; }
}
/// <summary>
/// Current version
/// </summary>
public string Version
{
get
{
return this.GetType().Assembly.GetName().Version.ToString();
}
}
/// <summary>
/// Reloads application
/// </summary>
internal void ReloadApplication()
{
//thread safe call
if (this.InvokeRequired)
{
VoidCallback callback = new VoidCallback(ReloadApplication);
this.Invoke(callback);
}
else
{
AppConfigManager.LoadConfiguration();
Update();
//LoadConfiguration();
ScopeNode componentsNode = scopeTree.Nodes[0] as ScopeNode;
componentsNode.Nodes.Clear();
componentsNode.Populated = false;
OnScopeTreeAfterSelect(scopeTree, new TreeViewEventArgs(componentsNode));
}
}
/// <summary>
/// Initializes application
/// </summary>
internal void InitializeApplication()
{
CheckForIllegalCrossThreadCalls = false;
LifetimeServices.LeaseTime = TimeSpan.Zero;
this.splitContainer.Panel2MinSize = 380;
this.splitContainer.Panel1MinSize = 150;
this.progressManager = new ProgressManager(this, this.statusBarLabel);
instance = this;
AddDefaultNodes();
}
/// <summary>
/// Disables application content
/// </summary>
internal void DisableContent()
{
scopeTree.Enabled = false;
pnlResultView.Enabled = false;
}
/// <summary>
/// Enables application content
/// </summary>
internal void EnableContent()
{
scopeTree.Enabled = true;
pnlResultView.Enabled = true;
}
/// <summary>
/// Shows error message
/// </summary>
/// <param name="message">Message</param>
internal void ShowError(string message)
{
MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
/// <summary>
/// Shows default web error message
/// </summary>
internal void ShowServerError()
{
ShowError("An error occurred while connecting to the remote server. Please check your internet connection.");
}
/// <summary>
/// Shows default error message
/// </summary>
internal void ShowError()
{
ShowError("An unexpected error has occurred. We apologize for this inconvenience.\n" +
"Please contact Technical Support at support@websitepanel.net.\n\n" +
"Make sure you include a copy of the Installer.log file from the\n" +
"WebsitePanel Installer home directory.");
}
/// <summary>
/// Shows security error message
/// </summary>
internal void ShowSecurityError()
{
ShowError(Global.Messages.NotEnoughPermissionsError);
}
internal void ShowError(Exception ex)
{
if (Utils.IsSecurityException(ex))
ShowSecurityError();
else
ShowError();
}
/// <summary>
/// Shows info message
/// </summary>
/// <param name="message"></param>
internal void ShowInfo(string message)
{
MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Shows warning message
/// </summary>
/// <param name="message"></param>
internal void ShowWarning(string message)
{
MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
/// <summary>
/// Loads installed components from configuration file
/// </summary>
private void LoadInstalledComponents(ScopeNode node)
{
Log.WriteStart("Loading installed components");
node.Nodes.Clear();
foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components)
{
string instance = string.Empty;
if (componentConfig.Settings["Instance"] != null &&
!string.IsNullOrEmpty(componentConfig.Settings["Instance"].Value))
{
instance = "(" + componentConfig.Settings["Instance"].Value + ")";
}
string title = string.Format("{0} {1} {2} {3}",
componentConfig.Settings["ApplicationName"].Value,
componentConfig.Settings["ComponentName"].Value,
componentConfig.Settings["Release"].Value,
instance);
AddComponentNode(node, title, componentConfig);
}
node.Populated = true;
Log.WriteEnd(string.Format("{0} installed component(s) loaded", AppConfigManager.AppConfiguration.Components.Count));
}
/// <summary>
/// Returns installer web service
/// </summary>
internal InstallerService WebService
{
get
{
return ServiceProviderProxy.GetInstallerWebService();
}
}
/// <summary>
/// Checks for the application update
/// </summary>
/// <param name="fileName">File name</param>
/// <returns>true if update is available for download; otherwise false</returns>
internal bool CheckForUpdate(out string fileName)
{
bool ret = false;
fileName = string.Empty;
Log.WriteStart("Checking for a new version");
//
var webService = ServiceProviderProxy.GetInstallerWebService();
DataSet ds = webService.GetLatestComponentUpdate("cfg core");
//
Log.WriteEnd("Checked for a new version");
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
DataRow row = ds.Tables[0].Rows[0];
Version currentVersion = GetType().Assembly.GetName().Version;
Version newVersion = null;
try
{
newVersion = new Version(row["Version"].ToString());
}
catch (FormatException e)
{
Log.WriteError("Version error", e);
return false;
}
if (newVersion > currentVersion)
{
ret = true;
fileName = row["UpgradeFilePath"].ToString();
Log.WriteInfo(string.Format("Version {0} is available for download", newVersion));
}
}
return ret;
}
/// <summary>
/// Runs application updater
/// </summary>
/// <param name="fileName">File name</param>
/// <returns>true if updater started successfully</returns>
internal bool StartUpdateProcess(string fileName)
{
Log.WriteStart("Starting updater");
string tmpFile = Path.ChangeExtension(Path.GetTempFileName(), ".exe");
using (Stream writeStream = File.Create(tmpFile))
{
using (Stream readStream = typeof(Program).Assembly.GetManifestResourceStream("WebsitePanel.Installer.Updater.exe"))
{
byte[] buffer = new byte[(int)readStream.Length];
readStream.Read(buffer, 0, buffer.Length);
writeStream.Write(buffer, 0, buffer.Length);
}
}
string targetFile = GetType().Module.FullyQualifiedName;
//
var webService = ServiceProviderProxy.GetInstallerWebService();
string url = webService.Url;
//
string proxyServer = string.Empty;
string user = string.Empty;
string password = string.Empty;
// check if we need to add a proxy to access Internet
bool useProxy = AppConfigManager.AppConfiguration.GetBooleanSetting(ConfigKeys.Web_Proxy_UseProxy);
if (useProxy)
{
proxyServer = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Address].Value;
user = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_UserName].Value;
password = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Password].Value;
}
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = tmpFile;
//prepare command line args
StringBuilder sb = new StringBuilder();
sb.AppendFormat("\\url:\"{0}\" ", url);
sb.AppendFormat("\\target:\"{0}\" ", targetFile);
sb.AppendFormat("\\file:\"{0}\" ", fileName);
sb.AppendFormat("\\proxy:\"{0}\" ", proxyServer);
sb.AppendFormat("\\user:\"{0}\" ", user);
sb.AppendFormat("\\password:\"{0}\" ", password);
info.Arguments = sb.ToString();
Process process = Process.Start(info);
if (process.Handle != IntPtr.Zero)
{
User32.SetForegroundWindow(process.Handle);
}
Log.WriteEnd("Updater started");
return (process.Handle != IntPtr.Zero);
}
#endregion
#region Progress indication
/// <summary>
/// Starts progress indication
/// </summary>
/// <param name="title">Title</param>
internal void StartProgress(string title)
{
StartProgress(title, false);
}
/// <summary>
/// Starts progress indication
/// </summary>
/// <param name="title">Title</param>
/// <param name="disableContent">Disable content</param>
internal void StartProgress(string title, bool disableContent)
{
if (disableContent)
{
DisableContent();
}
progressManager.StartProgress(title);
}
/// <summary>
/// Starts async progress indication
/// </summary>
/// <param name="title">Title</param>
/// <param name="disableContent">Disable content</param>
internal void StartAsyncProgress(string title, bool disableContent)
{
if (disableContent)
{
DisableContent();
}
topLogoControl.ShowProgress();
progressManager.StartProgress(title);
}
/// <summary>
/// Finishes progress indication
/// </summary>
internal void FinishProgress()
{
topLogoControl.HideProgress();
progressManager.FinishProgress();
EnableContent();
}
#endregion
private void OnApplicationFormShown(object sender, EventArgs e)
{
StartUnattendedSetup();
}
private void StartUnattendedSetup()
{
XmlDocument doc = Global.SetupXmlDocument;
if (doc != null)
{
XmlNode root = doc.SelectSingleNode("setup");
if (root == null)
{
Log.WriteError("Incorrect setup xml file");
Close();
}
Log.WriteStart("Starting unattended setup");
ProceedUnattendedSetup();
}
}
public void ProceedUnattendedSetup()
{
XmlDocument doc = Global.SetupXmlDocument;
XmlNode root = doc.SelectSingleNode("setup");
if (root.ChildNodes.Count == 0)
{
Log.WriteEnd("Unuttended setup finished");
Close();
return;
}
XmlNode node = root.ChildNodes[0];
switch (node.Name.ToLower())
{
case "install":
ParseInstallNode(node);
break;
}
}
private void ParseInstallNode(XmlNode installNode)
{
XmlNodeList components = installNode.SelectNodes("component");
if (components.Count == 0)
{
//remove parent install node
installNode.ParentNode.RemoveChild(installNode);
ProceedUnattendedSetup();
}
else
{
//remove current node and start installation
XmlElement componentNode = (XmlElement)components[0];
string componentCode = componentNode.GetAttribute("code");
string componentVersion = componentNode.GetAttribute("version");
string xml = componentNode.InnerXml;
installNode.RemoveChild(componentNode);
if (!string.IsNullOrEmpty(componentCode))
{
ScopeNode componentsNode = scopeTree.Nodes[0] as ScopeNode;
scopeTree.SelectedNode = componentsNode;
ComponentsControl ctrl = componentsNode.ResultView as ComponentsControl;
ctrl.InstallComponent(componentCode, componentVersion, xml);
}
}
}
public override object InitializeLifetimeService()
{
ILease lease = (ILease)base.InitializeLifetimeService();
//Set lease properties
lease.InitialLeaseTime = TimeSpan.Zero;
return lease;
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,57 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
namespace WebsitePanel.Installer.Common
{
internal class AppContext
{
private ApplicationForm appForm;
private ScopeNode scopeNode;
public ApplicationForm AppForm
{
get { return appForm; }
set { appForm = value; }
}
public ScopeNode ScopeNode
{
get { return scopeNode; }
set { scopeNode = value; }
}
public string CurrentPath
{
get { return FileUtils.GetCurrentDirectory(); }
}
}
}

View file

@ -0,0 +1,66 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Text;
namespace WebsitePanel.Installer.Common
{
internal class ProgressManager
{
private Form form;
private ToolStripStatusLabel label;
private Cursor cursor;
public ProgressManager(Form form, ToolStripStatusLabel label)
{
this.form = form;
this.label = label;
}
public void StartProgress(string title)
{
cursor = form.Cursor;
form.Cursor = Cursors.WaitCursor;
label.Text = title;
if (label.Owner != null)
label.Owner.Refresh();
}
public void FinishProgress()
{
form.Cursor = cursor;
label.Text = "Ready";
if ( label.Owner != null )
label.Owner.Refresh();
}
}
}

View file

@ -0,0 +1,98 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Text;
using WebsitePanel.Installer.Controls;
namespace WebsitePanel.Installer.Common
{
internal enum NodeType
{
Servers,
Server,
Components,
Component,
Module,
Settings,
Service
};
internal class ScopeNode : TreeNode
{
private bool populated;
private Icon largeIcon;
private Icon smallIcon;
private ResultViewControl resultView;
private NodeType nodeType;
private object dataObject;
public ScopeNode()
{
}
public bool Populated
{
get { return populated; }
set { populated = value; }
}
public Icon LargeIcon
{
get { return largeIcon; }
set { largeIcon = value; }
}
public Icon SmallIcon
{
get { return smallIcon; }
set { smallIcon = value; }
}
public ResultViewControl ResultView
{
get { return resultView; }
set { resultView = value; }
}
public NodeType NodeType
{
get { return nodeType; }
set { nodeType = value; }
}
public object DataObject
{
get { return dataObject; }
set { dataObject = value; }
}
}
}

View file

@ -0,0 +1,54 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Runtime.InteropServices;
namespace WebsitePanel.Installer.Common
{
internal sealed class User32
{
/// <summary>
/// Win32 API Constants for ShowWindowAsync()
/// </summary>
internal const int SW_HIDE = 0;
internal const int SW_SHOWNORMAL = 1;
internal const int SW_SHOWMINIMIZED = 2;
internal const int SW_SHOWMAXIMIZED = 3;
internal const int SW_SHOWNOACTIVATE = 4;
internal const int SW_RESTORE = 9;
internal const int SW_SHOWDEFAULT = 10;
[DllImport("user32.dll")]
internal static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern bool IsIconic(IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
}
}

View file

@ -0,0 +1,65 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Windows.Forms;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.Security.Principal;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Threading;
using WebsitePanel.Installer.Core;
namespace WebsitePanel.Installer.Common
{
public static class UiUtils
{
public static void ShowRunningInstance()
{
Process currentProcess = Process.GetCurrentProcess();
foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
{
if (process.Id != currentProcess.Id)
{
//set focus
User32.SetForegroundWindow(process.MainWindowHandle);
break;
}
}
}
}
}

View file

@ -0,0 +1,213 @@
namespace WebsitePanel.Installer.Controls
{
partial class ComponentControl
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ComponentControl));
this.grpInfo = new System.Windows.Forms.GroupBox();
this.txtVersion = new System.Windows.Forms.TextBox();
this.lblVersion = new System.Windows.Forms.Label();
this.txtComponent = new System.Windows.Forms.TextBox();
this.lblComponent = new System.Windows.Forms.Label();
this.txtApplication = new System.Windows.Forms.TextBox();
this.lblApplication = new System.Windows.Forms.Label();
this.grpDescription = new System.Windows.Forms.GroupBox();
this.lblDescription = new System.Windows.Forms.Label();
this.btnCheckUpdate = new System.Windows.Forms.Button();
this.btnSettings = new System.Windows.Forms.Button();
this.btnRemove = new System.Windows.Forms.Button();
this.grpInfo.SuspendLayout();
this.grpDescription.SuspendLayout();
this.SuspendLayout();
//
// grpInfo
//
this.grpInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpInfo.Controls.Add(this.txtVersion);
this.grpInfo.Controls.Add(this.lblVersion);
this.grpInfo.Controls.Add(this.txtComponent);
this.grpInfo.Controls.Add(this.lblComponent);
this.grpInfo.Controls.Add(this.txtApplication);
this.grpInfo.Controls.Add(this.lblApplication);
this.grpInfo.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpInfo.Location = new System.Drawing.Point(14, 43);
this.grpInfo.Name = "grpInfo";
this.grpInfo.Size = new System.Drawing.Size(379, 122);
this.grpInfo.TabIndex = 3;
this.grpInfo.TabStop = false;
this.grpInfo.Text = "Summary";
//
// txtVersion
//
this.txtVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtVersion.Location = new System.Drawing.Point(122, 82);
this.txtVersion.Name = "txtVersion";
this.txtVersion.ReadOnly = true;
this.txtVersion.Size = new System.Drawing.Size(234, 21);
this.txtVersion.TabIndex = 5;
//
// lblVersion
//
this.lblVersion.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblVersion.Location = new System.Drawing.Point(16, 82);
this.lblVersion.Name = "lblVersion";
this.lblVersion.Size = new System.Drawing.Size(100, 21);
this.lblVersion.TabIndex = 4;
this.lblVersion.Text = "Version";
//
// txtComponent
//
this.txtComponent.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtComponent.Location = new System.Drawing.Point(122, 55);
this.txtComponent.Name = "txtComponent";
this.txtComponent.ReadOnly = true;
this.txtComponent.Size = new System.Drawing.Size(234, 21);
this.txtComponent.TabIndex = 3;
//
// lblComponent
//
this.lblComponent.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblComponent.Location = new System.Drawing.Point(16, 55);
this.lblComponent.Name = "lblComponent";
this.lblComponent.Size = new System.Drawing.Size(100, 21);
this.lblComponent.TabIndex = 2;
this.lblComponent.Text = "Component";
//
// txtApplication
//
this.txtApplication.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtApplication.Location = new System.Drawing.Point(122, 28);
this.txtApplication.Name = "txtApplication";
this.txtApplication.ReadOnly = true;
this.txtApplication.Size = new System.Drawing.Size(234, 21);
this.txtApplication.TabIndex = 1;
//
// lblApplication
//
this.lblApplication.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblApplication.Location = new System.Drawing.Point(16, 28);
this.lblApplication.Name = "lblApplication";
this.lblApplication.Size = new System.Drawing.Size(100, 21);
this.lblApplication.TabIndex = 0;
this.lblApplication.Text = "Application";
//
// grpDescription
//
this.grpDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpDescription.Controls.Add(this.lblDescription);
this.grpDescription.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpDescription.Location = new System.Drawing.Point(14, 171);
this.grpDescription.Name = "grpDescription";
this.grpDescription.Size = new System.Drawing.Size(379, 117);
this.grpDescription.TabIndex = 4;
this.grpDescription.TabStop = false;
this.grpDescription.Text = "Description";
//
// lblDescription
//
this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblDescription.Location = new System.Drawing.Point(3, 17);
this.lblDescription.Name = "lblDescription";
this.lblDescription.Size = new System.Drawing.Size(373, 97);
this.lblDescription.TabIndex = 0;
//
// btnCheckUpdate
//
this.btnCheckUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnCheckUpdate.Image")));
this.btnCheckUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnCheckUpdate.Location = new System.Drawing.Point(14, 9);
this.btnCheckUpdate.Name = "btnCheckUpdate";
this.btnCheckUpdate.Size = new System.Drawing.Size(128, 28);
this.btnCheckUpdate.TabIndex = 0;
this.btnCheckUpdate.Text = " &Check For Updates";
this.btnCheckUpdate.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.btnCheckUpdate.UseVisualStyleBackColor = true;
this.btnCheckUpdate.Click += new System.EventHandler(this.OnCheckUpdateClick);
//
// btnSettings
//
this.btnSettings.Image = ((System.Drawing.Image)(resources.GetObject("btnSettings.Image")));
this.btnSettings.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnSettings.Location = new System.Drawing.Point(262, 9);
this.btnSettings.Name = "btnSettings";
this.btnSettings.Size = new System.Drawing.Size(108, 28);
this.btnSettings.TabIndex = 2;
this.btnSettings.Text = "&Settings";
this.btnSettings.UseVisualStyleBackColor = true;
this.btnSettings.Click += new System.EventHandler(this.OnSettingsClick);
//
// btnRemove
//
this.btnRemove.Image = ((System.Drawing.Image)(resources.GetObject("btnRemove.Image")));
this.btnRemove.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnRemove.Location = new System.Drawing.Point(148, 9);
this.btnRemove.Name = "btnRemove";
this.btnRemove.Size = new System.Drawing.Size(108, 28);
this.btnRemove.TabIndex = 1;
this.btnRemove.Text = "&Uninstall";
this.btnRemove.Click += new System.EventHandler(this.OnRemoveClick);
//
// ComponentControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.grpDescription);
this.Controls.Add(this.grpInfo);
this.Controls.Add(this.btnCheckUpdate);
this.Controls.Add(this.btnSettings);
this.Controls.Add(this.btnRemove);
this.Name = "ComponentControl";
this.Size = new System.Drawing.Size(406, 327);
this.grpInfo.ResumeLayout(false);
this.grpInfo.PerformLayout();
this.grpDescription.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnRemove;
private System.Windows.Forms.Button btnSettings;
private System.Windows.Forms.Button btnCheckUpdate;
private System.Windows.Forms.GroupBox grpInfo;
private System.Windows.Forms.TextBox txtVersion;
private System.Windows.Forms.Label lblVersion;
private System.Windows.Forms.TextBox txtComponent;
private System.Windows.Forms.Label lblComponent;
private System.Windows.Forms.TextBox txtApplication;
private System.Windows.Forms.Label lblApplication;
private System.Windows.Forms.GroupBox grpDescription;
private System.Windows.Forms.Label lblDescription;
}
}

View file

@ -0,0 +1,393 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Threading;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using WebsitePanel.Installer.Common;
using WebsitePanel.Installer.Services;
using WebsitePanel.Installer.Core;
using WebsitePanel.Installer.Configuration;
namespace WebsitePanel.Installer.Controls
{
/// <summary>
/// Component control
/// </summary>
internal partial class ComponentControl : ResultViewControl
{
delegate void ReloadApplicationCallback();
/// <summary>
/// Initializes a new instance of the ComponentControl class.
/// </summary>
public ComponentControl()
{
InitializeComponent();
}
/// <summary>
/// Shows control
/// </summary>
/// <param name="context"></param>
public override void ShowControl(AppContext context)
{
base.ShowControl(context);
if (!IsInitialized)
{
ComponentConfigElement element = context.ScopeNode.Tag as ComponentConfigElement;
if (element != null)
{
txtApplication.Text = element.GetStringSetting("ApplicationName");
txtComponent.Text = element.GetStringSetting("ComponentName");
txtVersion.Text = element.GetStringSetting("Release");
lblDescription.Text = element.GetStringSetting("ComponentDescription");
string installer = element.GetStringSetting("Installer");
string path = element.GetStringSetting("InstallerPath");
string type = element.GetStringSetting("InstallerType");
if ( string.IsNullOrEmpty(installer) ||
string.IsNullOrEmpty(path) ||
string.IsNullOrEmpty(type))
{
btnRemove.Enabled = false;
btnSettings.Enabled = false;
}
}
IsInitialized = true;
}
}
/// <summary>
/// Action on Remove button click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnRemoveClick(object sender, EventArgs e)
{
UninstallComponent();
}
/// <summary>
/// Action on Settings button click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnSettingsClick(object sender, EventArgs e)
{
SetupComponent();
}
/// <summary>
/// Action on Check For Update button click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnCheckUpdateClick(object sender, EventArgs e)
{
//start check in the separate thread
AppContext.AppForm.StartAsyncProgress("Connecting...", true);
ThreadStart threadDelegate = new ThreadStart(CheckForUpdate);
Thread newThread = new Thread(threadDelegate);
newThread.Start();
}
/// <summary>
/// Checks for component update
/// </summary>
private void CheckForUpdate()
{
Log.WriteStart("Checking for component update");
ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
string componentName = element.GetStringSetting("ComponentName");
string componentCode = element.GetStringSetting("ComponentCode");
string release = element.GetStringSetting("Release");
// call web service
DataSet ds;
try
{
Log.WriteInfo(string.Format("Checking {0} {1}", componentName, release));
//
var webService = ServiceProviderProxy.GetInstallerWebService();
ds = webService.GetComponentUpdate(componentCode, release);
//
Log.WriteEnd("Component update checked");
AppContext.AppForm.FinishProgress();
}
catch (Exception ex)
{
Log.WriteError("Service error", ex);
AppContext.AppForm.FinishProgress();
AppContext.AppForm.ShowServerError();
return;
}
string appName = AppContext.AppForm.Text;
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
DataRow row = ds.Tables[0].Rows[0];
string newVersion = row["Version"].ToString();
Log.WriteInfo(string.Format("Version {0} is available for download", newVersion));
string message = string.Format("{0} {1} is available now.\nWould you like to install new version?", componentName, newVersion);
if (MessageBox.Show(AppContext.AppForm, message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
{
string fileToDownload = row["UpgradeFilePath"].ToString();
string installerPath = row["InstallerPath"].ToString();
string installerType = row["InstallerType"].ToString();
UpdateComponent(fileToDownload, installerPath, installerType, newVersion);
}
}
else
{
string message = string.Format("Current version of {0} is up to date.", componentName);
Log.WriteInfo(message);
AppContext.AppForm.ShowInfo(message);
}
}
delegate void UpdateComponentCallback(string fileName, string path, string type, string version);
/// <summary>
/// Runs component update
/// </summary>
/// <param name="fileName"></param>
/// <param name="path"></param>
/// <param name="type"></param>
private void UpdateComponent(string fileName, string path, string type, string version)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.InvokeRequired)
{
UpdateComponentCallback callBack = new UpdateComponentCallback(UpdateComponent);
Invoke(callBack, new object[] { fileName, path, type, version });
}
else
{
Log.WriteStart("Updating component");
ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
string componentId = element.ID;
string componentName = element.GetStringSetting("ComponentName");
try
{
Log.WriteInfo(string.Format("Updating {0}", componentName));
//download installer
Loader form = new Loader(this.AppContext, fileName);
DialogResult result = form.ShowDialog(this);
if (result == DialogResult.OK)
{
//run installer
string tmpFolder = FileUtils.GetTempDirectory();
string installerPath = Path.Combine(tmpFolder, path);
Update();
string method = "Update";
Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
Hashtable args = new Hashtable();
args["ComponentId"] = componentId;
args["ShellVersion"] = AppContext.AppForm.Version;
args["BaseDirectory"] = FileUtils.GetCurrentDirectory();
args["UpdateVersion"] = version;
args["Installer"] = Path.GetFileName(fileName);
args["InstallerType"] = type;
args["InstallerPath"] = path;
args["InstallerFolder"] = tmpFolder;
args["IISVersion"] = Global.IISVersion;
args["ParentForm"] = FindForm();
result = (DialogResult)AssemblyLoader.Execute(installerPath, type, method, new object[] { args });
Log.WriteInfo(string.Format("Installer returned {0}", result));
Log.WriteEnd("Installer finished");
Update();
if (result == DialogResult.OK)
{
ReloadApplication();
}
FileUtils.DeleteTempDirectory();
}
Log.WriteEnd("Update completed");
}
catch (Exception ex)
{
Log.WriteError("Installer error", ex);
AppContext.AppForm.ShowError(ex);
}
}
}
/// <summary>
/// Uninstalls component
/// </summary>
private void UninstallComponent()
{
Log.WriteStart("Uninstalling component");
ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement;
string installer = element.GetStringSetting(Global.Parameters.Installer);
string path = element.GetStringSetting(Global.Parameters.InstallerPath);
string type = element.GetStringSetting(Global.Parameters.InstallerType);
string componentId = element.ID;
string componentCode = element.GetStringSetting(Global.Parameters.ComponentCode);
string componentName = element.GetStringSetting(Global.Parameters.ComponentName);
string release = element.GetStringSetting(Global.Parameters.Release);
try
{
Log.WriteInfo(string.Format("Uninstalling {0}", componentName));
//download installer
Loader form = new Loader(this.AppContext, installer, componentCode, release);
DialogResult result = form.ShowDialog(this);
if (result == DialogResult.OK)
{
//run installer
string tmpFolder = FileUtils.GetTempDirectory();
path = Path.Combine(tmpFolder, path);
Update();
string method = "Uninstall";
//
Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
//
var args = new Hashtable
{
{ Global.Parameters.ComponentId, componentId },
{ Global.Parameters.ComponentCode, componentCode },
{ Global.Parameters.ShellVersion, AppContext.AppForm.Version },
{ Global.Parameters.BaseDirectory, FileUtils.GetCurrentDirectory() },
{ Global.Parameters.IISVersion, Global.IISVersion },
{ Global.Parameters.ParentForm, FindForm() },
};
//
result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args });
//
Log.WriteInfo(string.Format("Installer returned {0}", result));
Log.WriteEnd("Installer finished");
Update();
ReloadApplication();
FileUtils.DeleteTempDirectory();
}
Log.WriteEnd("Uninstall completed");
}
catch (Exception ex)
{
Log.WriteError("Installer error", ex);
AppContext.AppForm.ShowError(ex);
}
}
/// <summary>
/// Setup component
/// </summary>
private void SetupComponent()
{
Log.WriteStart("Starting component setup");
var element = AppContext.ScopeNode.Tag as ComponentConfigElement;
string installer = element.GetStringSetting("Installer");
string path = element.GetStringSetting("InstallerPath");
string type = element.GetStringSetting("InstallerType");
string componentId = element.ID;
string componentCode = element.GetStringSetting("ComponentCode");
string componentName = element.GetStringSetting("ComponentName");
string release = element.GetStringSetting("Release");
try
{
Log.WriteInfo(string.Format("Setup {0} {1}", componentName, release));
//download installer
Loader form = new Loader(this.AppContext, installer, componentCode, release);
DialogResult result = form.ShowDialog(this);
if (result == DialogResult.OK)
{
string tmpFolder = Path.Combine(AppContext.CurrentPath, "Tmp");
path = Path.Combine(tmpFolder, path);
Update();
string method = "Setup";
Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path));
Hashtable args = new Hashtable();
args["ComponentId"] = componentId;
args["ShellVersion"] = AppContext.AppForm.Version;
args["BaseDirectory"] = FileUtils.GetCurrentDirectory();
args["IISVersion"] = Global.IISVersion;
args["ParentForm"] = FindForm();
args[Global.Parameters.ShellMode] = Global.VisualInstallerShell;
//
result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args });
//
Log.WriteInfo(string.Format("Installer returned {0}", result));
Log.WriteEnd("Installer finished");
if (result == DialogResult.OK)
{
ReloadApplication();
}
FileUtils.DeleteTempDirectory();
}
Log.WriteEnd("Component setup completed");
}
catch (Exception ex)
{
Log.WriteError("Installer error", ex);
this.AppContext.AppForm.ShowError(ex);
}
}
/// <summary>
/// Thread safe application reload
/// </summary>
private void ReloadApplication()
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.InvokeRequired)
{
ReloadApplicationCallback callback = new ReloadApplicationCallback(ReloadApplication);
Invoke(callback, null);
}
else
{
AppContext.AppForm.ReloadApplication();
}
}
}
}

View file

@ -0,0 +1,172 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btnCheckUpdate.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA05JREFUOE+Vk2tI
k2EYhtMF/Qqi0haVaaP80jbnnIecNQ+bh5k5yxpump+Zh2EnSbODqalBcxrNkppJTd1Sl3kIKrTylMM0
MyxL1LKWqQyMEjpQpnefKwLzVy88f16e++J+3vd+LBb8cxi8TP5KxhrhklXLfWm0hXafP34dGB963/zh
/Wjr9M+pJ1T754nBQsyRLd9wkFbbOW7pE6dRBCqKv0fps5H2IB/7dfUIPdsCmaoHwqR7RtczZDXV60jV
wjmAnZmdFgHJN25xSuNBNmQi7Xot8l5qIL7cjnDNE8SUvYD4VBsiztZN27kUKikAiyrLv5DNkmvniSsS
eL5g49FEIyan+nHXMIR9dc9AthgRWzWA3Wc6kFJ9HduOX5he5XT6KAVYZgasdk73ts9JmnHslCJ2WIY3
3wz4OmPEgNEE5esxRLWPgtQPQlrQDaUpGrkmARwj8set7JMFZoCdKEttqWZhbeU28Hvk0EwWYNQ0CaW2
A2SPCTsajYjQ9iMs24CMES+kjPHgmnMEa7l5p8yADWT2CHtXOVhRWngm6BB0qBInLjZB2vcJIQYTAmuG
IS56hpDjBuRN+CF6iI1Nl/zgKChrMgNsYlN/uElugyVvAjv/OTzL+sG/MQx+zVvwda8gLOqD6HQ3BPKH
COhdB+dGa1ir3OHgUzViBtAlKWNMUgVuZD2YUj2YkTqwZKVwjqkAL6UJ/uldECS1w0PagPXFMrDO7QVn
jxoMbskfB2xVEeFWj00CPThherj37YR4MA7y1ydBVpfAV94Cr6g28KJbwU9sxtaEeniSNVjDVGT9duCQ
EUS43QaxpQLrykVY3CwGrzsBW3oTETJwAJE31fBNNkCY2ozwC72I1vfDJ6Htk5X9EZEZQP3nYlt28VXC
ow6EpBAWaiZod9zB6AiHy9N4cJ/GgPtyO/XA5Yi4RiXycCdsXQuyKR39b5AoGpPB0TUQHrWwleVihU4I
u8Yw2Dz0hU1HAFy6EsFPq4T3/nY4h1ZpKbHrnCTOZpuCODFcrhQ7eNVi6TERrDWBoN/ngaPNhb/yPoJy
W6ftvdUFf8SL/l3C2VFos/Gkb0wPXr31aCndP/4dsUfxhfAqfczgnFdYE6nBs7bnLdI80n9e/AKxCsOV
gSO8kwAAAABJRU5ErkJggg==
</value>
</data>
<data name="btnSettings.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYZJREFUOE+lU8tK
AlEYdhf0FNUbtKo3aNcL1APUIwTtctHOCtQSallkG3cSBUUXEBkhKTWNbmIkrmbOnJkzOpev/wyOzGiQ
5Bk+Bob5bv/PicUmPYm9NCZBTJIf6x9/Ym1j1/8n/JZcX6ColP6FgQBCxwM9ngfXdWE7DjbLTawX32BZ
FoQpYBgGOOfQdd2v7if4VYDIh402Fi4qSFRaEMKCaZokQGSug+lsVCDs/vClYvZUweplDZYQMIUkk7vO
wRgJaNqoQIdbYKILx3GxfFLCTOoOtY5K7jK6OYjOGIM2LOBRj5WjWyzuXGE7V8DUVh7Jmxdyp+gDdx26
TyaoajSBHFwmX8AcEafj51hKXoNx0ydn9s+QSUtkcSCRykKNCJC9FHhuNKC8fmM+nsPxfdXvbtDgOJfd
qXc/uqZqUYFgbc16C5+NJp7KVSjv7X73/toCMnWX7pEEnkt7p8HZto1urwerSzuXkzcl2fB3HrgH5IjA
RHdBXkZawAiGv491acNCYxHopx/g8N5q3Wv/UAAAAABJRU5ErkJggg==
</value>
</data>
<data name="btnRemove.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAmpJREFUOE99kl1P
01AYx4eJmhj9Bt557f0u/QTe7UN4ZbiRK++8MyaGEEwUEgnIS8db5F26dQy2udVuK7jRlm5gC6wr29qN
zZa15E9bZYEAO8k/5zwn5/97nnOe0wPAd3VkeClg2+c+y5Ft2z7TNHx22/L13OvxPXxw3/fo8RPZ//zZ
z47HBbgK04I/uJYgIukCqKwMipURSu9jKc5hlmIRJDOYDqUxF2akFSpOXPo8swdgCgE6VwBfaoE7bmFb
biJdrGFhM4eR7wl8mQ7j63wEVHIbCWbHsfzzdQCxvBIoljTwioHfR0YHQNJ7mKOyWI6mkWR5lCo6eEn9
cBOQK/sPlIYk6zZ2yxbyyn+V28g7KlYtqKcWGoYN4bAauAFwN5zSiYOKiYTYwq5iQqxY4NS2p+O6jZPG
Gep/LQhy5XZA/k+NCO1o6P3MORJA7xteZrcqWbOgG+eo1I27AYygEExBxyqr4dUAB5KteVmVhoWTpmM+
bUNrmtiT1Nsr+JWXiPmUCqnaxv6JgfezMpJiE9WGidrpGZqmjaNqq9PCa11wgyx/SCynVcQFp4qsjpdv
WbwbP/DuXXcer22dQy5rdwNciHjcAMUU8bqfxoteGiMLGeR4ESW1CsuyIUrl7oA8JyCyGUNoi8HaBgtq
I4rxySBi8QQ0XQe7K3YHjI59A0mSyGYzYBgGyRSNjWjUizmOw+JqqDtgYnLKA8RjW0ilUlhfX8fo2Bg+
DQ5ieHgYM/OL3QGLPzb9ZDhCcPxenOd5DA0Noa/vDT72DxBTwZlr5htduPye7ryyRj5dWl4JEMR0YHxi
stP3q2fc9QWwyhndJ+hSfwAAAABJRU5ErkJggg==
</value>
</data>
</root>

View file

@ -0,0 +1,156 @@
namespace WebsitePanel.Installer.Controls
{
partial class ComponentsControl
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ComponentsControl));
this.grpDescription = new System.Windows.Forms.GroupBox();
this.lblDescription = new System.Windows.Forms.Label();
this.grdComponents = new System.Windows.Forms.DataGridView();
this.colName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.colLink = new System.Windows.Forms.DataGridViewLinkColumn();
this.btnLoadComponents = new System.Windows.Forms.Button();
this.grpDescription.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.grdComponents)).BeginInit();
this.SuspendLayout();
//
// grpDescription
//
this.grpDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpDescription.Controls.Add(this.lblDescription);
this.grpDescription.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpDescription.Location = new System.Drawing.Point(14, 198);
this.grpDescription.Name = "grpDescription";
this.grpDescription.Size = new System.Drawing.Size(379, 117);
this.grpDescription.TabIndex = 2;
this.grpDescription.TabStop = false;
this.grpDescription.Text = "Description";
//
// lblDescription
//
this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblDescription.Location = new System.Drawing.Point(3, 17);
this.lblDescription.Name = "lblDescription";
this.lblDescription.Size = new System.Drawing.Size(373, 97);
this.lblDescription.TabIndex = 0;
//
// grdComponents
//
this.grdComponents.AllowUserToAddRows = false;
this.grdComponents.AllowUserToDeleteRows = false;
this.grdComponents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grdComponents.BackgroundColor = System.Drawing.SystemColors.Window;
this.grdComponents.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.grdComponents.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.colName,
this.colVersion,
this.colLink});
this.grdComponents.Location = new System.Drawing.Point(14, 43);
this.grdComponents.MultiSelect = false;
this.grdComponents.Name = "grdComponents";
this.grdComponents.ReadOnly = true;
this.grdComponents.RowHeadersWidth = 21;
this.grdComponents.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.grdComponents.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.grdComponents.Size = new System.Drawing.Size(379, 149);
this.grdComponents.TabIndex = 1;
this.grdComponents.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnRowEnter);
this.grdComponents.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnInstallLinkClick);
//
// colName
//
this.colName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.colName.DataPropertyName = "Component";
this.colName.HeaderText = "Component Name";
this.colName.Name = "colName";
this.colName.ReadOnly = true;
//
// colVersion
//
this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
this.colVersion.DataPropertyName = "Version";
this.colVersion.HeaderText = "Version";
this.colVersion.Name = "colVersion";
this.colVersion.ReadOnly = true;
this.colVersion.Width = 67;
//
// colLink
//
this.colLink.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
this.colLink.DataPropertyName = "Id";
this.colLink.HeaderText = "";
this.colLink.Name = "colLink";
this.colLink.ReadOnly = true;
this.colLink.Resizable = System.Windows.Forms.DataGridViewTriState.False;
this.colLink.Text = "Install";
this.colLink.TrackVisitedState = false;
this.colLink.UseColumnTextForLinkValue = true;
this.colLink.Width = 5;
//
// btnLoadComponents
//
this.btnLoadComponents.Image = ((System.Drawing.Image)(resources.GetObject("btnLoadComponents.Image")));
this.btnLoadComponents.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnLoadComponents.Location = new System.Drawing.Point(14, 9);
this.btnLoadComponents.Name = "btnLoadComponents";
this.btnLoadComponents.Size = new System.Drawing.Size(170, 28);
this.btnLoadComponents.TabIndex = 0;
this.btnLoadComponents.Text = " &View Available Components";
this.btnLoadComponents.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.btnLoadComponents.Click += new System.EventHandler(this.OnLoadComponentsClick);
//
// ComponentsControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.btnLoadComponents);
this.Controls.Add(this.grpDescription);
this.Controls.Add(this.grdComponents);
this.Name = "ComponentsControl";
this.Size = new System.Drawing.Size(406, 327);
this.grpDescription.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.grdComponents)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpDescription;
private System.Windows.Forms.Label lblDescription;
private System.Windows.Forms.DataGridView grdComponents;
private System.Windows.Forms.Button btnLoadComponents;
private System.Windows.Forms.DataGridViewTextBoxColumn colName;
private System.Windows.Forms.DataGridViewTextBoxColumn colVersion;
private System.Windows.Forms.DataGridViewLinkColumn colLink;
}
}

View file

@ -0,0 +1,317 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using WebsitePanel.Installer.Common;
using WebsitePanel.Installer.Services;
using WebsitePanel.Installer.Core;
using WebsitePanel.Installer.Configuration;
namespace WebsitePanel.Installer.Controls
{
/// <summary>
/// Components control
/// </summary>
internal partial class ComponentsControl : ResultViewControl
{
delegate void SetGridDataSourceCallback(object dataSource, string dataMember);
private string componentCode = null;
private string componentVersion = null;
private string componentSettingsXml = null;
public ComponentsControl()
{
InitializeComponent();
grdComponents.AutoGenerateColumns = false;
}
/// <summary>
/// Action on click Install link
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnInstallLinkClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == grdComponents.Columns.IndexOf(colLink))
{
DataRowView row = grdComponents.Rows[e.RowIndex].DataBoundItem as DataRowView;
if (row != null)
{
StartInstaller(row);
StartLoadingComponents();
}
}
}
private void StartInstaller(DataRowView row)
{
string applicationName = Utils.GetDbString(row[Global.Parameters.ApplicationName]);
string componentName = Utils.GetDbString(row[Global.Parameters.ComponentName]);
string componentCode = Utils.GetDbString(row[Global.Parameters.ComponentCode]);
string componentDescription = Utils.GetDbString(row[Global.Parameters.ComponentDescription]);
string component = Utils.GetDbString(row[Global.Parameters.Component]);
string version = Utils.GetDbString(row[Global.Parameters.Version]);
string fileName = row[Global.Parameters.FullFilePath].ToString();
string installerPath = Utils.GetDbString(row[Global.Parameters.InstallerPath]);
string installerType = Utils.GetDbString(row[Global.Parameters.InstallerType]);
if (CheckForInstalledComponent(componentCode))
{
AppContext.AppForm.ShowWarning(Global.Messages.ComponentIsAlreadyInstalled);
return;
}
try
{
// download installer
Loader form = new Loader(this.AppContext, fileName);
DialogResult result = form.ShowDialog(this);
if (result == DialogResult.OK)
{
string tmpFolder = FileUtils.GetTempDirectory();
string path = Path.Combine(tmpFolder, installerPath);
Update();
string method = "Install";
Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", installerType, method, path));
//prepare installer args
Hashtable args = new Hashtable();
args[Global.Parameters.ComponentName] = componentName;
args[Global.Parameters.ApplicationName] = applicationName;
args[Global.Parameters.ComponentCode] = componentCode;
args[Global.Parameters.ComponentDescription] = componentDescription;
args[Global.Parameters.Version] = version;
args[Global.Parameters.InstallerFolder] = tmpFolder;
args[Global.Parameters.InstallerPath] = installerPath;
args[Global.Parameters.InstallerType] = installerType;
args[Global.Parameters.Installer] = Path.GetFileName(fileName);
args[Global.Parameters.ShellVersion] = AssemblyLoader.GetShellVersion();
args[Global.Parameters.BaseDirectory] = FileUtils.GetCurrentDirectory();
args[Global.Parameters.ShellMode] = Global.VisualInstallerShell;
args[Global.Parameters.IISVersion] = Global.IISVersion;
args[Global.Parameters.SetupXml] = this.componentSettingsXml;
args[Global.Parameters.ParentForm] = FindForm();
//run installer
DialogResult res = (DialogResult)AssemblyLoader.Execute(path, installerType, method, new object[] { args });
Log.WriteInfo(string.Format("Installer returned {0}", res));
Log.WriteEnd("Installer finished");
Update();
if (res == DialogResult.OK)
{
AppContext.AppForm.ReloadApplication();
}
FileUtils.DeleteTempDirectory();
}
}
catch (Exception ex)
{
Log.WriteError("Installer error", ex);
AppContext.AppForm.ShowError(ex);
}
finally
{
this.componentSettingsXml = null;
this.componentCode = null;
}
}
private bool CheckForInstalledComponent(string componentCode)
{
bool ret = false;
List<string> installedComponents = new List<string>();
foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components)
{
string code = componentConfig.Settings["ComponentCode"].Value;
installedComponents.Add(code);
if (code == componentCode)
{
ret = true;
break;
}
}
if (componentCode == "standalone")
{
if (installedComponents.Contains("server") ||
installedComponents.Contains("enterprise server") ||
installedComponents.Contains("portal"))
ret = true;
}
return ret;
}
/// <summary>
/// Displays component description when entering grid row
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnRowEnter(object sender, DataGridViewCellEventArgs e)
{
DataRowView row = grdComponents.Rows[e.RowIndex].DataBoundItem as DataRowView;
if (row != null)
{
lblDescription.Text = Utils.GetDbString(row["ComponentDescription"]);
}
}
/// <summary>
/// Start new thread to load components
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnLoadComponentsClick(object sender, EventArgs e)
{
StartLoadingComponents();
}
private void StartLoadingComponents()
{
//load list of available components in the separate thread
AppContext.AppForm.StartAsyncProgress("Connecting...", true);
ThreadStart threadDelegate = new ThreadStart(LoadComponents);
Thread newThread = new Thread(threadDelegate);
newThread.Start();
}
/// <summary>
/// Loads list of available components via web service
/// </summary>
private void LoadComponents()
{
try
{
Log.WriteStart("Loading list of available components");
lblDescription.Text = string.Empty;
//load components via web service
var webService = ServiceProviderProxy.GetInstallerWebService();
DataSet dsComponents = webService.GetAvailableComponents();
//remove already installed components
foreach (DataRow row in dsComponents.Tables[0].Rows)
{
string componentCode = Utils.GetDbString(row["ComponentCode"]);
if (CheckForInstalledComponent(componentCode))
{
row.Delete();
}
}
dsComponents.AcceptChanges();
Log.WriteEnd("Available components loaded");
SetGridDataSource(dsComponents, dsComponents.Tables[0].TableName);
AppContext.AppForm.FinishProgress();
}
catch (Exception ex)
{
Log.WriteError("Web service error", ex);
AppContext.AppForm.FinishProgress();
AppContext.AppForm.ShowServerError();
}
}
/// <summary>
/// Thread safe grid binding.
/// </summary>
/// <param name="dataSource">Data source</param>
/// <param name="dataMember">Data member</param>
private void SetGridDataSource(object dataSource, string dataMember)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.grdComponents.InvokeRequired)
{
SetGridDataSourceCallback callBack = new SetGridDataSourceCallback(SetGridDataSource);
this.grdComponents.Invoke(callBack, new object[] { dataSource, dataMember });
}
else
{
this.grdComponents.DataSource = dataSource;
this.grdComponents.DataMember = dataMember;
}
}
/// <summary>
/// Installs component during unattended setup
/// </summary>
/// <param name="componentCode"></param>
internal void InstallComponent(string componentCode, string componentVersion, string settingsXml)
{
//load list of available components in the separate thread
this.componentCode = componentCode;
this.componentVersion = componentVersion;
this.componentSettingsXml = settingsXml;
AppContext.AppForm.StartAsyncProgress("Connecting...", true);
ThreadStart threadDelegate = new ThreadStart(Install);
Thread newThread = new Thread(threadDelegate);
newThread.Start();
}
/// <summary>
/// Loads list of available components via web service and install specified component
/// during unattended setup
/// </summary>
private void Install()
{
LoadComponents();
foreach (DataGridViewRow gridRow in grdComponents.Rows)
{
DataRowView row = gridRow.DataBoundItem as DataRowView;
if (row != null)
{
string code = Utils.GetDbString(row["ComponentCode"]);
string version = Utils.GetDbString(row["Version"]);
if (code == componentCode)
{
//check component version if specified
if (!string.IsNullOrEmpty(componentVersion))
{
if (version != componentVersion)
continue;
}
StartInstaller(row);
AppContext.AppForm.ProceedUnattendedSetup();
break;
}
}
}
}
}
}

View file

@ -0,0 +1,140 @@
<?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>
<metadata name="colLink.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btnLoadComponents.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAj9JREFUOE+lk11I
U2EYx9vCiBS6GKyP+UWY0yYlZkYRM0Oi3IUEUlAG3QRFN1ERFTnNhWs2q7WtqTQLwhhBSp8YRQxcEslg
82KHzWidrbXNWTowc2du/953NFN4u4gOPJwPzu/3/s/7PEcEYNl/HVSQreTMaKHD9x5ddiOaHh1FXa8K
ylv7cHlQAzfPTQvxkSN6u4W8/odZgBORfsng2Es0Pm+G2q+FNmDEFU6PVq4TJz6cQ+2dBrj8HpTf3MYW
cKHxKQpf9d+AauAQpK0bsFazEcfspzKiNu56RlKsU7AFF560odlxEtsNe9A1ZMJYwAtfmEd+uzyTKlvr
NCVswQHrYSh79mPA+QLJ+bRCmE/nRmPf4Q56l0gkLUVsQU1PHc4/VlO4kpRISKZFNudTFGkrUKAtA12Z
wqsvytiCLaadGP3kRmTiWw7d5VA4lh/8Gs35Ep5YGYrEVpB7MR+MrPF+5NkCsiJ+115yXp4Q0ruCoajo
ZyIlnp1LiX6QmplN5aqHdWxBlbUWmy07UHa7eqq4syIu65Cje+QB5oSUhCYikvru4XsoN/2ljVutSugC
5kzLSvSVcPIe+jkgCQpoChfvQ8PDJqxvKWUn2GSuWRBQidxQDednD5nAcfQ6+jNTSVt5/P5ptoDERum1
qiU9p1AWpLBMLcfdtza2oLBDgWeu15CRwVkMZQeIwtpXRsSmk7uZ/4LlTR/IRuEd58QlWztU5oPIOytF
3hkp6g2NMA31YTKeXBWaFMRMweKH/3L9C8malnY23w2wAAAAAElFTkSuQmCC
</value>
</data>
</root>

View file

@ -0,0 +1,36 @@
namespace WebsitePanel.Installer
{
partial class LineBox
{
/// <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()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View file

@ -0,0 +1,95 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace WebsitePanel.Installer
{
/// <summary>
/// 3D line box.
/// </summary>
internal partial class LineBox : Control
{
/// <summary>
/// Initializes a new instance of the LineBox class.
/// </summary>
public LineBox() : base()
{
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.FixedHeight, true);
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.StandardClick, false);
SetStyle(ControlStyles.Selectable, false);
this.TabStop = false;
}
/// <summary>
/// Raises the Paint event.
/// </summary>
/// <param name="e">A PaintEventArgs that contains the event data.</param>
protected override void OnPaint(PaintEventArgs e)
{
Graphics graphics = e.Graphics;
Rectangle rectangle = this.ClientRectangle;
Pen lightPen = new Pen(ControlPaint.Light(this.BackColor, 1));
Pen darkPen = new Pen(ControlPaint.Dark(this.BackColor, 0));
graphics.DrawLine(darkPen, rectangle.X, rectangle.Y, rectangle.X+rectangle.Width, rectangle.Y);
graphics.DrawLine(lightPen, rectangle.X, rectangle.Y+1, rectangle.X+rectangle.Width, rectangle.Y+1);
base.OnPaint(e);
}
/// <summary>
/// Gets the default size of the control.
/// </summary>
protected override Size DefaultSize
{
get
{
return new Size(10, 2);
}
}
/// <summary>
/// Performs the work of setting the specified bounds of this control.
/// </summary>
/// <param name="x">The new Left property value of the control.</param>
/// <param name="y">The new Right property value of the control.</param>
/// <param name="width">The new Width property value of the control.</param>
/// <param name="height">The new Height property value of the control.</param>
/// <param name="specified">A bitwise combination of the BoundsSpecified values.</param>
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
base.SetBoundsCore(x, y, width, 2, specified);
}
}
}

View file

@ -0,0 +1,112 @@
namespace WebsitePanel.Installer.Controls
{
partial class Loader
{
/// <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.grpFiles = new System.Windows.Forms.GroupBox();
this.lblValue = new System.Windows.Forms.Label();
this.progressBar = new System.Windows.Forms.ProgressBar();
this.lblProcess = new System.Windows.Forms.Label();
this.btnCancel = new System.Windows.Forms.Button();
this.grpFiles.SuspendLayout();
this.SuspendLayout();
//
// grpFiles
//
this.grpFiles.Controls.Add(this.lblValue);
this.grpFiles.Controls.Add(this.progressBar);
this.grpFiles.Controls.Add(this.lblProcess);
this.grpFiles.Location = new System.Drawing.Point(12, 9);
this.grpFiles.Name = "grpFiles";
this.grpFiles.Size = new System.Drawing.Size(448, 88);
this.grpFiles.TabIndex = 4;
this.grpFiles.TabStop = false;
//
// lblValue
//
this.lblValue.Location = new System.Drawing.Point(294, 24);
this.lblValue.Name = "lblValue";
this.lblValue.Size = new System.Drawing.Size(138, 16);
this.lblValue.TabIndex = 2;
this.lblValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// progressBar
//
this.progressBar.Location = new System.Drawing.Point(16, 40);
this.progressBar.Name = "progressBar";
this.progressBar.Size = new System.Drawing.Size(416, 23);
this.progressBar.Step = 1;
this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
this.progressBar.TabIndex = 1;
//
// lblProcess
//
this.lblProcess.Location = new System.Drawing.Point(16, 24);
this.lblProcess.Name = "lblProcess";
this.lblProcess.Size = new System.Drawing.Size(272, 16);
this.lblProcess.TabIndex = 0;
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(385, 112);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 5;
this.btnCancel.Text = "&Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// Loader
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(473, 148);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.grpFiles);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Loader";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "WebsitePanel Installer";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnLoaderFormClosing);
this.grpFiles.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpFiles;
private System.Windows.Forms.ProgressBar progressBar;
private System.Windows.Forms.Label lblProcess;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Label lblValue;
}
}

View file

@ -0,0 +1,156 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Ionic.Zip;
using WebsitePanel.Installer.Services;
using WebsitePanel.Installer.Common;
namespace WebsitePanel.Installer.Controls
{
public delegate void OperationProgressDelegate(int percentage);
/// <summary>
/// Loader form.
/// </summary>
internal partial class Loader : Form
{
private AppContext appContext;
private Core.Loader appLoader;
public Loader()
{
InitializeComponent();
DialogResult = DialogResult.Cancel;
}
public Loader(AppContext context, string remoteFile)
: this()
{
this.appContext = context;
//
appLoader = new Core.Loader(remoteFile);
//
Start();
}
public Loader(AppContext context, string localFile, string componentCode, string version)
: this()
{
this.appContext = context;
//
appLoader = new Core.Loader(localFile, componentCode, version);
//
Start();
}
private void Start()
{
//
appLoader.OperationFailed += new EventHandler<Core.LoaderEventArgs<Exception>>(appLoader_OperationFailed);
appLoader.ProgressChanged += new EventHandler<Core.LoaderEventArgs<Int32>>(appLoader_ProgressChanged);
appLoader.StatusChanged += new EventHandler<Core.LoaderEventArgs<String>>(appLoader_StatusChanged);
appLoader.OperationCompleted += new EventHandler<EventArgs>(appLoader_OperationCompleted);
//
appLoader.LoadAppDistributive();
}
void appLoader_OperationCompleted(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
Close();
}
void appLoader_StatusChanged(object sender, Core.LoaderEventArgs<String> e)
{
lblProcess.Text = e.StatusMessage;
lblValue.Text = e.EventData;
// Adjust Cancel button availability for an operation being performed
if (btnCancel.Enabled != e.Cancellable)
{
btnCancel.Enabled = e.Cancellable;
}
// This check allows to avoid extra form redrawing operations
if (ControlBox != e.Cancellable)
{
ControlBox = e.Cancellable;
}
}
void appLoader_ProgressChanged(object sender, Core.LoaderEventArgs<Int32> e)
{
progressBar.Value = e.EventData;
// Adjust Cancel button availability for an operation being performed
if (btnCancel.Enabled != e.Cancellable)
{
btnCancel.Enabled = e.Cancellable;
}
// This check allows to avoid extra form redrawing operations
if (ControlBox != e.Cancellable)
{
ControlBox = e.Cancellable;
}
}
void appLoader_OperationFailed(object sender, Core.LoaderEventArgs<Exception> e)
{
appContext.AppForm.ShowError(e.EventData);
//
DialogResult = DialogResult.Abort;
Close();
}
private void btnCancel_Click(object sender, EventArgs e)
{
Log.WriteInfo("Execution was canceled by user");
Close();
}
private void OnLoaderFormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.Cancel)
{
appLoader.AbortOperation();
}
// Remove event handlers
appLoader.OperationFailed -= new EventHandler<Core.LoaderEventArgs<Exception>>(appLoader_OperationFailed);
appLoader.ProgressChanged -= new EventHandler<Core.LoaderEventArgs<Int32>>(appLoader_ProgressChanged);
appLoader.StatusChanged -= new EventHandler<Core.LoaderEventArgs<String>>(appLoader_StatusChanged);
appLoader.OperationCompleted -= new EventHandler<EventArgs>(appLoader_OperationCompleted);
}
}
}

View file

@ -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>

View file

@ -0,0 +1,248 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Threading;
namespace WebsitePanel.Installer.Controls
{
/// <summary>
/// Animated Icon.
/// </summary>
[ToolboxItem(true)]
public class ProgressIcon : System.Windows.Forms.UserControl
{
private Thread thread = null;
private int currentFrame = 0;
private int delayInterval = 50;
private int pause = 0;
private int loopCount = 0;
private int currentLoop = 0;
private int firstFrame = 0;
private int lastFrame = 13;
private ImageList images;
private IContainer components;
/// <summary>Initializes a new instance of the <b>AnimatedIcon</b> class.
/// </summary>
public ProgressIcon()
{
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
}
#region Dispose
/// <summary>Clean up any resources being used.</summary>
/// <param name="disposing"><see langword="true"/> to release both managed
/// and unmanaged resources; <see langword="false"/> to release
/// only unmanaged resources.</param>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
if( thread != null )
thread.Abort();
}
base.Dispose( disposing );
}
#endregion
#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.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProgressIcon));
this.images = new System.Windows.Forms.ImageList(this.components);
this.SuspendLayout();
//
// images
//
this.images.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("images.ImageStream")));
this.images.TransparentColor = System.Drawing.Color.Transparent;
this.images.Images.SetKeyName(0, "ProgressImage00.bmp");
this.images.Images.SetKeyName(1, "ProgressImage01.bmp");
this.images.Images.SetKeyName(2, "ProgressImage02.bmp");
this.images.Images.SetKeyName(3, "ProgressImage03.bmp");
this.images.Images.SetKeyName(4, "ProgressImage04.bmp");
this.images.Images.SetKeyName(5, "ProgressImage05.bmp");
this.images.Images.SetKeyName(6, "ProgressImage06.bmp");
this.images.Images.SetKeyName(7, "ProgressImage07.bmp");
this.images.Images.SetKeyName(8, "ProgressImage08.bmp");
this.images.Images.SetKeyName(9, "ProgressImage09.bmp");
this.images.Images.SetKeyName(10, "ProgressImage10.bmp");
this.images.Images.SetKeyName(11, "ProgressImage11.bmp");
this.images.Images.SetKeyName(12, "ProgressImage12.bmp");
//
// ProgressIcon
//
this.Name = "ProgressIcon";
this.Size = new System.Drawing.Size(30, 30);
this.ResumeLayout(false);
}
#endregion
/// <summary>Starts animation from the beginning.
/// </summary>
public void StartAnimation()
{
StopAnimation();
CheckRange(); // Check the first and the last frames
thread = new Thread( new ThreadStart( threadFunc ) );
thread.IsBackground = true;
thread.Start();
}
/// <summary>Stops animation not changing current frame number.
/// </summary>
public void StopAnimation()
{
if( thread != null )
{
thread.Abort();
thread = null;
}
currentLoop = 0;
}
/// <summary>Displays the specified frame.</summary>
/// <param name="frame">An index of the image stored in the <see cref="ImageList"/>.</param>
public void ShowFrame2(int frame)
{
StopAnimation();
if( frame >= 0 && frame < images.Images.Count )
currentFrame = frame;
else
currentFrame = 0;
Refresh();
}
/// <summary>Occurs when the control is redrawn.</summary>
/// <param name="e">A <see cref="PaintEventArgs"/> that contains
/// the event data.</param>
/// <remarks>The <b>OnPaint</b> method draws current image from
/// the <see cref="ImageList"/> if exists.</remarks>
protected override void OnPaint(PaintEventArgs e)
{
// Draw a crossed rectangle if there is no frame to display
if( images == null ||
currentFrame < 0 ||
currentFrame >= images.Images.Count )
{
if( this.Size.Width == 0 || this.Size.Height == 0 )
return;
Pen pen = new Pen( SystemColors.ControlText );
e.Graphics.DrawRectangle( pen, 0, 0, this.Size.Width-1, this.Size.Height-1 );
e.Graphics.DrawLine( pen, 0, 0, this.Size.Width, this.Size.Height );
e.Graphics.DrawLine( pen, 0, this.Size.Height-1, this.Size.Width-1, 0 );
pen.Dispose();
}
else
{
// Draw the current frame
e.Graphics.DrawImage( images.Images[currentFrame], 0, 0, this.Size.Width, this.Size.Height );
}
}
/// <summary>The method to be invoked when the thread begins executing.
/// </summary>
private void threadFunc()
{
bool wasPause = false;
currentFrame = firstFrame;
while( thread != null && thread.IsAlive )
{
Refresh(); // Redraw the current frame
wasPause = false;
if( images != null )
{
currentFrame++;
if( currentFrame > lastFrame ||
currentFrame >= images.Images.Count )
{
if( pause > 0 ) // Sleep after every loop
{
Thread.Sleep( pause );
wasPause = true;
}
currentFrame = firstFrame;
if( loopCount != 0 ) // 0 is infinitive loop
{
currentLoop++;
}
}
if( loopCount != 0 && currentLoop >= loopCount )
{
StopAnimation(); // The loop is completed
}
}
if( !wasPause ) // That prevents summation (pause + delayInterval)
Thread.Sleep( delayInterval );
}
}
/// <summary>Check if the last frame is no less than the first one.
/// Otherwise, swap them.</summary>
private void CheckRange()
{
if( lastFrame < firstFrame )
{
int tmp = firstFrame;
firstFrame = lastFrame;
lastFrame = tmp;
}
}
}
}

View file

@ -0,0 +1,855 @@
<?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>
<metadata name="images.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="images.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
qQAAAk1TRnQBSQFMAgEBDQEAAQ4BAAEEAQABHgEAAR4BAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAF4
AwABeAMAAQEBAAEgBgAB4RIAIP8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/A/EB/wPiAf8D4gH/
A+wB/wP5Af8D/gH/A/4h//8AaQAY/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/A9YB/wPp
Af8D7AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8D8QH/A/4B/wP+Gf//AGkAFP8D/gH/AfUB9AH1Af8B9QH0
AfUB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/
AfUB9AH1Af8B9QH0AfUB/wP+Ff//AGkAEP8D/gH/A/EB/wPZAf8D3AH/A/kB/wPiAf8D2QH/A9kB/wPZ
Af8D2QH/A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9wB/wH1AfQB9QH/A+IB/wPZAf8D7AH/A/4R//8A
aQAM/wP+Af8D7AH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/
A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/4N//8AaQAI/wP+Af8D8QH/A9kB/wPZ
Af8D2QH/A9kB/wPZAf8B9QH0AfUB/wPiAf8D1gH/A9wB/wPiAf8D8QH/AfUB9AH1Af8D4gH/A9wB/wPZ
Af8D3AH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Cf//AGkABP8D/gH/A/kB/wPZAf8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A/EB/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wPxAf8B9QH0
AfUB/wPpAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B9QH0AfUB/wP+Bf//AGkABP8D/gH/A/kB/wPp
Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZ
Af8D2QH/A+IB/wP5Af8D/gX//wBpAAP+Af8D8QH/A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A9kB/wPZ
Af8D8QH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D8QH/A/4B//8A
aQAD/gH/A+IB/wPWAf8D2QH/A+IB/wH1AfQB9QH/A/EB/wPsAf8D/jH/A/4B/wPsAf8D8QH/A/kB/wPp
Af8D2QH/A9YB/wPiAf8D/gH//wBpAAP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wPx
Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af//AGkAA/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+
Of8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB//8AaQAD6QH/A9kB/wPZAf8D2QH/A9kB/wPZ
Af8D+UH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB//8AaQAD4gH/A9kB/wPZAf8D2QH/A9kB/wPi
Af8D/kH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB//8AaQAB9QH0AfUB/wPxAf8D8QH/A/EB/wPx
Af8B9QH0AfUB/wP+Qf8D/gH/AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/AfUB9AH1Af//AGkAA+kB/wPi
Af8D4gH/A+IB/wPiAf8D7AH/A/5B/wP+Af8D7AH/A+IB/wPiAf8D4gH/A+IB/wPpAf//AGkAA+IB/wPW
Af8D2QH/A9kB/wPWAf8D3AH/A/5B/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf//AGkAA+kB/wPZ
Af8D2QH/A9kB/wPZAf8D2QH/A/lB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPiAf//AGkAA/EB/wPZ
Af8D2QH/A9kB/wPZAf8D1gH/A+wB/wP+Of8D/gH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+wB//8A
aQAD+QH/A9wB/wPZAf8D2QH/A9kB/wHoAeQB6AH/AfUB9AH1Af8B+QH8Afk5/wP+Af8D+QH/A+kB/wPZ
Af8D2QH/A9kB/wPZAf8D+QH//wBpAAP+Af8D4gH/A9YB/wHhAd4B4QH/AfgB8gH3Af8B6gH4AesB/wF8
Ad4BgQH/AYUB2gGKAf8D/jH/A/4B/wPpAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D1gH/A+IB/wP+
Af//AGkAA/4B/wH1AfQB9QH/AfAB6wHvAf8B8AH5AfEB/wG8AfsBwQH/AYkB+gGRAf8BagHoAXQB/wE1
AcUBPgH/AZsB4gGgAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/kB/wPxAf8B9QH0AfUB/wP+
Af//AGkABP8D/gH/AeAB+AHiAf8BkgH7AZkB/wGDAfkBjAH/AYMB+QGMAf8BiQH6AZEB/wFqAegBdAH/
ATUBxQE+Af8BjwHdAZQB/wP+Af8D/hn/A/4B/wP+Af8D7AH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
A/EB/wP+Bf//AGkABP8D/gH/AeoB+AHrAf8BkgH7AZkB/wGDAfkBjAH/AYkB+gGRAf8BiQH6AZEB/wGJ
AfoBkQH/AWoB6AF0Af8BoQHqAaYB/wGqAdIBqwH/AYIBvQGDAf8B2wHsAdsB/wH5AfwB+QH/A/4B/wP+
Af8D/gH/A/kB/wPsAf8D7AH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D/gX//wBpAAj/
A/4B/wHYAfoB2wH/AYkB+gGRAf8BiQH6AZEB/wGJAfoBkQH/AYMB+QGMAf8BmgH5AaEB/wHmAfsB6AH/
AUIBogFEAf8BDwGGAREB/wEhAYwBIwH/ATQBlQE2Af8BkgHJAZMB/wH4AfIB+AH/A9wB/wPZAf8D2QH/
A9kB/wP5Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D/gn//wBpAAz/A/4B/wHRAfoB1AH/AYkB+gGR
Af8BgwH5AYwB/wGDAfkBjAH/AdgB+gHbAf8BmQHLAZkB/wEyAaMBNAH/ATsBqQE9Af8BMgGjATQB/wEc
AZABHgH/AXwBwgF9Af8B9AHwAfQB/wPWAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D2QH/A9kB/wPZ
Af8D7AH/A/4N//8AaQAQ/wP+Af8B2AH6AdsB/wGSAfsBmQH/AaoB/AGxAf8B0gHqAdIB/wFDAasBRQH/
ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ATIBowE0Af8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D8QH/A+kB/wPZAf8D8QH/A/4R//8AaQAU/wP+Af8B6gH4AesB/wHqAfgB6wH/AXwBwgF9
Af8BKQGgASwB/wE7AakBPQH/ATsBqQE9Af8BOwGpAT0B/wEuAaIBMgH/AYkByAGKAf8B9AHwAfQB/wPZ
Af8D2QH/A9kB/wPZAf8D1gH/A+IB/wP5Af8D+QH/A/4V//8AaQAY/wP+Af8D/gH/Ac4B6wHQAf8BhAHI
AYYB/wFLAbABTQH/ATgBqAE6Af8BLgGiATIB/wEnAaABKQH/AYQByAGGAf8B8QHsAfEB/wPWAf8D1gH/
A9kB/wPcAf8D4gH/AfUB9AH1Af8D/gH/A/4Z//8AaQAg/wP+Af8D/gH/AeoB+AHrAf8BuQHgAboB/wGS
AdABkwH/AW0BwAFvAf8BpAHYAaUB/wH0AfAB9AH/A+IB/wPpAf8D8QH/A/kB/wP+Af8D/iH//wBpACD/
A/4B/wP+Af8B2wHsAdsB/wGgAdEBoQH/AXIBvAF0Af8BSQGlAUwB/wGZAcsBmQH/AaoB0gGrAf8BQgGi
AUQB/wFqAbQBawH/AZkBywGZAf8B2wHsAdsB/wP+Af8D/kH/A/4B/wP+Af8B3AHwAd0B/wGgAdEBoQH/
AXIBvAF0Af8BSQGlAUwB/wGZAcsBmQH/AaoB0gGrAf8BQgGiAUQB/wFqAbQBawH/AZkBywGZAf8B2wHs
AdsB/wP+Af8D/kH/A/4B/wP+Af8B4AH4AeIB/wG0AewBuAH/AZAB5gGWAf8BbAHbAXQB/wGkAesBqQH/
AfQB8AH0Af8D4gH/A+IB/wPsAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/
A/EB/wPiAf8D4gH/A+wB/wP5Af8D/gH/A/45/wP+Af8D/gH/Ab8B4AHAAf8BYQGxAWIB/wEqAZoBLQH/
ARwBkAEeAf8BFwGMARkB/wEQAYgBEQH/AYUBwgGGAf8BkgHJAZMB/wEKAYMBDAH/ARMBiAEVAf8BEwGI
ARUB/wEiAZIBJAH/AVkBrAFbAf8BswHbAbQB/wP+Af8D/jH/A/4B/wP+Af8BvwHgAcAB/wFhAbEBYgH/
ASoBmgEtAf8BHAGQAR4B/wEXAYwBGQH/ARABiAERAf8BhQHCAYYB/wGSAckBkwH/AQoBgwEMAf8BEwGI
ARUB/wETAYgBFQH/ASIBkgEkAf8BWQGsAVsB/wGzAdsBtAH/A/4B/wP+Mf8D/gH/A/4B/wHNAfMB0AH/
AYMB4QGJAf8BWgHdAWMB/wFLAdkBVAH/AUkB0gFSAf8BQgHQAUsB/wGVAeoBmwH/AfEB7AHxAf8D1gH/
A9kB/wPZAf8D2QH/A+IB/wPxAf8D/gH/A/4x/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/
A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8D8QH/A/4B/wP+Lf8D/gH/AckB4gHJAf8BuQHg
AboB/wGSAckBkwH/ARMBiAEVAf8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/
AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEKAYMBDAH/AWoBtAFrAf8ByQHi
AckB/wHBAeIBwgH/A/4p/wP+Af8ByQHiAckB/wG/AeABwAH/AZIByQGTAf8BEwGIARUB/wEiAZIBJAH/
ASIBkgEkAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/ASIBkgEkAf8BIgGS
ASQB/wEaAYwBHAH/AQoBgwEMAf8BagG0AWsB/wHWAfQB2AH/AdAB8wHTAf8D/in/A/4B/wHJAeIByQH/
AbgB3QG5Af8BrQHyAbIB/wFLAdkBVAH/AVUB2wFeAf8BVQHbAV4B/wFVAdsBXgH/AUkB0gFSAf8BmAHq
AZ0B/wHxAewB8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wP+Kf8D/gH/
AfUB9AH1Af8B9QH0AfUB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/
A9kB/wPWAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wP+Jf8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/
AdcB6gHYAf8BTwGqAVEB/wEiAZIBJAH/AScBlgEpAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHL
AZkB/wETAYgBFQH/ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/ASwBlQEuAf8B0AHnAdAB/wFJAaUBTAH/
ARoBjAEcAf8BmQHLAZkB/wP+If8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/AdcB6gHYAf8BTwGq
AVEB/wEiAZIBJAH/AScBlgEpAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/
ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/ASwBlQEuAf8B0gHqAdIB/wFsAdsBdAH/AUIBywFKAf8BrAHq
AbAB/wP+If8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/AdwB8AHdAf8BfAHnAYMB/wFVAdsBXgH/
AVoB3QFjAf8BVQHbAV4B/wFJAdIBUgH/AZUB6gGbAf8B8QHsAfEB/wPZAf8D2QH/A9kB/wPZAf8D3AH/
AfUB9AH1Af8D4gH/A9kB/wPsAf8D/iH/A/4B/wPxAf8D2QH/A9wB/wP5Af8D4gH/A9kB/wPZAf8D2QH/
A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPcAf8B9QH0AfUB/wPiAf8D2QH/A+wB/wP+Hf8D/gH/
AZoB0gGbAf8BIwGZASYB/wEmAZgBKQH/AR8BkgEhAf8BkgHJAZMB/wG5AeABugH/ASIBkgEkAf8BJgGY
ASkB/wEmAZgBKQH/ARwBkAEeAf8BiQHIAYoB/wGaAdIBmwH/ARwBkAEeAf8BJgGYASkB/wEiAZIBJAH/
ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/ARMBiAEVAf8BGgGMARwB/wETAYgBFQH/AYcBwgGIAf8D/hn/
A/4B/wGaAdIBmwH/ASMBmQEmAf8BJgGYASkB/wEfAZIBIQH/AZIByQGTAf8BuAHdAbkB/wEiAZIBJAH/
ASIBkgEkAf8BJgGYASkB/wEcAZABHgH/AYkByAGKAf8BmgHSAZsB/wEcAZABHgH/ASYBmAEpAf8BIgGS
ASQB/wETAYgBFQH/AZABxQGRAf8BvAHxAcAB/wFCAdABSwH/AUIBywFKAf8BPAHLAUUB/wGbAeIBoAH/
A/4Z/wP+Af8BmgHSAZsB/wEjAZkBJgH/ASYBmAEpAf8BHwGSASEB/wGJAcIBigH/Ac4B+gHRAf8BVQHb
AV4B/wFaAd0BYwH/AVoB4AFjAf8BWgHgAWMB/wGlAfIBqgH/AfEB7AHxAf8D1gH/A9kB/wPZAf8D2QH/
A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/4Z/wP+Af8D7AH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/
A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/
A/4V/wP+Af8BqwHYAawB/wEmAZgBKQH/ASoBmgEtAf8BKgGaAS0B/wEqAZoBLQH/ATEBnQEzAf8B0gHq
AdIB/wFpAbsBawH/ASMBmQEmAf8BSAGtAUsB/wFiAboBYwH/AbkB4AG6Af8BwQHiAcIB/wFtAcABbwH/
AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/ASIBkgEkAf8BGgGM
ARwB/wESAYQBFAH/AZIByQGTAf8D/hH/A/4B/wGrAdgBrAH/ASYBmAEpAf8BKgGaAS0B/wEuAZwBMQH/
ASoBmgEtAf8BMQGdATMB/wHSAeoB0gH/AWkBuwFrAf8BIwGZASYB/wFIAa0BSwH/AWIBugFjAf8BuQHg
AboB/wHBAeIBwgH/AW0BwAFvAf8BUgGyAVQB/wEyAaMBNAH/AU8BqgFRAf8B3AHwAd0B/wFlAdoBbQH/
AUIB0AFLAf8BSQHSAVIB/wFCAdABSwH/ATwBywFFAf8BqQHpAa0B/wP+Ef8D/gH/AasB2AGsAf8BJgGY
ASkB/wEqAZoBLQH/ASoBmgEtAf8BKgGaAS0B/wExAZ0BMwH/AdIB6gHSAf8BlAHwAZoB/wFnAewBcQH/
AYIB8QGKAf8BmgH5AaEB/wHRAfoB1AH/AfQB8AH0Af8D4gH/A9wB/wPZAf8D3AH/A/kB/wPcAf8D2QH/
A9kB/wPZAf8D2QH/A+wB/wP+Ef8D/gH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D4gH/
A9YB/wPcAf8D4gH/A/EB/wH1AfQB9QH/A+IB/wPcAf8D2QH/A9wB/wP5Af8D3AH/A9kB/wPZAf8D2QH/
A9kB/wPsAf8D/g3/A/4B/wHcAfAB3QH/ATIBowE0Af8BJgGYASkB/wEuAZwBMQH/AS4BnAExAf8BLgGc
ATEB/wEfAZIBIQH/AWEBsQFiAf8B0gHqAdIB/wGrAdgBrAH/AegB9QHoAf8D/gH/A/4B/wP+Af8D/gH/
AfAB+QHxAf8BswHbAbQB/wHLAegBywH/AZIB0AGTAf8BHwGSASEB/wEfAZIBIQH/ASIBkgEkAf8BIQGM
ASMB/wEaAYwBHAH/ARoBjAEcAf8ByQHiAckB/wP+Cf8D/gH/AdwB8AHdAf8BMgGjATQB/wEmAZgBKQH/
AS4BnAExAf8BLgGcATEB/wEuAZwBMQH/AR8BkgEhAf8BYQGxAWIB/wHSAeoB0gH/AasB2AGsAf8B6gH4
AesB/wP+Af8D/gH/A/4B/wP+Af8B8AH5AfEB/wGzAdsBtAH/AcsB6AHLAf8BxQH6AckB/wFaAeABYwH/
AUkB0gFSAf8BSQHSAVIB/wFJAdIBUgH/AUIBywFKAf8BQgHLAUoB/wHWAfQB2AH/A/4J/wP+Af8B3AHw
Ad0B/wEyAaMBNAH/ASYBmAEpAf8BLgGcATEB/wEuAZwBMQH/AS4BnAExAf8BHwGSASEB/wFhAbEBYgH/
AeAB+AHiAf8BxQH6AckB/wHwAfkB8QH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/AfUB9AH1Af8D6QH/
A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/AfUB9AH1Af8D6QH/
A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wHgAfEB4QH/AZIByQGTAf8BMgGj
ATQB/wEjAZkBJgH/AS4BnAExAf8BJgGYASkB/wEmAZgBKQH/AZIByQGTAf8D/gH/A/4Z/wP+Af8D/gH/
AasB2AGsAf8BRQGwAUcB/wEqAZoBLQH/AR8BigEhAf8BFwGMARkB/wEaAYwBHAH/AWoBtAFrAf8B3AHw
Ad0B/wP+Cf8D/gH/AeAB8QHhAf8BkgHJAZMB/wEyAaMBNAH/ASMBmQEmAf8BKgGaAS0B/wEmAZgBKQH/
ASYBmAEpAf8BkgHJAZMB/wP+Af8D/hn/A/4B/wP+Af8B0QH6AdQB/wGaAfkBoQH/AWsB5QF0Af8BSAHS
AVEB/wFCAdABSwH/AUIBywFKAf8BgQHgAYYB/wHgAfgB4gH/A/4J/wP+Af8B4AHxAeEB/wGSAckBkwH/
ATIBowE0Af8BIwGZASYB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wGSAckBkwH/A/4B/wP+Gf8D/gH/
A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A/4J/wP+Af8B8AH5AfEB/wHxAewB8QH/
AdwB2gHcAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Af8D/hn/A/4B/wP+Af8D7AH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D4gH/A/kB/wP+Bf8D/gH/AbkB4AG6Af8BUgGyAVQB/wHBAeIBwgH/AdIB6gHSAf8BcgG8
AXQB/wEjAZkBJgH/ARwBkAEeAf8BqgHSAasB/wP+Kf8D/gH/AcEB4gHCAf8BRQGwAUcB/wEiAZIBJAH/
AVMBqQFVAf8BwQHiAcIB/wHJAeIByQH/AVMBqQFVAf8BqgHSAasB/wP+Af8D/gH/AbkB4AG6Af8BUgGy
AVQB/wHBAeIBwgH/AdIB6gHSAf8BcgG8AXQB/wEjAZkBJgH/ARwBkAEeAf8BqgHSAasB/wP+Kf8D/gH/
Ad0B+wHgAf8BmgH5AaEB/wFaAeABYwH/AWwB2wF0Af8BxQH6AckB/wH4AfIB+AH/A+IB/wPxAf8D/gH/
A/4B/wG5AeABugH/AVIBsgFUAf8BwQHiAcIB/wHSAeoB0gH/AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/
AaoB0gGrAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPxAf8D/gH/
A/4B/wHRAfoB1AH/AYIB8QGKAf8BzgH6AdEB/wH4AfIB+AH/AegB5AHoAf8D2QH/A9kB/wPxAf8D/in/
A/4B/wPxAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPxAf8D/gH/A/4B/wFyAbwBdAH/
ASMBmQEmAf8BKgGaAS0B/wFwAbkBcgH/AdIB6gHSAf8BswHbAbQB/wGZAcsBmQH/A/4x/wP+Af8BswHb
AbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/
AXIBvAF0Af8BIwGZASYB/wEqAZoBLQH/AXABuQFyAf8B0gHqAdIB/wGzAdsBtAH/AZkBywGZAf8D/jH/
A/4B/wHRAfoB1AH/Ac4B+gHRAf8B8AH5AfEB/wHxAewB8QH/A9kB/wPWAf8D4gH/A/4B/wP+Af8BcgG8
AXQB/wEjAZkBJgH/ASoBmgEtAf8BcAG5AXIB/wHSAeoB0gH/AbMB2wG0Af8BmQHLAZkB/wP+Mf8D/gH/
A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/A+IB/wP+Af8D/gH/AZ4B8wGkAf8BagHoAXQB/wFqAegBdAH/
AZQB8AGaAf8B4AH4AeIB/wH0AfAB9AH/A+wB/wP+Mf8D/gH/A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/
A+IB/wP+Af8B4AHxAeEB/wE/AakBQQH/ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHL
AZkB/wP+Of8D/gH/AcEB4gHCAf8BPwGpAUEB/wETAYgBFQH/AR8BigEhAf8BGgGMARwB/wEiAZIBJAH/
AdIB6gHSAf8B4AHxAeEB/wE/AakBQQH/ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHL
AZkB/wP+Of8D/gH/AfQB8AH0Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af8B4AHxAeEB/wE/AakBQQH/
ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHLAZkB/wP+Of8D/gH/A/EB/wPcAf8D2QH/
A9kB/wPZAf8D2QH/A/kB/wHqAfgB6wH/AXoB8gGBAf8BdQHxAX4B/wFxAesBegH/AWoB6AF0Af8BWgHd
AWMB/wGkAesBqQH/A/45/wP+Af8D8QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D+QH/AasB2AGsAf8BLgGi
ATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGjATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/
ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGi
ATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGjATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wPsAf8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPsAf8BqwHYAawB/wEuAaIBMgH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/
ARMBiAEVAf8BkgHJAZMB/wP+Of8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wHKAfkBzQH/
AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AXEB6wF6Af8BQAHPAUoB/wGkAeYBqAH/A/45/wP+Af8D7AH/
A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/AYQByAGGAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BKgGa
AS0B/wEhAYwBIwH/AdsB7AHbQf8B6AH1AegB/wFLAbABTQH/ASYBmAEpAf8BIgGSASQB/wEiAZIBJAH/
ARMBiAEVAf8BagG0AWsB/wGEAcgBhgH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/ASoBmgEtAf8BIQGM
ASMB/wHbAewB20H/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wGEAcgBhgH/ASkBoAEsAf8BNgGk
ATkB/wE2AaQBOQH/ASoBmgEtAf8BIQGMASMB/wHbAewB20H/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/
A+IB/wGqAfwBsQH/AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AWgB5QFxAf8BQgHLAUoB/wHgAfEB4UH/
A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wFpAbsBawH/AS4BogEyAf8BNgGkATkB/wE2AaQBOQH/
ASIBkgEkAf8BPgGbAUAB/wH5AfwB+UH/A/4B/wFtAcABbwH/ASMBmQEmAf8BHwGKASEB/wEfAZIBIQH/
ARcBjAEZAf8BSQGlAUwB/wFpAbsBawH/AS4BogEyAf8BNgGkATkB/wE2AaQBOQH/ASIBkgEkAf8BPgGb
AUAB/wH5AfwB+UH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wFpAbsBawH/AS4BogEyAf8BNgGk
ATkB/wE2AaQBOQH/ASIBkgEkAf8BPgGbAUAB/wH5AfwB+UH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/
A+IB/wGaAfkBoQH/AXoB8gGBAf8BegHyAYEB/wF6AfIBgQH/AVoB4AFjAf8BWwHQAWIB/wH5AfwB+UH/
A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wHLAegBywH/AbkB4AG6Af8BuQHgAboB/wG5AeABugH/
AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/AdIB6gHSAf8BuAHdAbkB/wGzAdsBtAH/AbMB2wG0Af8BswHb
AbQB/wG/AeABwAH/AcsB6AHLAf8BuQHgAboB/wG5AeABugH/AbkB4AG6Af8BswHbAbQB/wHBAeIBwgH/
A/5B/wP+Af8B9QH0AfUB/wPxAf8D8QH/A/EB/wPxAf8B9QH0AfUB/wHLAegBywH/AbkB4AG6Af8BuQHg
AboB/wG5AeABugH/AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/
AfUB9AH1Af8B3QH7AeAB/wHRAfoB1AH/AdQB/AHYAf8B1AH8AdgB/wHFAfIByAH/Ac0B8wHQAf8D/kH/
A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/AZIB0AGTAf8BfAHCAX0B/wF8AcIBfQH/
AXwBwgF9Af8BaQG7AWsB/wGJAcIBigH/A/5B/wP+Af8BzgH6AdEB/wGeAfMBpAH/AYwB5gGSAf8BjAHm
AZIB/wGMAeYBkgH/AZwB7AGhAf8BkgHQAZMB/wF8AcIBfQH/AXwBwgF9Af8BfAHCAX0B/wFpAbsBawH/
AYkBwgGKAf8D/kH/A/4B/wPsAf8D4gH/A+IB/wPiAf8D4gH/A+kB/wGSAdABkwH/AXwBwgF9Af8BfAHC
AX0B/wF8AcIBfQH/AWkBuwFrAf8BiQHCAYoB/wP+Qf8D/gH/A+wB/wPiAf8D4gH/A+IB/wPiAf8D6QH/
AZIByQGTAf8BdQHAAXYB/wF4AcABeQH/AXwBwgF9Af8BagG0AWsB/wGIAb8BiQH/A/5B/wP+Af8D7AH/
A+IB/wPiAf8D4gH/A+IB/wPpAf8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/
ATQBlQE2Af8B+QH8AflB/wP+Af8BngHzAaQB/wFfAeIBaQH/AUkB0gFSAf8BSwHZAVQB/wFCAdABSwH/
AWwB2wF0Af8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5
AfFB/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGj
ATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5AfFB/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf8BaQG7
AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5AfFB/wP+Af8D4gH/
A9YB/wPZAf8D2QH/A9YB/wPiAf8BiQHIAYoB/wEyAaMBNAH/ATsBqQE9Af8BOwGpAT0B/wEyAaMBNAH/
AR8BigEhAf8B1wHqAdhB/wHvAfwB8AH/AYIB8QGKAf8BXwHiAWkB/wFVAdsBXgH/AVUB2wFeAf8BSQHS
AVIB/wGMAeYBkgH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/
AdcB6gHYQf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/
ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/
AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8D+QH/
A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp
AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wHFAfoByQH/AWcB7AFxAf8BWgHdAWMB/wFaAd0BYwH/
AVUB2wFeAf8BSwHZAVQB/wGwAewBtAH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOQGh
ATsB/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPsAf8BswHb
AbQB/wEyAaMBNAH/ATsBqQE9Af8BOwGpAT0B/wE5AaEBOwH/AQoBgwEMAf8BiQHCAYoB/wP+Of8D/gH/
A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wGzAdsBtAH/ATIBowE0Af8BOwGpAT0B/wE7AakBPQH/
ATkBoQE7Af8BCgGDAQwB/wGJAcIBigH/A/45/wP+Af8D7AH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D7AH/
AegB9QHoAf8BSwGwAU0B/wE7AakBPQH/ATIBowE0Af8BMgGjATQB/wFnAbYBaQH/AckB4gHJAf8B+QH8
Afk5/wP+Af8B6gH4AesB/wGeAfMBpAH/AVoB3QFjAf8BVQHbAV4B/wFVAdsBXgH/AVoB3QFjAf8B4AH4
AeIB/wHoAfUB6AH/AUsBsAFNAf8BOwGpAT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2AWkB/wHJAeIByQH/
AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wHoAfUB6AH/AUsBsAFNAf8BOwGp
AT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2AWkB/wHJAeIByQH/AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/
A9kB/wPZAf8D2QH/A/kB/wHoAfUB6AH/AUsBsAFNAf8BOwGpAT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2
AWkB/wHJAeIByQH/AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Af8BfAHC
AX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/
A+kB/wPiAf8B+AHyAfgB/wHRAfoB1AH/AXwB5wGDAf8BSwHZAVQB/wGDAeEBiQH/A/4B/wP+Af8BfAHC
AX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/
A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/
AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0
AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/AVsBsQFdAf8BuQHg
AboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/
A+IB/wPWAf8D4gH/A/4B/wP+Af8BzgHrAdAB/wGfAdUBoQH/AdwB8AHdAf8BmgHSAZsB/wFDAasBRQH/
ASYBmAEpAf8BEgGEARQB/wGQAcUBkQH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D2QH/Ae0B6AHtAf8B9QH0
AfUB/wG0AfMBuAH/AdAB8wHTAf8D/gH/A/4B/wHLAegBywH/AZ8B1QGhAf8B3AHwAd0B/wGaAdIBmwH/
AUMBqwFFAf8BJgGYASkB/wESAYQBFAH/AZABxQGRAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/
A/kB/wPxAf8B9QH0AfUB/wP+Af8D/gH/AcsB6AHLAf8BnwHVAaEB/wHcAfAB3QH/AZoB0gGbAf8BQwGr
AUUB/wEmAZgBKQH/ARIBhAEUAf8BkAHFAZEB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPpAf8D+QH/
A/EB/wH1AfQB9QH/A/4B/wP+Af8BywHoAcsB/wGfAdUBoQH/AdwB8AHdAf8BmgHSAZsB/wFDAasBRQH/
ASYBmAEpAf8BEgGEARQB/wGQAcUBkQH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D2QH/A+kB/wP5Af8D8QH/
AfUB9AH1Af8D/gX/A/4B/wHSAeoB0gH/AVIBsgFUAf8BMgGjATQB/wE7AakBPQH/AT8BqQFBAf8BLgGc
ATEB/wESAYQBFAH/AYIBvQGDAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
A9wB/wH0AfAB9AH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/
AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D8QH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/
AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D8QH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/
AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D8QH/A/4J/wP+Af8B4AHxAeEB/wFLAbABTQH/ATgBqAE6Af8BPwGpAUEB/wE7AakBPQH/
AT8BqQFBAf8BIwGZASYB/wGJAcIBigH/AaoB0gGrAf8BggG9AYMB/wHbAewB2wH/AfkB/AH5Af8D/gH/
A/4B/wP+Af8D+QH/A+wB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Cf8D/gH/
AeAB8QHhAf8BSwGwAU0B/wE4AagBOgH/AT8BqQFBAf8BOwGpAT0B/wE/AakBQQH/ASMBmQEmAf8BiQHC
AYoB/wGqAdIBqwH/AYIBvQGDAf8B2wHsAdsB/wH5AfwB+QH/A/4B/wP+Af8D/gH/A/kB/wPsAf8D7AH/
A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D/gn/A/4B/wHgAfEB4QH/AUsBsAFNAf8BOAGo
AToB/wE/AakBQQH/ATsBqQE9Af8BPwGpAUEB/wEjAZkBJgH/AYkBwgGKAf8BqgHSAasB/wGCAb0BgwH/
AdsB7AHbAf8B+QH8AfkB/wP+Af8D/gH/A/4B/wP5Af8D7AH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D+QH/A/4J/wP+Af8B4AHxAeEB/wFLAbABTQH/ATsBqQE9Af8BPwGpAUEB/wE7AakBPQH/
AT8BqQFBAf8BIwGZASYB/wGJAcIBigH/AaoB0gGrAf8BggG9AYMB/wHbAewB2wH/AfkB/AH5Af8D/gH/
A/4B/wP+Af8D+QH/A+wB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Df8D/gH/
AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGi
AUQB/wEQAYgBEQH/ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/
A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/
AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/ASEBjAEjAf8BNAGV
ATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/
A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/
AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/
A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGp
AT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/
ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/
A9kB/wPZAf8D2QH/A/EB/wP+Ff8D/gH/AbMB2wG0Af8BOwGpAT0B/wE4AagBOgH/ATYBpAE5Af8BuQHg
AboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/ARwBkAEeAf8BfAHCAX0B/wH0AfAB9AH/
A9YB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPsAf8D/hn/A/4B/wGzAdsBtAH/
ATsBqQE9Af8BOAGoAToB/wE2AaQBOQH/AbkB4AG6Af8BmgHSAZsB/wEyAaMBNAH/ATsBqQE9Af8BMgGj
ATQB/wEcAZABHgH/AXwBwgF9Af8B9AHwAfQB/wPWAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D2QH/
A9kB/wPZAf8D7AH/A/4Z/wP+Af8BswHbAbQB/wE7AakBPQH/ATgBqAE6Af8BNgGkATkB/wG5AeABugH/
AZoB0gGbAf8BMgGjATQB/wE7AakBPQH/ATIBowE0Af8BHAGQAR4B/wF8AcIBfQH/AfQB8AH0Af8D1gH/
A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A+wB/wP+Gf8D/gH/AbMB2wG0Af8BOwGp
AT0B/wE4AagBOgH/ATYBpAE5Af8BuQHgAboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/
ARwBkAEeAf8BfAHCAX0B/wH0AfAB9AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wPZAf8D2QH/
A9kB/wPsAf8D/h3/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGp
AT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/
AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/AfQB8AH0Af8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHA
AW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/
AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/
AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BMgGj
ATQB/wGJAcgBigH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iX/
A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/
A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/
A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/
A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/i3/
A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHI
AYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/A9wB/wPiAf8B9AHwAfQB/wP+Af8D/jH/A/4B/wP+Af8BzgHr
AdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wH0AfAB9AH/
A9YB/wPWAf8D2QH/A9wB/wPiAf8B9QH0AfUB/wP+Af8D/jH/A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/
AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/
A9wB/wPiAf8B9QH0AfUB/wP+Af8D/jH/A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGo
AToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/A9wB/wPiAf8B9QH0
AfUB/wP+Af8D/jn/A/4B/wP+Af8B8AH5AfEB/wG5AeABugH/AZIB0AGTAf8BbQHAAW8B/wGkAdgBpQH/
AfQB8AH0Af8D4gH/A+kB/wPxAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wHqAfgB6wH/AbkB4AG6Af8BkgHQ
AZMB/wFtAcABbwH/AaQB2AGlAf8B9AHwAfQB/wPiAf8D6QH/A/EB/wP5Af8D/gH/A/5B/wP+Af8D/gH/
AeoB+AHrAf8BuQHgAboB/wGSAdABkwH/AW0BwAFvAf8BpAHYAaUB/wH0AfAB9AH/A+IB/wPpAf8D8QH/
A/kB/wP+Af8D/kH/A/4B/wP+Af8B6gH4AesB/wG5AeABugH/AZIB0AGTAf8BbQHAAW8B/wGkAdgBpQH/
AfQB8AH0Af8D4gH/A+kB/wPxAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wHgAfgB4gH/AbQB7AG4Af8BkAHm
AZYB/wFsAdsBdAH/AbEB8QG1Af8BoAHRAaEB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/
A/4B/wP+Qf8D/gH/A/4B/wHbAewB2wH/AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/AZkBywGZAf8BqgHS
AasB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/A/4B/wP+Qf8D/gH/A/4B/wHcAfAB3QH/
AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/AZkBywGZAf8BqgHSAasB/wFCAaIBRAH/AWoBtAFrAf8BmQHL
AZkB/wHbAewB2wH/A/4B/wP+Qf8D/gH/A/4B/wHcAfAB3QH/AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/
AZkBywGZAf8BqgHSAasB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/A/4B/wP+Of8D/gH/
A/4B/wHNAfMB0AH/AYMB4QGJAf8BWgHdAWMB/wFLAdkBVAH/AUkB0gFSAf8BQgHQAUsB/wGhAeoBpgH/
AZIByQGTAf8BCgGDAQwB/wETAYgBFQH/ARMBiAEVAf8BIgGSASQB/wFZAawBWwH/AbMB2wG0Af8D/gH/
A/4x/wP+Af8D/gH/Ab8B4AHAAf8BYQGxAWIB/wEqAZoBLQH/ARoBjAEcAf8BFwGMARkB/wEQAYgBEQH/
AYUBwgGGAf8BkgHJAZMB/wEKAYMBDAH/ARMBiAEVAf8BEwGIARUB/wEiAZIBJAH/AVkBrAFbAf8BswHb
AbQB/wP+Af8D/jH/A/4B/wP+Af8BvwHgAcAB/wFhAbEBYgH/ASoBmgEtAf8BGgGMARwB/wEXAYwBGQH/
ARABiAERAf8BhQHCAYYB/wGSAckBkwH/AQoBgwEMAf8BEwGIARUB/wETAYgBFQH/ASIBkgEkAf8BWQGs
AVsB/wGzAdsBtAH/A/4B/wP+Mf8D/gH/A/4B/wHBAeIBwgH/AWEBsQFiAf8BKgGaAS0B/wEcAZABHgH/
ARcBjAEZAf8BEAGIAREB/wGFAcIBhgH/AZYByQGYAf8BCgGDAQwB/wETAYgBFQH/ARMBiAEVAf8BIgGS
ASQB/wFZAawBWwH/AbMB2wG0Af8D/gH/A/4t/wP+Af8B9QH0AfUB/wH4AfIB+AH/AakB6QGtAf8BSwHZ
AVQB/wFVAdsBXgH/AVUB2wFeAf8BVQHbAV4B/wFJAdIBUgH/AaQB6wGpAf8BlgHJAZgB/wETAYgBFQH/
ASIBkgEkAf8BHwGSASEB/wEaAYwBHAH/AQoBgwEMAf8BagG0AWsB/wHJAeIByQH/AcEB4gHCAf8D/in/
A/4B/wHJAeIByQH/AbkB4AG6Af8BkgHJAZMB/wETAYgBFQH/ASIBkgEkAf8BIgGSASQB/wEiAZIBJAH/
ARcBjAEZAf8BiQHCAYoB/wGZAcsBmQH/ARMBiAEVAf8BIgGSASQB/wEfAZIBIQH/ARoBjAEcAf8BCgGD
AQwB/wFqAbQBawH/AckB4gHJAf8BwQHiAcIB/wP+Kf8D/gH/AckB4gHJAf8BvwHgAcAB/wGSAckBkwH/
ARMBiAEVAf8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGI
ARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEKAYMBDAH/AWoBtAFrAf8ByQHiAckB/wHBAeIBwgH/
A/4p/wP+Af8ByQHiAckB/wG5AeABugH/AZIByQGTAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BIgGS
ASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/ASIBkgEkAf8BHwGSASEB/wEaAYwBHAH/
AQoBgwEMAf8BagG0AWsB/wHJAeIByQH/AcEB4gHCAf8D/iX/A/4B/wPxAf8D2QH/A9wB/wHvAfwB8AH/
AXUB5QF9Af8BVQHbAV4B/wFaAd0BYwH/AVUB2wFeAf8BSQHSAVIB/wGkAesBqQH/AZIByQGTAf8BEwGI
ARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/
AZkBywGZAf8D/iH/A/4B/wGrAdgBrAH/AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGS
ASQB/wEnAZYBKQH/AScBlgEpAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/
ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/iH/
A/4B/wGrAdgBrAH/AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGSASQB/wEnAZYBKQH/
ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGM
ARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/iH/A/4B/wGrAdgBrAH/
AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGSASQB/wEnAZYBKQH/AScBlgEpAf8BFwGM
ARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/
AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/h3/A/4B/wPsAf8D2QH/A9kB/wPZAf8B8QHs
AfEB/wHFAfIByAH/AVUB2wFeAf8BWgHdAWMB/wFaAeABYwH/AVoB4AFjAf8BsQH7AbYB/wGZAcsBmQH/
ARwBkAEeAf8BJwGWASkB/wEiAZIBJAH/ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/ARMBiAEVAf8BGgGM
ARwB/wETAYgBFQH/AYcBwgGIAf8D/hn/A/4B/wGaAdIBmwH/ASMBmQEmAf8BJgGYASkB/wEfAZIBIQH/
AZIByQGTAf8BuAHdAbkB/wEiAZIBJAH/AScBlgEpAf8BJgGYASkB/wEcAZABHgH/AYkByAGKAf8BmgHS
AZsB/wEcAZABHgH/AScBlgEpAf8BIgGSASQB/wETAYgBFQH/AZYByQGYAf8BqgHSAasB/wETAYgBFQH/
ARoBjAEcAf8BEgGEARQB/wGHAcIBiAH/A/4Z/wP+Af8BmgHSAZsB/wEjAZkBJgH/ASYBmAEpAf8BHwGS
ASEB/wGSAckBkwH/AbgB3QG5Af8BIgGSASQB/wEnAZYBKQH/ASYBmAEpAf8BHAGQAR4B/wGJAcgBigH/
AZoB0gGbAf8BHAGQAR4B/wEnAZYBKQH/ASIBkgEkAf8BEwGIARUB/wGWAckBmAH/AaoB0gGrAf8BEwGI
ARUB/wEaAYwBHAH/ARIBhAEUAf8BhwHCAYgB/wP+Gf8D/gH/AZoB0gGbAf8BIwGZASYB/wEmAZgBKQH/
AR8BkgEhAf8BkgHJAZMB/wG4Ad0BuQH/ASIBkgEkAf8BJwGWASkB/wEmAZgBKQH/ARwBkAEeAf8BiQHI
AYoB/wGaAdIBmwH/ARwBkAEeAf8BJwGWASkB/wEiAZIBJAH/ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/
ARMBiAEVAf8BGgGMARwB/wETAYgBFQH/AYcBwgGIAf8D/hX/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/
AdwB2gHcAf8B9QH0AfUB/wGKAewBkQH/AWcB7AFxAf8BggHxAYoB/wGaAfkBoQH/AdgB+gHbAf8BwQHi
AcIB/wFtAcABbwH/AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/
ASIBkgEkAf8BGgGMARwB/wESAYQBFAH/AZYByQGYAf8D/hH/A/4B/wGrAdgBrAH/ASYBmAEpAf8BKgGa
AS0B/wEqAZoBLQH/ASoBmgEtAf8BMQGdATMB/wHSAeoB0gH/AWkBuwFrAf8BIwGZASYB/wFIAa0BSwH/
AWIBugFjAf8BuQHgAboB/wHBAeIBwgH/AW0BwAFvAf8BUgGyAVQB/wEyAaMBNAH/AVMBqQFVAf8B2wHs
AdsB/wE/AZ0BQQH/ARoBjAEcAf8BIgGSASQB/wEaAYwBHAH/ARIBhAEUAf8BlgHJAZgB/wP+Ef8D/gH/
AasB2AGsAf8BJgGYASkB/wEqAZoBLQH/ASoBmgEtAf8BKgGaAS0B/wExAZ0BMwH/AdIB6gHSAf8BaQG7
AWsB/wEjAZkBJgH/AUoBrAFNAf8BYgG6AWMB/wG5AeABugH/AcEB4gHCAf8BbQHAAW8B/wFSAbIBVAH/
ATIBowE0Af8BUwGpAVUB/wHbAewB2wH/AT8BnQFBAf8BGgGMARwB/wEiAZIBJAH/ARoBjAEcAf8BEgGE
ARQB/wGWAckBmAH/A/4R/wP+Af8BqwHYAawB/wEmAZgBKQH/ASoBmgEtAf8BKgGaAS0B/wEqAZoBLQH/
ATEBnQEzAf8B0gHqAdIB/wFpAbsBawH/ASMBmQEmAf8BSAGtAUsB/wFiAboBYwH/AbkB4AG6Af8BwQHi
AcIB/wFtAcABbwH/AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/
ASIBkgEkAf8BGgGMARwB/wETAYgBFQH/AZYByQGYAf8D/g3/A/4B/wP5Af8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D4gH/AeAB+AHiAf8BxQH6AckB/wHwAfkB8QH/A/4B/wP+Af8D/gH/A/4B/wHwAfkB8QH/
AbMB2wG0Af8BywHoAcsB/wGSAdABkwH/AR8BkgEhAf8BHwGSASEB/wEfAZIBIQH/ASEBjAEjAf8BGgGM
ARwB/wEaAYwBHAH/AckB4gHJAf8D/gn/A/4B/wHbAewB2wH/ATIBowE0Af8BJgGYASkB/wEuAZwBMQH/
AS4BnAExAf8BLgGcATEB/wEfAZIBIQH/AWEBsQFiAf8B0gHqAdIB/wGrAdgBrAH/AegB9QHoAf8D/gH/
A/4B/wP+Af8D/gH/AfAB+QHxAf8BswHbAbQB/wHLAegBywH/AZIB0AGTAf8BHwGSASEB/wEfAZIBIQH/
AR8BkgEhAf8BHwGSASEB/wEaAYwBHAH/ARoBjAEcAf8ByQHiAckB/wP+Cf8D/gH/AdwB8AHdAf8BMgGj
ATQB/wEmAZgBKQH/AS4BnAExAf8BLgGcATEB/wEuAZwBMQH/AR8BkgEhAf8BYQGxAWIB/wHSAeoB0gH/
AasB2AGsAf8B6AH1AegB/wP+Af8D/gH/A/4B/wP+Af8B8AH5AfEB/wGzAdsBtAH/AcsB6AHLAf8BkgHQ
AZMB/wEfAZIBIQH/AR8BkgEhAf8BIgGSASQB/wEiAZIBJAH/ARoBjAEcAf8BGgGMARwB/wHJAeIByQH/
A/4J/wP+Af8B3AHwAd0B/wEyAaMBNAH/ASYBmAEpAf8BLgGcATEB/wEuAZwBMQH/AS4BnAExAf8BHwGS
ASEB/wFhAbEBYgH/AdIB6gHSAf8BqwHYAawB/wHqAfgB6wH/A/4B/wP+Af8D/gH/A/4B/wHqAfgB6wH/
AbMB2wG0Af8BywHoAcsB/wGSAdABkwH/AR8BkgEhAf8BHwGSASEB/wEiAZIBJAH/ASEBjAEjAf8BGgGM
ARwB/wEaAYwBHAH/AckB4gHJAf8D/gn/A/4B/wP5Af8D6QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/
A/4B/wP+Gf8D/gH/A/4B/wGrAdgBrAH/AUUBsAFHAf8BKgGaAS0B/wEfAZIBIQH/ARcBjAEZAf8BGgGM
ARwB/wFqAbQBawH/AdsB7AHbAf8D/gn/A/4B/wHgAfEB4QH/AYkByAGKAf8BMgGjATQB/wEjAZkBJgH/
AS4BnAExAf8BKgGaAS0B/wEnAZYBKQH/AZIByQGTAf8D/gH/A/4Z/wP+Af8D/gH/AasB2AGsAf8BRQGw
AUcB/wEqAZoBLQH/AR8BkgEhAf8BFwGMARkB/wEaAYwBHAH/AWoBtAFrAf8B2wHsAdsB/wP+Cf8D/gH/
AeAB8QHhAf8BkgHJAZMB/wEyAaMBNAH/ASMBmQEmAf8BLgGcATEB/wEqAZoBLQH/AScBlgEpAf8BkgHJ
AZMB/wP+Af8D/hn/A/4B/wP+Af8BqwHYAawB/wFFAbABRwH/ASoBmgEtAf8BHwGKASEB/wEXAYwBGQH/
ARoBjAEcAf8BagG0AWsB/wHcAfAB3QH/A/4J/wP+Af8B4AHxAeEB/wGSAckBkwH/ATIBowE0Af8BIwGZ
ASYB/wEuAZwBMQH/ASoBmgEtAf8BJwGWASkB/wGSAckBkwH/A/4B/wP+Gf8D/gH/A/4B/wGrAdgBrAH/
AUUBsAFHAf8BKgGaAS0B/wEfAYoBIQH/ARcBjAEZAf8BGgGMARwB/wFqAbQBawH/AdwB8AHdAf8D/gX/
A/4B/wPxAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D2QH/A9kB/wPxAf8D/in/A/4B/wHBAeIBwgH/
AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/AaoB0gGrAf8D/gH/
A/4B/wHRAfoB1AH/AYkB8wGQAf8B1AH8AdgB/wHSAeoB0gH/AXIBvAF0Af8BIgGSASQB/wEcAZABHgH/
AaoB0gGrAf8D/in/A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHi
AckB/wFTAakBVQH/AaoB0gGrAf8D/gH/A/4B/wG5AeABugH/AVYBsQFZAf8BwQHiAcIB/wHSAeoB0gH/
AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/AaoB0gGrAf8D/in/A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGS
ASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/AaoB0gGrAf8D/gH/A/4B/wG5AeABugH/
AVIBsgFUAf8BwQHiAcIB/wHSAeoB0gH/AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/AaoB0gGrAf8D/in/
A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/
AaoB0gGrAf8D/gH/A/4B/wPiAf8D1gH/A9kB/wPiAf8B9QH0AfUB/wPxAf8D7AH/A/4x/wP+Af8BswHb
AbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/
AZ4B8wGkAf8BagHoAXQB/wFqAegBdAH/AZ4B8wGkAf8B4AH4AeIB/wGzAdsBtAH/AZkBywGZAf8D/jH/
A/4B/wGzAdsBtAH/AbMB2wG0Af8B2wHsAdsB/wF5AbwBewH/ASIBkgEkAf8BCgGDAQwB/wFTAakBVQH/
A/4B/wP+Af8BcgG8AXQB/wEjAZkBJgH/ASoBmgEtAf8BcAG5AXIB/wHSAeoB0gH/AbMB2wG0Af8BmQHL
AZkB/wP+Mf8D/gH/AbMB2wG0Af8BswHbAbQB/wHbAewB2wH/AXkBvAF7Af8BIgGSASQB/wEKAYMBDAH/
AVMBqQFVAf8D/gH/A/4B/wFyAbwBdAH/ASMBmQEmAf8BKgGaAS0B/wFwAbkBcgH/AdIB6gHSAf8BswHb
AbQB/wGZAcsBmQH/A/4x/wP+Af8BswHbAbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/
AQoBgwEMAf8BUwGpAVUB/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/45/wP+Af8BwQHi
AcIB/wFCAaIBRAH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHqAfgB6wH/
AXoB8gGBAf8BdQHxAX4B/wFxAesBegH/AWoB6AF0Af8BWgHgAWMB/wGsAeoBsAH/A/45/wP+Af8BwQHi
AcIB/wFCAaIBRAH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHgAfEB4QH/
AT8BqQFBAf8BMgGjATQB/wEyAaMBNAH/ASoBmgEtAf8BJgGYASkB/wGZAcsBmQH/A/45/wP+Af8BwQHi
AcIB/wE/AakBQQH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHgAfEB4QH/
AT8BqQFBAf8BMgGjATQB/wEyAaMBNAH/ASoBmgEtAf8BJgGYASkB/wGZAcsBmQH/A/45/wP+Af8BwQHi
AcIB/wE/AakBQQH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wPxAf8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AcgB9AHMAf8BdQHxAX4B/wF6AfIBgQH/AXoB8gGBAf8BcQHr
AXoB/wFAAc8BSgH/AaQB5gGoAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGiATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
ATQB/wESAYQBFAH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGiATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
ATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/
ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wHoAfUB6AH/
AUsBsAFNAf8BJgGYASkB/wEfAZIBIQH/AR8BkgEhAf8BEwGIARUB/wFqAbQBawH/AaoB/AGxAf8BdQHx
AX4B/wF6AfIBgQH/AXoB8gGBAf8BaAHlAXEB/wFCAcsBSgH/AeAB8QHhQf8B6AH1AegB/wFLAbABTQH/
ASYBmAEpAf8BHwGSASEB/wEfAZIBIQH/ARMBiAEVAf8BagG0AWsB/wGEAcgBhgH/ASkBoAEsAf8BNgGk
ATkB/wE2AaQBOQH/ASoBmgEtAf8BIgGSASQB/wHbAewB20H/AegB9QHoAf8BSwGwAU0B/wEmAZgBKQH/
ASIBkgEkAf8BIgGSASQB/wETAYgBFQH/AWoBtAFrAf8BhAHIAYYB/wEpAaABLAH/ATYBpAE5Af8BNgGk
ATkB/wEqAZoBLQH/ASEBjAEjAf8B2wHsAdtB/wHoAfUB6AH/AUsBsAFNAf8BJgGYASkB/wEiAZIBJAH/
ASIBkgEkAf8BEwGIARUB/wFqAbQBawH/A+IB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/5B/wP+Af8BbQHA
AW8B/wEmAZgBKQH/AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/AUkBpQFMAf8BmgH5AaEB/wF4AfIBgQH/
AXoB8gGBAf8BegHyAYEB/wFaAeABYwH/AVkBzwFhAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEmAZgBKQH/
AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/AUkBpQFMAf8BaQG7AWsB/wEuAaIBMgH/ATYBpAE5Af8BNgGk
ATkB/wEiAZIBJAH/AT8BnQFBAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEmAZgBKQH/AR8BigEhAf8BIgGS
ASQB/wEXAYwBGQH/AUkBpQFMAf8BaQG7AWsB/wEuAaIBMgH/ATYBpAE5Af8BNgGkATkB/wEiAZIBJAH/
AT4BmwFAAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEjAZkBJgH/AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/
AUkBpQFMAf8B9QH0AfUB/wPxAf8D8QH/A/EB/wPxAf8B9QH0AfUB/wP+Qf8D/gH/AdIB6gHSAf8BuAHd
AbkB/wGzAdsBtAH/AbMB2wG0Af8BswHbAbQB/wHBAeIBwgH/Ad0B+wHgAf8B0QH6AdQB/wHRAfoB1AH/
AdQB/AHYAf8ByAH0AcwB/wHIAfQBzAH/A/5B/wP+Af8B0gHqAdIB/wG5AeABugH/AbMB2wG0Af8BswHb
AbQB/wGzAdsBtAH/AcEB4gHCAf8ByQHiAckB/wG5AeABugH/AbkB4AG6Af8BuQHgAboB/wGzAdsBtAH/
AcEB4gHCAf8D/kH/A/4B/wHSAeoB0gH/AbkB4AG6Af8BswHbAbQB/wGzAdsBtAH/AbMB2wG0Af8BvwHg
AcAB/wHJAeIByQH/AbkB4AG6Af8BuQHgAboB/wG5AeABugH/AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/
AdIB6gHSAf8BuAHdAbkB/wGzAdsBtAH/AbMB2wG0Af8BswHbAbQB/wHBAeIBwgH/A+kB/wPiAf8D4gH/
A+IB/wPiAf8D7AH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0AWsB/wFqAbQBawH/
AX8BvAGBAf8B7QHoAe0B/wHoAeQB6AH/AegB5AHoAf8B6AHkAegB/wHoAeQB6AH/AfEB7AHxAf8D/kH/
A/4B/wGkAdgBpQH/AXABuQFyAf8BagG0AWsB/wFqAbQBawH/AWoBtAFrAf8BfwG8AYEB/wGSAdABkwH/
AXwBwgF9Af8BfAHCAX0B/wF8AcIBfQH/AWkBuwFrAf8BiQHCAYoB/wP+Qf8D/gH/AaQB2AGlAf8BcAG5
AXIB/wFqAbQBawH/AWoBtAFrAf8BagG0AWsB/wF/AcEBgQH/AZIB0AGTAf8BfAHCAX0B/wF8AcIBfQH/
AXwBwgF9Af8BaQG7AWsB/wGJAcIBigH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0
AWsB/wFqAbQBawH/AX8BvAGBAf8D4gH/A9YB/wPZAf8D2QH/A9YB/wPcAf8D/kH/A/4B/wFiAboBYwH/
AR8BkgEhAf8BGgGMARwB/wEcAZABHgH/ARMBiAEVAf8BSQGlAUwB/wPiAf8D1gH/A9kB/wPZAf8D1gH/
A9wB/wP+Qf8B+QH8AfkB/wFiAboBYwH/AR8BkgEhAf8BGgGMARwB/wEcAZABHgH/ARMBiAEVAf8BSQGl
AUwB/wFpAbsBawH/ASkBoAEsAf8BMgGjATQB/wEyAaMBNAH/ARwBkAEeAf8BNAGVATYB/wH5AfwB+UH/
AfkB/AH5Af8BYgG6AWMB/wEfAZIBIQH/ARoBjAEcAf8BHAGQAR4B/wETAYgBFQH/AUkBpQFMAf8BaQG7
AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B+QH8AflB/wH7Af4B/AH/
AWIBugFjAf8BHwGSASEB/wEaAYwBHAH/ARwBkAEeAf8BEwGIARUB/wFJAaUBTAH/A+kB/wPZAf8D2QH/
A9kB/wPZAf8D2QH/A/lB/wHgAfEB4QH/AUMBqwFFAf8BKgGaAS0B/wEiAZIBJAH/ASIBkgEkAf8BGgGM
ARwB/wFwAbkBcgH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wHgAfEB4QH/AUMBqwFFAf8BKgGa
AS0B/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wFwAbkBcgH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/
ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8B5wH1AegB/wFDAasBRQH/ASoBmgEtAf8BIgGS
ASQB/wEiAZIBJAH/ARcBjAEZAf8BcAG5AXIB/wGJAcgBigH/ATIBowE0Af8BOwGpAT0B/wE7AakBPQH/
ATIBowE0Af8BHwGKASEB/wHXAeoB2EH/AeAB8QHhAf8BQwGrAUUB/wEqAZoBLQH/ASIBkgEkAf8BIgGS
ASQB/wEXAYwBGQH/AXABuQFyAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D7AH/A/45/wP+Af8BqwHY
AawB/wEjAZkBJgH/AScBlgEpAf8BJwGWASkB/wEnAZYBKQH/ARoBjAEcAf8BmQHLAZkB/wPxAf8D2QH/
A9kB/wPZAf8D2QH/A9YB/wPsAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/
AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp
AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/
AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp
AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/
AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/A/4B/wPcAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D/jn/
AfkB/AH5Af8B2wHsAdsB/wF/AcEBgQH/AScBlgEpAf8BHwGSASEB/wEiAZIBJAH/ASoBmgEtAf8B2wHs
AdsB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A/45/wH5AfwB+QH/AdsB7AHbAf8BfwHB
AYEB/wEnAZYBKQH/AR8BkgEhAf8BIgGSASQB/wEqAZoBLQH/AdsB7AHbAf8B5wH1AegB/wFKAawBTQH/
ATsBqQE9Af8BMgGjATQB/wEyAaMBNAH/AWEBsQFiAf8ByQHiAckB/wP+Of8B+QH8AfkB/wHbAewB2wH/
AX8BwQGBAf8BJwGWASkB/wEfAZIBIQH/ASIBkgEkAf8BKgGaAS0B/wHbAewB2wH/AeAB8QHhAf8BSwGw
AU0B/wE7AakBPQH/ATIBowE0Af8BMgGjATQB/wFnAbYBaQH/AckB4gHJAf8B+QH8Afk5/wH5AfwB+QH/
AdsB7AHbAf8BfwHBAYEB/wEnAZYBKQH/AR8BkgEhAf8BIgGSASQB/wEqAZoBLQH/AdsB7AHbAf8D/gH/
A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/A+kB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/
AckB4gHJAf8BWwGxAV0B/wETAYgBFQH/AWEBsQFiAf8D/gH/A/4B/wPiAf8D1gH/A+IB/wPxAf8D+QH/
A+IB/wPpAf8D/jH/A/4B/wGJAcgBigH/AVsBsQFdAf8B0gHqAdIB/wHJAeIByQH/AVsBsQFdAf8BEwGI
ARUB/wFhAbEBYgH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHqAfgB6wH/
AYMB4QGJAf8BhQHaAYoB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/AckB4gHJAf8BWwGx
AV0B/wETAYgBFQH/AWEBsQFiAf8D/gH/A/4B/wF8AcIBfQH/ASkBoAEsAf8BWwGxAV0B/wG5AeABugH/
AeAB8QHhAf8BYQGxAWIB/wF0AbUBdQH/A/4x/wP+Af8BiQHIAYoB/wFbAbEBXQH/AdIB6gHSAf8ByQHi
AckB/wFbAbEBXQH/ARMBiAEVAf8BYQGxAWIB/wP+Af8D/gH/AfUB9AH1Af8D7AH/A/kB/wPsAf8D3AH/
A9kB/wPZAf8D7AH/A/4p/wP+Af8BoAHRAaEB/wEjAZkBJgH/ASIBkgEkAf8BKgGaAS0B/wF8AcIBfQH/
AdIB6gHSAf8BoAHRAaEB/wHBAeIBwgH/A/4B/wP+Af8B9QH0AfUB/wPsAf8D+QH/A+wB/wPcAf8D2QH/
A9kB/wPsAf8D/in/A/4B/wGgAdEBoQH/ASIBkgEkAf8BIgGSASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHq
AdIB/wGgAdEBoQH/AcEB4gHCAf8D/gH/A/4B/wHLAegBywH/AZoB0gGbAf8B4AH4AeIB/wHFAfoByQH/
AZIB+wGZAf8BagHoAXQB/wE1AcUBPgH/AZsB4gGgAf8D/in/A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGS
ASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/AcEB4gHCAf8D/gH/A/4B/wHOAesB0AH/
AZoB0gGbAf8B3AHwAd0B/wGaAdIBmwH/AUUBsAFHAf8BJgGYASkB/wESAYQBFAH/AZABxQGRAf8D/in/
A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGSASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/
AcEB4gHCAf8D/gX/A/4B/wH1AfQB9QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wP+Af8D/hn/
A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGc
ATEB/wG4Ad0BuQH/A/4J/wP+Af8B9QH0AfUB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/
A/4Z/wP+Af8D/gH/AZkBywGZAf8BHAGQAR4B/wEqAZoBLQH/AS4BnAExAf8BKgGaAS0B/wEfAZIBIQH/
AS4BnAExAf8BuAHdAbkB/wP+Cf8D/gH/AeoB+AHrAf8BkgH7AZkB/wGDAfkBjAH/AYMB+QGMAf8BiQH6
AZEB/wFqAegBdAH/ATUBxQE+Af8BjwHdAZQB/wP+Af8D/hn/A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/
ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGcATEB/wG4Ad0BuQH/A/4J/wP+Af8B0gHq
AdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/
A/4B/wP+Gf8D/gH/A/4B/wGZAcsBmQH/ARwBkAEeAf8BKgGaAS0B/wEuAZwBMQH/ASoBmgEtAf8BHwGS
ASEB/wEuAZwBMQH/AbgB3QG5Af8D/gn/A/4B/wP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D6QH/
A/EB/wPsAf8D+QH/A/4B/wP+Af8D/gH/AfkB/AH5Af8B4AHvAeAB/wGJAcIBigH/AZYByQGYAf8BqgHS
AasB/wEjAZkBJgH/AS4BnAExAf8BLgGcATEB/wEqAZoBLQH/ASYBmAEpAf8BMQGdATMB/wHSAeoB0gH/
A/4J/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/
A/4B/wH5AfwB+QH/AeAB7wHgAf8BiQHCAYoB/wGWAckBmAH/AaoB0gGrAf8BIwGZASYB/wEuAZwBMQH/
AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AS4BnAExAf8B0gHqAdIB/wP+Cf8D/gH/AeoB+AHrAf8BkgH7
AZkB/wGDAfkBjAH/AYkB+gGRAf8BiQH6AZEB/wGJAfoBkQH/AWoB6AF0Af8BmAHlAZwB/wH1AfQB9QH/
A+wB/wP5Af8D/gH/A/4B/wP+Af8B+QH8AfkB/wHgAfEB4QH/AYkBwgGKAf8BlgHJAZgB/wGqAdIBqwH/
ASMBmQEmAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wEuAZwBMQH/AdIB6gHSAf8D/gn/
A/4B/wHgAfEB4QH/AUsBsAFNAf8BOAGoAToB/wE/AakBQQH/ATsBqQE9Af8BPwGpAUEB/wEjAZkBJgH/
AYkBwgGKAf8BqgHSAasB/wGCAb0BgwH/AdsB7AHbAf8B+QH8AfkB/wP+Af8D/gH/A/4B/wHgAfEB4QH/
AZ4B8wGkAf8BqQHpAa0B/wGqAdIBqwH/ASIBkgEkAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGY
ASkB/wEuAZwBMQH/AdIB6gHSAf8D/g3/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/
A9YB/wPZAf8D3AH/AfgB8gH4Af8BqgHSAasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/
AdIB6gHSAf8BcgG8AXQB/wEmAZgBKQH/AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/
A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/A9YB/wPZAf8D3AH/AfgB8gH4Af8BqgHS
AasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/AdIB6gHSAf8BcgG8AXQB/wEmAZgBKQH/
AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/A/4B/wHYAfoB2wH/AYkB+gGRAf8BiQH6
AZEB/wGJAfoBkQH/AYMB+QGMAf8BmgH5AaEB/wHwAfkB8QH/AeEB3gHhAf8D1gH/AdwB2gHcAf8D3AH/
AfgB8gH4Af8BqgHSAasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/AdIB6gHSAf8BcgG8
AXQB/wEmAZgBKQH/AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/A/4B/wG5AeABugH/
ATsBqQE9Af8BOwGpAT0B/wE/AakBQQH/ATYBpAE5Af8BXwG6AWEB/wHgAfEB4QH/AUIBogFEAf8BEAGI
AREB/wEfAYoBIQH/ATQBlQE2Af8BmQHLAZkB/wG5AewBvAH/AUwBzQFUAf8BTAHNAVQB/wFMAc0BVAH/
AWIB4gFsAf8B4AH4AeIB/wFyAbwBdAH/ASYBmAEpAf8BLgGcATEB/wEqAZoBLQH/ASYBmAEpAf8BqwHY
AawB/wP+Ff8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/
AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGj
ATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/
A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGa
AS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/
AdEB+gHUAf8BiQH6AZEB/wGDAfkBjAH/AYMB+QGMAf8B0QH6AdQB/wHxAewB8QH/A9kB/wPZAf8D2QH/
A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/
AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/AbMB2wG0Af8BOwGp
AT0B/wE4AagBOgH/ATYBpAE5Af8BuQHgAboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/
ARwBkAEeAf8BhQHCAYYB/wG0AfMBuAH/AVQB4AFdAf8BagHoAXQB/wFxAesBegH/AWoB6AF0Af8BngHz
AaQB/wHSAeoB0gH/ATIBowE0Af8BJgGYASkB/wEqAZoBLQH/AaAB0QGhAf8D/h3/A/4B/wPxAf8D3AH/
A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGk
ATkB/wE2AaQBOQH/ATIBowE0Af8BKgGaAS0B/wG5AeABugH/AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/
A/4h/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfEB7AHxAf8BmgHS
AZsB/wEpAaABLAH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/ASoBmgEtAf8BuQHgAboB/wGJAcgBigH/
ATYBpAE5Af8BswHbAbQB/wP+If8D/gH/AdgB+gHbAf8BkgH7AZkB/wGkAfoBqwH/AfUB9AH1Af8B3AHa
AdwB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/
ATIBowE0Af8BKgGaAS0B/wG5AeABugH/AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/A/4h/wP+Af8BwQHi
AcIB/wFLAbABTQH/AW0BwAFvAf8B0gHqAdIB/wFDAasBRQH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/
AS4BogEyAf8BkgHJAZMB/wHFAfoByQH/AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AXEB6wF6Af8BagHo
AXQB/wHRAfoB1AH/AYUBwgGGAf8BNgGkATkB/wGzAdsBtAH/A/4l/wP+Af8D+QH/A/kB/wPiAf8D1gH/
A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
ATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8D+QH/A/kB/wPiAf8D1gH/
A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BMgGj
ATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8B6gH4AesB/wHqAfgB6wH/
AegB5AHoAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/
ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8B4AHx
AeEB/wHcAfAB3QH/AXwBwgF9Af8BKQGgASwB/wE7AakBPQH/ATsBqQE9Af8BOwGpAT0B/wEuAaIBMgH/
AZIByQGTAf8BxQH6AckB/wF1AfEBfgH/AXoB8gGBAf8BegHyAYEB/wFxAesBegH/AWoB6AF0Af8BggHx
AYoB/wHgAfEB4QH/AdwB8AHdAf8D/i3/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/
AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHl
AcgB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/AfEB7AHxAf8BmgHS
AZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHlAcgB/wP+Af8D/jH/
A/4B/wP+Af8B9QH0AfUB/wHoAeQB6AH/A9wB/wPZAf8D1gH/A9YB/wHxAewB8QH/AZoB0gGbAf8BIwGZ
ASYB/wEpAaABLAH/ATIBowE0Af8BQwGrAUUB/wF8AcIBfQH/AccB5QHIAf8D/gH/A/4x/wP+Af8D/gH/
Ac4B6wHQAf8BhAHIAYYB/wFLAbABTQH/ATgBqAE6Af8BLgGiATIB/wEnAaABKQH/AYkByAGKAf8BxQH6
AckB/wF1AfEBfgH/AXUB8QF+Af8BdQHxAX4B/wGCAfEBigH/AaUB8gGqAf8B2AH6AdsB/wP+Af8D/jn/
A/4B/wP+Af8D/gH/A/EB/wPpAf8D4gH/AfgB8gH4Af8BswHbAbQB/wFpAbsBawH/AY4BzQGQAf8BuQHg
AboB/wHoAfUB6AH/A/4B/wP+Qf8D/gH/A/4B/wP+Af8D8QH/A+kB/wPiAf8B+AHyAfgB/wGzAdsBtAH/
AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/A/5B/wP+Af8D/gH/A/4B/wH1AfQB9QH/
A+wB/wPiAf8B+AHyAfgB/wGzAdsBtAH/AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/
A/5B/wP+Af8D/gH/AeoB+AHrAf8BuQHgAboB/wGSAdABkwH/AW0BwAFvAf8BqgHSAasB/wHRAfoB1AH/
AZ4B8wGkAf8BtAHzAbgB/wHRAfoB1AH/AfAB+QHxAf8D/gH/A/5J/wP+Af8D9gH/A+wB/wPjAf8D9QH/
A/cB/wPiAf8D6wH/A/YB/wP+Sf8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/A/EB/wPiAf8D4gH/
A+wB/wP5Af8D/gH/A/5B/wP+Af8D/gH/A/kB/wPxAf8D6QH/A+IB/wPsAf8D8QH/A+IB/wPiAf8D7AH/
A/kB/wP+Af8D/kH/A/4B/wP+Af8D+QH/A/EB/wPpAf8D4gH/A+wB/wPxAf8D4gH/A+IB/wPsAf8D+QH/
A/4B/wP+Qf8D+wH/A+cB/wPbAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPbAf8D5gH/
A/k5/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/
A9kB/wPiAf8D8QH/A/4B/wP+Mf8D/gH/A/4B/wH1AfQB9QH/A+IB/wPZAf8D2QH/A9kB/wPWAf8D6QH/
A+wB/wPWAf8D2QH/A9kB/wPZAf8D4gH/A/EB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPiAf8D2QH/
A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A+IB/wPxAf8D/gH/A/4x/wP9Af8D+wH/
A/MB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/AB/wP0Af8D2gH/A9oB/wPaAf8D2gH/A9oB/wPsAf8D/QH/
A/wt/wP+Af8B9QH0AfUB/wH1AfQB9QH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wPsAf8D2QH/
A9kB/wPZAf8D2QH/A9YB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A/4p/wP+Af8B9QH0AfUB/wH1AfQB9QH/
A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wPiAf8B9QH0
AfUB/wH1AfQB9QH/A/4p/wP+Af8B9QH0AfUB/wH1AfQB9QH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/
A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wHoAeQB6AH/AdAB8wHTAf8BzQHzAdAB/wP+Kf8D9wH/
A9sB/wPeAf8D/gH/A+IB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPaAf8D3QH/
A/0B/wPlAf8D2gH/A/Ul/wP+Af8D8QH/A9kB/wPcAf8D+QH/A+IB/wPZAf8D2QH/A9kB/wPZAf8D6QH/
A+wB/wPZAf8D2QH/A9kB/wPZAf8D3AH/AfUB9AH1Af8D4gH/A9kB/wPsAf8D/iH/A/4B/wPxAf8D2QH/
A9wB/wP5Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPcAf8B9QH0
AfUB/wPiAf8D2QH/A+wB/wP+If8D/gH/A/EB/wPZAf8D3AH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/
A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9wB/wHzAfcB8wH/AWwB2wF0Af8BQgHLAUoB/wGsAeoBsAH/
A/4h/wPzAf8D2gH/A9oB/wPaAf8D8gH/A/sB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/
A9oB/wPaAf8D9QH/A/kB/wPaAf8D2gH/A9oB/wPwHf8D/gH/A+wB/wPZAf8D2QH/A9kB/wPsAf8D8QH/
A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/
A+kB/wP+Gf8D/gH/A+wB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/
A9YB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A+kB/wP+Gf8D/gH/A+wB/wPZAf8D2QH/
A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wHxAewB8QH/
AbQB7AG4Af8BQgHLAUoB/wFCAcsBSgH/ATwBywFFAf8BmwHiAaAB/wP+Gf8D9wH/A9oB/wPaAf8D2gH/
A9oB/wPcAf8D/QH/A+kB/wPaAf8D3QH/A+UB/wP6Af8D+wH/A+UB/wPeAf8D2gH/A+EB/wP+Af8D4AH/
A9oB/wPaAf8D2gH/A9oB/wP0Ff8D/gH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D4gH/
A9YB/wPcAf8D4gH/A/EB/wH1AfQB9QH/A+IB/wPcAf8D2QH/A9wB/wP5Af8D3AH/A9kB/wPZAf8D2QH/
A9kB/wPsAf8D/hH/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wH1AfQB9QH/A+IB/wPWAf8D3AH/
A+IB/wPxAf8B9QH0AfUB/wPiAf8D3AH/A9kB/wPcAf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D7AH/
A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B9QH0AfUB/wPiAf8D1gH/A9wB/wPiAf8D8QH/
AfUB9AH1Af8D4gH/A9wB/wPZAf8B4QHeAeEB/wHqAfgB6wH/AVoB3QFjAf8BQgHQAUsB/wFJAdIBUgH/
AUIB0AFLAf8BPAHLAUUB/wGpAekBrQH/A/4R/wP+Af8D3AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D6AH/
A/0B/wP5Gf8D+QH/A/wB/wPwAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPbAf8D/Q3/A/4B/wP5Af8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/
AfUB9AH1Af8D6QH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/
AfUB9AH1Af8D6QH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/
AfgB8gH4Af8BvAH7AcEB/wFaAeABYwH/AUkB0gFSAf8BSQHSAVIB/wFJAdIBUgH/AUIBywFKAf8BQgHL
AUoB/wHWAfQB2AH/A/4N/wP+Af8D8AH/A9sB/wPaAf8D2gH/A9oB/wPaAf8D9Cn/A/YB/wPbAf8D2gH/
A9oB/wPaAf8D2gH/A+oB/wP+Df8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/gH/
A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D/gn/A/4B/wP5Af8D6QH/
A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPiAf8D+QH/A/4J/wP+Af8D+QH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Af8D/hn/
A/4B/wP+Af8B0QH6AdQB/wGaAfkBoQH/AWsB5QF0Af8BSAHSAVEB/wFCAdABSwH/AUIB0AFLAf8BiAHi
AY8B/wHgAfgB4gH/A/4J/wP6Af8D4QH/A/oB/wP9Af8D6QH/A9oB/wPaAf8D+TH/A/sB/wPbAf8D2gH/
A+QB/wP8Af8D/AH/A+UB/wP5Bf8D/gH/A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPZAf8D2QH/
A/EB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A/EB/wP+Af8D/gH/
A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPZAf8D2QH/A/EB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/
A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A/EB/wP+Af8D/gH/A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/
A+IB/wPZAf8D2QH/A/EB/wP+Kf8D/gH/Ad0B+wHgAf8BmgH5AaEB/wFaAeABYwH/AXQB3AF7Af8BzQHz
AdAB/wHJAeIByQH/AVQBpwFVAf8BqgHSAasB/wP+Bf8D6AH/A9oB/wPaAf8D6AH/A/0B/wP5Af8D9zn/
A/cB/wP2Af8D/gH/A+4B/wPbAf8D2gH/A+UF/wP+Af8D4gH/A9YB/wPZAf8D4gH/AfUB9AH1Af8D8QH/
A+wB/wP+Mf8D/gH/A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/A+IB/wP+Af8D/gH/A+IB/wPWAf8D2QH/
A+IB/wH1AfQB9QH/A/EB/wPsAf8D/jH/A/4B/wPsAf8D8QH/A/kB/wPpAf8D2QH/A9YB/wPiAf8D/gH/
A/4B/wPiAf8D1gH/A9kB/wPiAf8B9QH0AfUB/wPxAf8D7AH/A/4x/wP+Af8B0QH6AdQB/wHUAfwB2AH/
AdsB7AHbAf8BcgG8AXQB/wEfAYoBIQH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/A9wB/wPaAf8D2gH/
A9oB/wPaAf8D9kH/A/oB/wPdAf8D2gH/A9oB/wPaAf8D2wH/A/0B/wP5Af8D3AH/A9kB/wPZAf8D2QH/
A9kB/wPsAf8D/jn/A/4B/wPxAf8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D+QH/A9wB/wPZAf8D2QH/
A9kB/wPZAf8D7AH/A/45/wP+Af8D8QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D+QH/A/kB/wPcAf8D2QH/
A9kB/wPZAf8D2QH/A+wB/wP+Of8D/gH/AbkB4AG6Af8BQAGnAUIB/wETAYgBFQH/AR8BigEhAf8BGgGM
ARwB/wEiAZIBJAH/AdIB6gHSAf8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D9kH/A/kB/wPaAf8D2gH/
A9oB/wPaAf8D2gH/A/UB/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wPsAf8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/45/wP+Af8D7AH/
A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Of8D/gH/
AbMB2wG0Af8BMgGjATQB/wEiAZIBJAH/ASIBkgEkAf8BIgGSASQB/wETAYgBFQH/AZIByQGTAf8D7QH/
A9oB/wPaAf8D2gH/A9oB/wPcSf8D3QH/A9oB/wPaAf8D2gH/A9oB/wPrAf8D6QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D+UH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wPpAf8D2QH/A9kB/wPZAf8D2QH/
A9kB/wP5Qf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
A/lB/wHoAfUB6AH/AUsBsAFNAf8BJgGYASkB/wEiAZIBJAH/ASIBkgEkAf8BEwGIARUB/wFqAbQBawH/
A+YB/wPaAf8D2gH/A9oB/wPaAf8D4kn/A+YB/wPaAf8D2gH/A9oB/wPaAf8D4wH/A+IB/wPZAf8D2QH/
A9kB/wPZAf8D4gH/A/5B/wP+Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D4gH/A9kB/wPZAf8D2QH/
A9kB/wPiAf8D/kH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wPiAf8D2QH/A9kB/wPZAf8D2QH/
A+IB/wP+Qf8D/gH/AW0BwAFvAf8BJgGYASkB/wEfAYoBIQH/AR8BkgEhAf8BFwGMARkB/wFJAaUBTAH/
A/sB/wP5Af8D+QH/A/kB/wP5Af8D/Un/A/0B/wP5Af8D+QH/A/kB/wP5Af8D+wH/AfUB9AH1Af8D8QH/
A/EB/wPxAf8D8QH/AfUB9AH1Af8D/kH/A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/
AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/AfUB9AH1Af8D/kH/A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/
AfQB8QHzAf8B9QH0AfUB/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/A/5B/wP+Af8B0gHq
AdIB/wG4Ad0BuQH/AbMB2wG0Af8BswHbAbQB/wGzAdsBtAH/AcEB4gHCAf8D8AH/A+kB/wPqAf8D6gH/
A+kB/wP0Sf8D9gH/A+kB/wPqAf8D6gH/A+kB/wPvAf8D6QH/A+IB/wPiAf8D4gH/A+IB/wPsAf8D/kH/
A/4B/wPsAf8D4gH/A+IB/wPiAf8D4gH/A+kB/wPpAf8D4gH/A+IB/wPiAf8D4gH/A+wB/wP+Qf8D/gH/
AcUB+gHJAf8BlAHwAZoB/wGDAeEBiQH/AYMB4QGJAf8BgQHgAYYB/wGSAeYBmAH/A+kB/wPiAf8D4gH/
A+IB/wPiAf8D7AH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0AWsB/wFqAbQBawH/
AX8BvAGBAf8D5gH/A9oB/wPaAf8D2gH/A9oB/wPhSf8D5QH/A9oB/wPaAf8D2gH/A9oB/wPjAf8D4gH/
A9YB/wPZAf8D2QH/A9YB/wPcAf8D/kH/A/4B/wPiAf8D1gH/A9kB/wPZAf8D1gH/A+IB/wPiAf8D1gH/
A9kB/wPZAf8D1gH/A9wB/wP+Qf8D/gH/AZoB+QGhAf8BXwHiAWkB/wFJAdIBUgH/AUsB2QFUAf8BQgHQ
AUsB/wFsAdsBdAH/A+IB/wPWAf8D2QH/A9kB/wPWAf8D3AH/A/5B/wP+Af8BYgG6AWMB/wEfAZIBIQH/
ARoBjAEcAf8BHAGQAR4B/wETAYgBFQH/AUkBpQFMAf8D7gH/A9oB/wPaAf8D2gH/A9oB/wPbAf8D/kX/
A90B/wPaAf8D2gH/A9oB/wPaAf8D6wH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wP5Af8D3AH/
A9kB/wPZAf8D2QH/A9kB/wPiAf8D6QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D+UH/Ae8B/AHwAf8BggHx
AYoB/wFiAeIBbAH/AVUB2wFeAf8BVQHbAV4B/wFJAdIBUgH/AYwB5gGSAf8D6QH/A9kB/wPZAf8D2QH/
A9kB/wPZAf8D+UH/AeAB8QHhAf8BQwGrAUUB/wEqAZoBLQH/ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/
AXABuQFyAf8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D9kH/A/kB/wPaAf8D2gH/A9oB/wPaAf8D2gH/
A/YB/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wPsAf8D/jn/A/4B/wPsAf8D1gH/A9kB/wPZAf8D2QH/
A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D7AH/A/45/wP+Af8BxQH6AckB/wFnAewBcQH/
AVoB3QFjAf8BWgHdAWMB/wFVAdsBXgH/AUsB2QFUAf8BsAHsAbQB/wPxAf8D2QH/A9kB/wPZAf8D2QH/
A9YB/wPsAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/AScBlgEpAf8BGgGM
ARwB/wGZAcsBmQH/A/4B/wPdAf8D2gH/A9oB/wPaAf8D5gH/A/1B/wP+Af8D7AH/A9sB/wPaAf8D2gH/
A9wB/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wP+Of8D/gH/A/kB/wPpAf8D2QH/
A9kB/wPZAf8D2QH/A/kB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A/45/wH5AfwB+QH/
AeAB+AHiAf8BpQHyAaoB/wFaAd0BYwH/AVUB2wFeAf8BVQHbAV4B/wFaAd0BYwH/AeAB+AHiAf8D+QH/
A9wB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wP+Of8B+QH8AfkB/wHbAewB2wH/AX8BwQGBAf8BJwGW
ASkB/wEfAZIBIQH/ASIBkgEkAf8BKgGaAS0B/wHbAewB2wX/A+oB/wPaAf8D4AH/A/kB/wP+Af8D6gH/
A/A5/wPzAf8D5AH/A/0B/wP8Af8D5QH/A9oB/wPnBf8D/gH/A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/
A+kB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8D4gH/
A9YB/wPiAf8D8QH/A/kB/wPiAf8D6QH/A/4x/wP+Af8BiQHIAYoB/wFZAawBWwH/AckB4gHJAf8B2AH6
AdsB/wGDAesBiwH/AUsB2QFUAf8BgwHhAYkB/wP+Af8D/gH/A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/
A+kB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/AckB4gHJAf8BWwGxAV0B/wETAYgBFQH/
AWEBsQFiAf8D/gX/A/wB/wPyAf8D/gH/A/MB/wPcAf8D2gH/A9oB/wP3Mf8D+QH/A9oB/wPaAf8D2gH/
A+4B/wP+Af8D9gH/A/sF/wP+Af8B9QH0AfUB/wPsAf8D+QH/A+wB/wPcAf8D2QH/A9kB/wPsAf8D/in/
A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/kB/wPxAf8B9QH0AfUB/wP+Af8D/gH/AfUB9AH1Af8D7AH/
A/kB/wPsAf8D3AH/A9kB/wPZAf8D7AH/A/4p/wP+Af8BoAHRAaEB/wEjAZkBJgH/ASIBkgEkAf8BKgGa
AS0B/wF5AbwBewH/AdcB6gHYAf8BvAHxAcAB/wHQAfMB0wH/A/4B/wP+Af8B9QH0AfUB/wPsAf8D+QH/
A+wB/wPcAf8D2QH/A9kB/wPsAf8D/in/A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGSASQB/wEqAZoBLQH/
AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/AcEB4gHCAf8D/gn/A/wB/wPeAf8D2gH/A9oB/wPaAf8D2gH/
A9oB/wPyKf8D9gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2wH/A/oN/wP+Af8B9QH0AfUB/wPcAf8D2QH/
A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/
A9kB/wPxAf8D/gn/A/4B/wH1AfQB9QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wP+Af8D/hn/
A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGc
ATEB/wG4Ad0BuQH/A/4J/wP+Af8B9QH0AfUB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/
A/4Z/wP+Af8D/gH/AZkBywGZAf8BHAGQAR4B/wEqAZoBLQH/AS4BnAExAf8BKgGaAS0B/wEfAZIBIQH/
AS4BnAExAf8BuAHdAbkB/wP+Df8D/gH/A90B/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/IB/wP6Af8D9Rn/
A/YB/wP2Af8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D3AH/A/0N/wP+Af8D+QH/A9wB/wPZAf8D2QH/
A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/A/4B/wH7Af4B/AH/AeAB8QHhAf8BmwHi
AaAB/wGhAeoBpgH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D+QH/A/4J/wP+Af8D+QH/
A9wB/wPZAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/A/4B/wH5AfwB+QH/
AeAB7wHgAf8BiQHCAYoB/wGWAckBmAH/AaoB0gGrAf8BIwGZASYB/wEuAZwBMQH/AS4BnAExAf8BKgGa
AS0B/wEmAZgBKQH/ATEBnQEzAf8B0gHqAdIB/wP+Cf8D/gH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/
A9YB/wPpAf8D8QH/A+wB/wP5Af8D/gH/A/4B/wP+Af8B+QH8AfkB/wHgAe8B4AH/AYkBwgGKAf8BlgHJ
AZgB/wGqAdIBqwH/ASMBmQEmAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wExAZ0BMwH/
AdIB6gHSAf8D/hH/A/kB/wPaAf8D2gH/A9oB/wPaAf8D4gH/A/4B/wPgAf8D2gH/A9sB/wPhAf8D+AH/
A/oB/wPhAf8D3AH/A9oB/wPcAf8D/QH/A+kB/wPaAf8D2gH/A9oB/wPaAf8D9xX/A/4B/wPxAf8D2QH/
A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/A9YB/wPZAf8D3AH/AfgB8gH4Af8BtAHsAbgB/wFTAc0BWwH/
AUgBzQFRAf8BQgHQAUsB/wFaAeABYwH/AeAB+AHiAf8B6AHkAegB/wPZAf8D2QH/A9kB/wPZAf8D8QH/
A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A9wB/wPWAf8D2QH/A9wB/wH4AfIB+AH/
AaoB0gGrAf8BNAGVATYB/wEhAYwBIwH/ARMBiAEVAf8BKgGaAS0B/wHSAeoB0gH/AXIBvAF0Af8BJgGY
ASkB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wGrAdgBrAH/A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/
A9kB/wPiAf8D+QH/A9wB/wPWAf8D2QH/A9wB/wH4AfIB+AH/AaoB0gGrAf8BNAGVATYB/wEhAYwBIwH/
ARMBiAEVAf8BKgGaAS0B/wHSAeoB0gH/AXIBvAF0Af8BJgGYASkB/wEuAZwBMQH/ASoBmgEtAf8BJgGY
ASkB/wGrAdgBrAH/A/4Z/wP3Af8D2gH/A9oB/wPaAf8D+gH/A/MB/wPaAf8D2gH/A9oB/wPaAf8D8AH/
A/QB/wPaAf8D2gH/A9oB/wPaAf8D6gH/A/0B/wPbAf8D2gH/A9oB/wP0Hf8D/gH/A/EB/wPZAf8D2QH/
A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/Aa0B8gGyAf8BVAHgAV0B/wFqAegBdAH/
AXEB6wF6Af8BagHoAXQB/wGYAfMBnwH/AfUB9AH1Af8B3AHaAdwB/wPZAf8D2QH/A+wB/wP+Gf8D/gH/
A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/AZIByQGTAf8BFwGR
ARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/
ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/
A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/
AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+If8D+gH/A9wB/wPmAf8D/QH/
A9wB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/sB/wPvAf8D2wH/
A/gl/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfEB7AHxAf8BwQH9
AcUB/wF1AfEBfgH/AXoB8gGBAf8BeAHyAYEB/wFxAesBegH/AWoB6AF0Af8BygH5Ac0B/wHtAegB7QH/
A9kB/wPxAf8D/iH/A/4B/wPxAf8D3AH/A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B8QHs
AfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/ATIBowE0Af8BKgGaAS0B/wG5AeABugH/
AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/A/4h/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/
A9kB/wPZAf8D2QH/AfEB7AHxAf8BmgHSAZsB/wEpAaABLAH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/
ASoBmgEtAf8BuQHgAboB/wGJAcgBigH/ATYBpAE5Af8BswHbAbQB/wP+Kf8D/gH/A/4B/wPrAf8D2gH/
A9oB/wPaAf8D2gH/A9oB/wPwAf8D9AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D4wH/A/4B/wP+Lf8D/gH/
A/kB/wP5Af8D4gH/A9YB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wHBAf0BxQH/AXUB8QF+Af8BegHy
AYEB/wF6AfIBgQH/AXEB6wF6Af8BagHoAXQB/wGJAfMBkAH/AfAB+QHxAf8D+QH/A/4p/wP+Af8D+QH/
A/kB/wPiAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/
ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8D+QH/
A/kB/wPiAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/
ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/41/wP8Af8D6wH/
A90B/wPaAf8D2gH/A9oB/wPwAf8D9AH/A9oB/wPaAf8D2gH/A90B/wPqAf8D+zn/A/4B/wP+Af8B9QH0
AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/AfEB7AHxAf8BvAH7AcEB/wF1AfEBfgH/AXUB8QF+Af8BdQHx
AX4B/wGCAfEBigH/AaUB8gGqAf8B2AH6AdsB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/
A9kB/wPWAf8D1gH/AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/
AXwBwgF9Af8BxwHlAcgB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/
AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHl
AcgB/wP+Af8D/kH/A/4B/wP5Af8D7wH/A+YB/wP1Af8D+AH/A+UB/wPvAf8D+QH/A/5J/wP+Af8D/gH/
A/4B/wPxAf8D6QH/A+IB/wHxAewB8QH/Ac4B+gHRAf8BmgH5AaEB/wG0AfsBugH/AdEB+gHUAf8B8AH5
AfEB/wP+Af8D/kH/A/4B/wP+Af8D/gH/A/EB/wPpAf8D4gH/AfgB8gH4Af8BswHbAbQB/wFpAbsBawH/
AY4BzQGQAf8BuQHgAboB/wHoAfUB6AH/A/4B/wP+Qf8D/gH/A/4B/wP+Af8D8QH/A+kB/wPiAf8B+AHy
AfgB/wGzAdsBtAH/AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/A/4h/wFCAU0BPgcA
AT4DAAEoAwABeAMAAXgDAAEBAQABAQUAAYABBxYAA///AP8A/wD/AP8A/wD/AIgACw==
</value>
</data>
</root>

View file

@ -0,0 +1,57 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Windows.Forms;
using WebsitePanel.Installer.Common;
namespace WebsitePanel.Installer.Controls
{
internal class ResultViewControl : UserControl
{
private AppContext appContext;
private bool isInitialized;
public AppContext AppContext
{
get { return appContext; }
set { appContext = value; }
}
protected bool IsInitialized
{
get { return isInitialized; }
set { isInitialized = value; }
}
public virtual void ShowControl(AppContext context)
{
this.AppContext = context;
}
}
}

View file

@ -0,0 +1,180 @@
namespace WebsitePanel.Installer.Controls
{
partial class ServerControl
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerControl));
this.grpConnectionSettings = new System.Windows.Forms.GroupBox();
this.txtPassword = new System.Windows.Forms.TextBox();
this.lblPassword = new System.Windows.Forms.Label();
this.txtPort = new System.Windows.Forms.TextBox();
this.lblPort = new System.Windows.Forms.Label();
this.txtServer = new System.Windows.Forms.TextBox();
this.lblServer = new System.Windows.Forms.Label();
this.btnUpdate = new System.Windows.Forms.Button();
this.btnTest = new System.Windows.Forms.Button();
this.btnRemove = new System.Windows.Forms.Button();
this.grpConnectionSettings.SuspendLayout();
this.SuspendLayout();
//
// grpConnectionSettings
//
this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpConnectionSettings.Controls.Add(this.txtPassword);
this.grpConnectionSettings.Controls.Add(this.lblPassword);
this.grpConnectionSettings.Controls.Add(this.txtPort);
this.grpConnectionSettings.Controls.Add(this.lblPort);
this.grpConnectionSettings.Controls.Add(this.txtServer);
this.grpConnectionSettings.Controls.Add(this.lblServer);
this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpConnectionSettings.Location = new System.Drawing.Point(14, 43);
this.grpConnectionSettings.Name = "grpConnectionSettings";
this.grpConnectionSettings.Size = new System.Drawing.Size(379, 122);
this.grpConnectionSettings.TabIndex = 0;
this.grpConnectionSettings.TabStop = false;
this.grpConnectionSettings.Text = "Connection settings";
//
// txtPassword
//
this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtPassword.Location = new System.Drawing.Point(122, 82);
this.txtPassword.Name = "txtPassword";
this.txtPassword.PasswordChar = '*';
this.txtPassword.Size = new System.Drawing.Size(234, 21);
this.txtPassword.TabIndex = 5;
//
// lblPassword
//
this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblPassword.Location = new System.Drawing.Point(16, 82);
this.lblPassword.Name = "lblPassword";
this.lblPassword.Size = new System.Drawing.Size(100, 21);
this.lblPassword.TabIndex = 4;
this.lblPassword.Text = "Password";
//
// txtPort
//
this.txtPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtPort.Location = new System.Drawing.Point(122, 55);
this.txtPort.Name = "txtPort";
this.txtPort.Size = new System.Drawing.Size(234, 21);
this.txtPort.TabIndex = 3;
//
// lblPort
//
this.lblPort.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblPort.Location = new System.Drawing.Point(16, 55);
this.lblPort.Name = "lblPort";
this.lblPort.Size = new System.Drawing.Size(100, 21);
this.lblPort.TabIndex = 2;
this.lblPort.Text = "Port";
//
// txtServer
//
this.txtServer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtServer.Location = new System.Drawing.Point(122, 28);
this.txtServer.Name = "txtServer";
this.txtServer.Size = new System.Drawing.Size(234, 21);
this.txtServer.TabIndex = 1;
//
// lblServer
//
this.lblServer.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblServer.Location = new System.Drawing.Point(16, 28);
this.lblServer.Name = "lblServer";
this.lblServer.Size = new System.Drawing.Size(100, 21);
this.lblServer.TabIndex = 0;
this.lblServer.Text = "Server";
//
// btnUpdate
//
this.btnUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnUpdate.Image")));
this.btnUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnUpdate.Location = new System.Drawing.Point(148, 171);
this.btnUpdate.Name = "btnUpdate";
this.btnUpdate.Size = new System.Drawing.Size(128, 28);
this.btnUpdate.TabIndex = 9;
this.btnUpdate.Text = "Update";
this.btnUpdate.UseVisualStyleBackColor = true;
//
// btnTest
//
this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image")));
this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnTest.Location = new System.Drawing.Point(14, 171);
this.btnTest.Name = "btnTest";
this.btnTest.Size = new System.Drawing.Size(128, 28);
this.btnTest.TabIndex = 8;
this.btnTest.Text = "Test connection";
this.btnTest.UseVisualStyleBackColor = true;
//
// btnRemove
//
this.btnRemove.Image = ((System.Drawing.Image)(resources.GetObject("btnRemove.Image")));
this.btnRemove.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnRemove.Location = new System.Drawing.Point(14, 9);
this.btnRemove.Name = "btnRemove";
this.btnRemove.Size = new System.Drawing.Size(128, 28);
this.btnRemove.TabIndex = 10;
this.btnRemove.Text = "Remove server";
this.btnRemove.UseVisualStyleBackColor = true;
//
// ServerControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.btnRemove);
this.Controls.Add(this.btnUpdate);
this.Controls.Add(this.btnTest);
this.Controls.Add(this.grpConnectionSettings);
this.Name = "ServerControl";
this.Size = new System.Drawing.Size(406, 327);
this.grpConnectionSettings.ResumeLayout(false);
this.grpConnectionSettings.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpConnectionSettings;
private System.Windows.Forms.TextBox txtPassword;
private System.Windows.Forms.Label lblPassword;
private System.Windows.Forms.TextBox txtPort;
private System.Windows.Forms.Label lblPort;
private System.Windows.Forms.TextBox txtServer;
private System.Windows.Forms.Label lblServer;
private System.Windows.Forms.Button btnUpdate;
private System.Windows.Forms.Button btnTest;
private System.Windows.Forms.Button btnRemove;
}
}

View file

@ -0,0 +1,46 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace WebsitePanel.Installer.Controls
{
internal partial class ServerControl : ResultViewControl
{
public ServerControl()
{
InitializeComponent();
}
}
}

View file

@ -0,0 +1,178 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btnUpdate.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAj9JREFUOE+lk82L
UlEYxmtRGBTlv5CIFti+VQtDF65NUAIh2rRoQHBjs1RQBwYcFGli/Nh4NRyvCaNgk9JVm4RmIMfE8VvE
r2Bma4r5dM4lxeJOmy48XDjnPL/347znKoAr//VRwGXSaDQ3/rXPB18e+AksRt/PMZvNMJlM0Gg0JgzD
9EKh0Ger1Rra2Hj5XK/XP/obuAL8mC0W5W9lDIdDTKdTcg5wOByIx+Not9vodNqIRMJQqVTP1iErwPnF
BfL5PM7OzsjhDubzOUwmE7xeLzKZDEqlrzg8fA+1Wv1GEDAYDJDLcTg5OSH/HGq1GpxOJ9LpNAF8AEf2
Eol3MBqNHkEAqRmVSgXZbBaxWAxhhuHNhUKBGBNIJg9AegKDwSAMODr6hDqJOh6P+TKKxSJSqRTCYQbB
YJCYQ/D7/dDpdMIAlmVRPj1FvV7n0282m+h2u+j1eqhWq/D5fHC73dBqtcKA3d3XfFRqol1vtVr0KnkY
zWjPt4etrS0olUq3YA9sNhsPoGZqoFGXmdC1QCAAu90OhUIRJJN7k0j0xyBtbr7iATQyFTVR0VJoJrQH
dC7kcvkBMT8kkhPdWc2BxWKZlstl9Pt93rRMncLoFbNsDNvb25DJZBFivP8b8mAFEIvFMp3uyVOO4wKl
UqlBAbSB1Dwajcg1JuHxeCCVSt8S8z2iu0TXBB9SMBi47nK5FPE4++L4+AtLShly3Efsx/YhkUgYYry1
bOSlL3G909Fo9PbOzs5js9lsEYlE0vW9X7L1rrIM3ozpAAAAAElFTkSuQmCC
</value>
</data>
<data name="btnTest.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAqNJREFUOE+dk2tI
k2EUgN/SrOxqF7uYCZkVRRcryR9GEqGlRPdBBBoUlSQJkf0pIixKqX6ERUwyKJCViRAUWKbWWubu63NT
29q0TSelZrMbmvX0bYb19dMDL+85h/d5zvnzCjHCAP6SA3L1+Vcf/oF2Wr46aAi85HHPI8rfl6H2F1Pk
LeBEay7ZThWZrlSOWPfLxD+C3h8faf3qxvLJyNOuKso7yrjx7ioX3Gc4/uYoex3bUElbqX1fzZ2OUtbV
LVcKvN/eYftkprbrCRX+u6i917joPstJZx7ZTSp2vE7H2mMKQjAIGVUblQJ74DV13dUyrKFEhos8BeQ7
j5Elwxm2VOo/6IbgX1BoKyChOkYp0PbUUdGp4ab3BufenuaAYx/bpTSSTMu45y0bhi+ZLiKMgsW6eUpB
ZWc5xW1XONp0kL3SztDU2IZZ5DYeCk0Nxm2plLB6QaRLsEQXqxQ88Fcg9dq47CwkybCUyBfhxGhn4Ovz
huAWfzMzn01iQrNg4ltZUP/fBoauhqExPyFfykPUCCp95aHWwPcBUrXrCHcIprWEEdUWxgp9vHKDPHsO
7o+uIYkcD9sf0D/YH8qvS1cRZkG0M4I4dxQJHdFssKxVCna3ZDK/dg46n3ZYEkwCfQESXs5liiuMeM9M
VvsWkvJhBbsbM5SCtKYURukEs7XTeNZeMyypdN0n3CaI80wl0RvPps5kdvWmc7g5SylY6VjAOIMgwiKY
bBjDLU8J5nYTKfo1TPAIFvlms75zFXu6t5DzJYtT7hNKQWL9IqKejyNaN57pryKYLG8zvW4sU02jiZOi
SGxayGZXCtmtKvL9uRRZzysFVru1xNBoUBv/HIPdoNY79GqjfAd7JrtRbbab1Ra7RR18K0nSdY1GkzzC
j6zEfgNB/y51tqL5CQAAAABJRU5ErkJggg==
</value>
</data>
<data name="btnRemove.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+NJREFUOE89jmlM
GwQYhj9iKbBgskgky7jdkjknCmwglMIqoDCQa61QObQMSLElhEMJ0LkSaDkHowdyDNlCgQETVgcydBgR
4tzCOCz3gJbSFTXgohhRM/C1McYfz8/neV+rnA+Laf8AV13dXvA5+Ht/4+DpvonBsNpkMq1Nh2yZ5kN2
tj8xbWx2rK2Zu4xnGGBYM+n+5CQZDBvEYDCI3st83yq3SDqzs7uP5c1f8fX0Jrq+0KG6YwwfKLQQV2r2
RLKrW7kVTTMltc3D9a0dTQUS6bmkC0JKzRQRSeVVz6rbusw7vwFL5j9xffxn5HdvIbXtMc43bSJctQF2
3SpOV83j5YpZxBQ2IiUtvYebLCBechpR32dDx0cnHv71YG0Pma16CFrWUXLzMUr6zRB1m5DYbkToxwb4
NBhwSr2FCFE5IqNjykKjYiksKo5oRjfH0Y6v4N0mA5QjP6Ltm23k9pgQ36xHqHIdgYp1nLFwqkEPz0Yj
zosl8AtgpZ/2Z9OZgCCi5eVFgVB5H+q72xBrjHjpo0U4F8/D+eIiXEqX4SJ/BLeaNThf1sOn2YCSahV4
Cfw3uPxk4vFTiMYmvisv7ZxBtEIPxzwdXEsW4CFdgodsBe4Vq3C3yC51ejx3xYSgri10aoeeSstkx6Xl
FXSpTE50o3+w61yNDs/nL8Bd8p9cbpErH8G9dg1H6zfg3baJvN45aPrHcW9waE/Z2MjJys6mlBTLA+mV
T+YDyybhU7mKE5UGuFVuwLnKAKcaPY7UGxHUuow76jYsiTKhS03CLJeL2aysP2olksJYLpcoNiG5JSk9
az69QPp7mrQJSTVaxCi/BadlBa+26HFNrsBaUQFWVSpMR0ZiSiDAVPoFzMbHQyQURlBAcCj5ss4y/FjB
HhFRb4Xw+fyiTKFwKiOnAPkXy3EvS4iFoiLsmM14qFDgtkaDu5bA2uHDqIuO1lLg629SQoqApLJK6rzR
6zk4ONTTPzDwQ2lFNSR5+ZjMyMADX1+MRkejc2ICA3I55ohgsnDNz2+OSuVV1N7RRZ29N52Gvxzdnf5e
h7mFRfTd0kKlVGEsLAwjTk7oVqtxSyzGoiWyVViIHUtAHRb2OSUmJRP37USK5yU41jUoDYN3RvCp9jba
Nd1QXNegLy4OX1nuDoeH/7u86e+PJzwejI6OqJPJ4okVyCYWm02vBbAogBXoIRJnN1bVXF6yxH6R19bv
Fl8qNQ6EhGwv29nBZGWFJ5aI0dUVypwceUhUFFHQWc7/eHl704kXT5Kn5ytML2+fIw4ODm7WNjbOR48d
836HzZZLOZyevODgFh8vLy7D3t6eiGz/AfbnLf28f482AAAAAElFTkSuQmCC
</value>
</data>
</root>

View file

@ -0,0 +1,166 @@
namespace WebsitePanel.Installer.Controls
{
partial class ServersControl
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServersControl));
this.grpConnectionSettings = new System.Windows.Forms.GroupBox();
this.txtPassword = new System.Windows.Forms.TextBox();
this.lblPassword = new System.Windows.Forms.Label();
this.txtPort = new System.Windows.Forms.TextBox();
this.lblPort = new System.Windows.Forms.Label();
this.txtServer = new System.Windows.Forms.TextBox();
this.lblServer = new System.Windows.Forms.Label();
this.btnAdd = new System.Windows.Forms.Button();
this.btnTest = new System.Windows.Forms.Button();
this.grpConnectionSettings.SuspendLayout();
this.SuspendLayout();
//
// grpConnectionSettings
//
this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpConnectionSettings.Controls.Add(this.txtPassword);
this.grpConnectionSettings.Controls.Add(this.lblPassword);
this.grpConnectionSettings.Controls.Add(this.txtPort);
this.grpConnectionSettings.Controls.Add(this.lblPort);
this.grpConnectionSettings.Controls.Add(this.txtServer);
this.grpConnectionSettings.Controls.Add(this.lblServer);
this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpConnectionSettings.Location = new System.Drawing.Point(14, 3);
this.grpConnectionSettings.Name = "grpConnectionSettings";
this.grpConnectionSettings.Size = new System.Drawing.Size(379, 122);
this.grpConnectionSettings.TabIndex = 0;
this.grpConnectionSettings.TabStop = false;
this.grpConnectionSettings.Text = "Connection settings";
//
// txtPassword
//
this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtPassword.Location = new System.Drawing.Point(122, 82);
this.txtPassword.Name = "txtPassword";
this.txtPassword.PasswordChar = '*';
this.txtPassword.Size = new System.Drawing.Size(234, 21);
this.txtPassword.TabIndex = 5;
//
// lblPassword
//
this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblPassword.Location = new System.Drawing.Point(16, 82);
this.lblPassword.Name = "lblPassword";
this.lblPassword.Size = new System.Drawing.Size(100, 21);
this.lblPassword.TabIndex = 4;
this.lblPassword.Text = "Password";
//
// txtPort
//
this.txtPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtPort.Location = new System.Drawing.Point(122, 55);
this.txtPort.Name = "txtPort";
this.txtPort.Size = new System.Drawing.Size(234, 21);
this.txtPort.TabIndex = 3;
//
// lblPort
//
this.lblPort.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblPort.Location = new System.Drawing.Point(16, 55);
this.lblPort.Name = "lblPort";
this.lblPort.Size = new System.Drawing.Size(100, 21);
this.lblPort.TabIndex = 2;
this.lblPort.Text = "Port";
//
// txtServer
//
this.txtServer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtServer.Location = new System.Drawing.Point(122, 28);
this.txtServer.Name = "txtServer";
this.txtServer.Size = new System.Drawing.Size(234, 21);
this.txtServer.TabIndex = 1;
//
// lblServer
//
this.lblServer.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblServer.Location = new System.Drawing.Point(16, 28);
this.lblServer.Name = "lblServer";
this.lblServer.Size = new System.Drawing.Size(100, 21);
this.lblServer.TabIndex = 0;
this.lblServer.Text = "Server";
//
// btnAdd
//
this.btnAdd.Image = ((System.Drawing.Image)(resources.GetObject("btnAdd.Image")));
this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnAdd.Location = new System.Drawing.Point(148, 131);
this.btnAdd.Name = "btnAdd";
this.btnAdd.Size = new System.Drawing.Size(128, 28);
this.btnAdd.TabIndex = 9;
this.btnAdd.Text = "Add server";
this.btnAdd.UseVisualStyleBackColor = true;
//
// btnTest
//
this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image")));
this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnTest.Location = new System.Drawing.Point(14, 131);
this.btnTest.Name = "btnTest";
this.btnTest.Size = new System.Drawing.Size(128, 28);
this.btnTest.TabIndex = 8;
this.btnTest.Text = "Test connection";
this.btnTest.UseVisualStyleBackColor = true;
//
// ServersControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.btnAdd);
this.Controls.Add(this.btnTest);
this.Controls.Add(this.grpConnectionSettings);
this.Name = "ServersControl";
this.Size = new System.Drawing.Size(406, 327);
this.grpConnectionSettings.ResumeLayout(false);
this.grpConnectionSettings.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpConnectionSettings;
private System.Windows.Forms.TextBox txtPassword;
private System.Windows.Forms.Label lblPassword;
private System.Windows.Forms.TextBox txtPort;
private System.Windows.Forms.Label lblPort;
private System.Windows.Forms.TextBox txtServer;
private System.Windows.Forms.Label lblServer;
private System.Windows.Forms.Button btnAdd;
private System.Windows.Forms.Button btnTest;
}
}

View file

@ -0,0 +1,46 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace WebsitePanel.Installer.Controls
{
internal partial class ServersControl : ResultViewControl
{
public ServersControl()
{
InitializeComponent();
}
}
}

View file

@ -0,0 +1,162 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btnAdd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+VJREFUOE811G0w
GwYcx/F/Jx7a3Ta71djQcqdDqxSreAyd624zpVSZeDYPKWsZpuqh0hJNPERYPIzSadHDViub26nWhqq6
a0uELRFJNOFcrjN3bDe2229pd3vxefm9/93vxX9XRk4+ERn02h145+D2zs7qzs6OxuAl0hgbGjzdbWyk
2bPbZM3ExFhnaGS0wWAYbhswjOj+gynSaLXEYDCI4lPPGBVc4is2/wRk2i2MS1bRfWcB/M4J5NZ/Bw7/
5t9pZe3rmWXN8jxB85ig6avOc/mFQezkdIpNzSDiVggsrnbd2ni2Bcyo/4B4WIczHRqwWzQIbXyK4/Vq
+AiX4CpYwCG+FCfzahGTkNQUzk6gUzGJRF8PDLmNPZT8c1e6hbgGBThtKnD7V1Csl3lTg6j2ZQQ2quAq
UsFJrEVQWiE++Cg4+70PT1BgUAjR7NxcaPdduT5WonVUB/GIDmnXlxEkXgJLpABTtAQ3PcdaFVzESkSk
5+Gop3e4u5cvvevlRySZk+Z8UvcQzfeeIbZFBbtCKSwLpLAqXoD1pV9gzZNjf6UCljVKMFuUKOHXIjI6
hhkZk0DP0fDohPhi1xwCKhdhniPB/qJ52HJ/hm2ZDDZXFmFTpcA+oRJmQg2CulbQ03t7k1vGM+eWX6HS
yzyijt7BIRZPCrPcedjor9r8H/P/i62FKrg3a5HcL4fwwRSGJgbXG+ob3DM5nxKbzSY6X3lVzSqbhodA
Bke+ErZ8NawEalhWqfCWcBk+TQpUjfeAt5CLbEkSUuficH4m+/eS6uLPI0IjiIJPRdVGJ6ZMJ2ddWE8q
qkMsvwdhdT8h8Mt5HG1UI//ba8iTJoD9KBxTuvvgyUrhI3FBnCQCnLOcEPJkBerXZBHTx98iOOSkRzQ7
OjctPf1JamYWzl3gIn8yC5y5JCTOfgz1pgoVi1w4PTkAu0ULhImDh8n/eBDFp3CIXyOivm/6A4fvjAwP
DA6u8yqq8FlRLlKmYzG6OoLVjRVs/7WNtc01yH6VIVDhBedOezmVC6qpraOTrnf3OAwNj+DRzCwez0rQ
03cLdV+IETkWgiNj9nAfd8H8b1LwlkrhLnXFm5o9ONbqPUnhpyMpJCz8ubdrRHXqge9/QF//bbTf6EJr
0w3E9bFBEwSaJPy4dg/xi6dBWoKl+hVcFJWkk7ev3wtML29ienrtS01Lr75cXvGYX12zdqmcr8svKJIG
D7yvM194FfZyK1hpTeGgscHZaxltUSeiDMjPP+AFX5Y/uRxxJQfHg3TI6fCuw87Or5m+bvqGEcN4r4ON
g9uxJFatX6X3kH+pby8zwCNt78tmpvo/YPIv1ugy8/qHI6sAAAAASUVORK5CYII=
</value>
</data>
<data name="btnTest.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAqNJREFUOE+dk2tI
k2EUgN/SrOxqF7uYCZkVRRcryR9GEqGlRPdBBBoUlSQJkf0pIixKqX6ERUwyKJCViRAUWKbWWubu63NT
29q0TSelZrMbmvX0bYb19dMDL+85h/d5zvnzCjHCAP6SA3L1+Vcf/oF2Wr46aAi85HHPI8rfl6H2F1Pk
LeBEay7ZThWZrlSOWPfLxD+C3h8faf3qxvLJyNOuKso7yrjx7ioX3Gc4/uYoex3bUElbqX1fzZ2OUtbV
LVcKvN/eYftkprbrCRX+u6i917joPstJZx7ZTSp2vE7H2mMKQjAIGVUblQJ74DV13dUyrKFEhos8BeQ7
j5Elwxm2VOo/6IbgX1BoKyChOkYp0PbUUdGp4ab3BufenuaAYx/bpTSSTMu45y0bhi+ZLiKMgsW6eUpB
ZWc5xW1XONp0kL3SztDU2IZZ5DYeCk0Nxm2plLB6QaRLsEQXqxQ88Fcg9dq47CwkybCUyBfhxGhn4Ovz
huAWfzMzn01iQrNg4ltZUP/fBoauhqExPyFfykPUCCp95aHWwPcBUrXrCHcIprWEEdUWxgp9vHKDPHsO
7o+uIYkcD9sf0D/YH8qvS1cRZkG0M4I4dxQJHdFssKxVCna3ZDK/dg46n3ZYEkwCfQESXs5liiuMeM9M
VvsWkvJhBbsbM5SCtKYURukEs7XTeNZeMyypdN0n3CaI80wl0RvPps5kdvWmc7g5SylY6VjAOIMgwiKY
bBjDLU8J5nYTKfo1TPAIFvlms75zFXu6t5DzJYtT7hNKQWL9IqKejyNaN57pryKYLG8zvW4sU02jiZOi
SGxayGZXCtmtKvL9uRRZzysFVru1xNBoUBv/HIPdoNY79GqjfAd7JrtRbbab1Ra7RR18K0nSdY1GkzzC
j6zEfgNB/y51tqL5CQAAAABJRU5ErkJggg==
</value>
</data>
</root>

View file

@ -0,0 +1,250 @@
namespace WebsitePanel.Installer.Controls
{
partial class ServiceControl
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServiceControl));
this.grpConnectionSettings = new System.Windows.Forms.GroupBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.btnAdd = new System.Windows.Forms.Button();
this.btnTest = new System.Windows.Forms.Button();
this.lblStatus = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.textBox2 = new System.Windows.Forms.TextBox();
this.button2 = new System.Windows.Forms.Button();
this.textBox3 = new System.Windows.Forms.TextBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.textBox4 = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.grpConnectionSettings.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// grpConnectionSettings
//
this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpConnectionSettings.Controls.Add(this.pictureBox1);
this.grpConnectionSettings.Controls.Add(this.btnAdd);
this.grpConnectionSettings.Controls.Add(this.btnTest);
this.grpConnectionSettings.Controls.Add(this.lblStatus);
this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpConnectionSettings.Location = new System.Drawing.Point(14, 3);
this.grpConnectionSettings.Name = "grpConnectionSettings";
this.grpConnectionSettings.Size = new System.Drawing.Size(379, 66);
this.grpConnectionSettings.TabIndex = 0;
this.grpConnectionSettings.TabStop = false;
this.grpConnectionSettings.Text = "Status";
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(13, 20);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(32, 32);
this.pictureBox1.TabIndex = 12;
this.pictureBox1.TabStop = false;
//
// btnAdd
//
this.btnAdd.Enabled = false;
this.btnAdd.Image = ((System.Drawing.Image)(resources.GetObject("btnAdd.Image")));
this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnAdd.Location = new System.Drawing.Point(258, 20);
this.btnAdd.Name = "btnAdd";
this.btnAdd.Size = new System.Drawing.Size(83, 28);
this.btnAdd.TabIndex = 11;
this.btnAdd.Text = "Stop";
this.btnAdd.UseVisualStyleBackColor = true;
//
// btnTest
//
this.btnTest.Enabled = false;
this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image")));
this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnTest.Location = new System.Drawing.Point(169, 20);
this.btnTest.Name = "btnTest";
this.btnTest.Size = new System.Drawing.Size(83, 28);
this.btnTest.TabIndex = 10;
this.btnTest.Text = "Start";
this.btnTest.UseVisualStyleBackColor = true;
//
// lblStatus
//
this.lblStatus.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblStatus.Location = new System.Drawing.Point(51, 26);
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(112, 21);
this.lblStatus.TabIndex = 0;
this.lblStatus.Text = "Not installed";
//
// label1
//
this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label1.Location = new System.Drawing.Point(16, 82);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(100, 21);
this.label1.TabIndex = 4;
this.label1.Text = "Password";
//
// label2
//
this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label2.Location = new System.Drawing.Point(16, 55);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(100, 21);
this.label2.TabIndex = 2;
this.label2.Text = "Port";
//
// textBox1
//
this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox1.Location = new System.Drawing.Point(122, 28);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(234, 21);
this.textBox1.TabIndex = 1;
//
// label3
//
this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label3.Location = new System.Drawing.Point(16, 28);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(100, 21);
this.label3.TabIndex = 0;
this.label3.Text = "Server";
//
// textBox2
//
this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox2.Location = new System.Drawing.Point(122, 55);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(234, 21);
this.textBox2.TabIndex = 3;
//
// button2
//
this.button2.Image = ((System.Drawing.Image)(resources.GetObject("button2.Image")));
this.button2.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.button2.Location = new System.Drawing.Point(14, 240);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(128, 28);
this.button2.TabIndex = 11;
this.button2.Text = "Update settings";
this.button2.UseVisualStyleBackColor = true;
//
// textBox3
//
this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox3.Location = new System.Drawing.Point(122, 82);
this.textBox3.Name = "textBox3";
this.textBox3.PasswordChar = '*';
this.textBox3.Size = new System.Drawing.Size(234, 21);
this.textBox3.TabIndex = 5;
//
// groupBox1
//
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.groupBox1.Controls.Add(this.textBox4);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.textBox3);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.textBox2);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.textBox1);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.groupBox1.Location = new System.Drawing.Point(14, 81);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(379, 150);
this.groupBox1.TabIndex = 10;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Connection settings";
//
// textBox4
//
this.textBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox4.Location = new System.Drawing.Point(122, 109);
this.textBox4.Name = "textBox4";
this.textBox4.PasswordChar = '*';
this.textBox4.Size = new System.Drawing.Size(234, 21);
this.textBox4.TabIndex = 7;
//
// label4
//
this.label4.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label4.Location = new System.Drawing.Point(16, 109);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(100, 21);
this.label4.TabIndex = 6;
this.label4.Text = "Confirm password";
//
// ServiceControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.button2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.grpConnectionSettings);
this.Name = "ServiceControl";
this.Size = new System.Drawing.Size(406, 327);
this.grpConnectionSettings.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpConnectionSettings;
private System.Windows.Forms.Label lblStatus;
private System.Windows.Forms.Button btnAdd;
private System.Windows.Forms.Button btnTest;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.TextBox textBox4;
private System.Windows.Forms.Label label4;
}
}

View file

@ -0,0 +1,46 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace WebsitePanel.Installer.Controls
{
internal partial class ServiceControl : ResultViewControl
{
public ServiceControl()
{
InitializeComponent();
}
}
}

View file

@ -0,0 +1,223 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAACHBJREFUWEedVwtQ
lWUa/v7D/XCJZEhtrEDyNlmZjXkpU3N07aI2o+a44q3a1PHSoDKra6toXlLJG+aqTKlcJHQhF1e8EAgE
LIIgi4QeEgFruYU0gBy5P/u85z9nl5Oa5j/zzH/7vvd53uf9vu//fk095NFqNA5V7sYpqofPEIOv70BH
T8/eCnDsbGio6ayvL8Uv9QVaY0Pyz0q70KeltfUhwz64Waury5LOAQNvdk2cCHz4IbBqFRASAmzaBKxb
B6xcCXzwATBtGrrGjEFbQMDtSg+PA2uV6vPg6L/RokVT4zr8/UsxYQLw/vvAmjVAaCgQHg5ERQGRkfr1
zp26kKVLgTlzgLffBkaMwC/PPIMzTo5/fSQRLUbj6s7nngOmTAEWLQLWrwf27gWOHAGio4GYGCAiAjh4
UBewcSMQHKy3nTVLFzFqFDBgAPLd3bOMSvk+tBCzl+duvPgiMHky8NFHwCefADt2APv2Afv3A3v2ANu3
61mvXq2XIChId0BKNHs28O67wPjxwCuvAP3745KX548uSg18oIgmN7egLslc6i12Ll8OrF2r13zDBj3L
hQuBGTOAN9/U202apDs1fTowc6ZOLu/GjrWUwvz88zD7+SHR1bXMUamA+4poMBiGtbAhXn1Vzz4w0OJA
B7O6M2+eTipZvfQS4O8P9O4N9OoF9OkD9OunPx8+HObRo9E1ciQwbBjw8stoGzwYtXxf/eSTCHFwSKOA
nvcUUe/jc6XzhRd05VLDqVPR/s472LB4MUKWLEG7kPToAXh6os3FBU2Ojmh0ckKzszM6jEbAwwO3SbJw
/nzskjIEBFjsb+c4qOnbF+VPPYVCb2/0U+ozCnC1E1Ht4hx4S7IaMgR47TXg9dfRQicOsbbJ167hvMmE
g6xxg1IwEzVEJVFFVBPNxA1i1Xvv4UBSEsLT0vC1uNazJ9roVBVdMvH8g68vQp2cGkk+3k7Aj97eprpn
nwVYL4uVHISHOfgSSG47UisqsJ9ulHcT8BOv64giIoij/8uUFEvzTuJYcTEurFgBM7P+6YknUEzyyz4+
yKSD/kpFUEAPiwhm0vc6lYpNrbRMpg4opnjuXKSWlaH5fxKAdN6HM2ipNXNx4t/EX+bNR1R6ereWQBvv
yuhINUtUThFFjz+Ofz32GPK9vDDNYLhJ6j9YBNxwdQ4upj2VtKnx6afBxQfgGdKRgzG3shK3u4XOqa1F
JGeGyZr5Nk7DE7m5duRyU88xJA5VuLujhFnnc4ykEyJiN2OTejPhpK66uUUV0Z5ycYGjupEDqZlootKf
GaCQ06ygrs7OieL6eiRt3oy4rVuRWVqKrl/R3+S0LGTfHzhITSS9QhE5HKgpxLe8jqYATsl/UICfyvPw
yJfaXOUIr+C5hqgjqthR6n2dyOMaX8jMzd2IpDRNd+UNXOdUzRHh4hCJrpA039UVWUQSZ88/eT7F516a
xqGjxqksd/fai6xRATMuISpo0U2iXKxzcECx1ercN97A9zU1aL8HqTjQStzgApTF9pdEtKbhMokuk/Qi
z9/RjTNEHK/P8pmPpsk4mKouGI0tUpuLJCwgrhHXWTMTlX5PAZKJJRsic9JEVLYKlf0hzuRz7RfyXOIi
kcO+OSQUZBApXDcSiFhenyN8NY0VVjNVkptb9Xk3N6STMIcoIIp4X0SVhQxSYCVP5zme34DaO3cs7F1d
XRbIIZKyw8LwHdtkEyIkiw5kkTBTyBkn0WDA34lIXsfTBTpwiwL+qM45O+eelvrwYQYhduURBWIfO0jm
ycQWfheSS0ruUQD9UUlzM6L4vfhWnCIyiDSSCflZxjlJHCOO8v4w4aEUlxA1S513cjwax2xPkzCJitOp
OJvItdp/noH+vGABTmRl3Zfc9iKPY+QLbljOsI84lkwXhDyBOM7rwzx/xbjbeOYs4BKkZqgUzbAshoTx
JE/kyyQijY3zGOAcsZyLSXRq6l3kl7lUX+WXTxac7otVdnk5di1bhgT2PUtwruEE40USh4ivSP4xQXJO
MDVZ0S6/SJLHEHF8cYqNxMaTxEp+WGIzMu4m5wdLAp+SmnPOl5nNdlM0t6oKYVygYoWciCLCGXcv44cT
I3lNcpqkhltWw2MODlcjmHm0DBQ2FvWfc7MRzRWu41f0+Vzh4vn+NJFobZvMr6epsREt3doWtbQgnjsl
Lvr4kthH0j2MH0p4a6qTtIeJXhYBf9K0wAQKEHtE7XEilh+k1EuX7JfhceMsAiVzG0RsnAjiAmS6dctO
7jdDh+ILvttL7KCAMMafoWf/H+JjC7ntiDAYrskAOcTGR4ijYt+gQZYay5H91luI5rNvrIhnoJOE3Iso
eZcouyPrEc8P2i4+201sswoIYXuOfhGQRIywE7BIU2NlmuwTsJEIOUBc4OqWwS232BgjzohDDCSIJb4m
hFyslj6Z3Aec4qK0XUiJLcSnbCMOsOC27NeQ3M1OgNws1rTNURSwh41FudgXRuwnRICQ2BBpvRanWEyE
E38jPrcSi4BNxHpr9tN1cu5nFA1TQ+4itz1YqGnHZSzspIhQdhIbpYYiRhw5aD0Loc0lIRbXpK1kvZXY
aCX/jHFm6+QdBNcnNe2+5NYX2ixNiw5jRxEh9ROIGJsgcccGG6lkLHYL8Tpig1yz/9T/k/MzoeYR9vvB
+6hxGKXUjtUydQgJzt2DHYRMIDYLWYg1Y7mWtivYjz5L5twyKn4m1AKC/yi/75g+WtMygxlsi7hBSHDJ
0kYqxIJPrc+Xs80Ygj8i7aQqJzhMuOIpxUePdvRltyD+aaZwE3d7DoMvJVaRMJhYSszl/QTCj9eaUk1s
z02y4nqllhD9H43WvpcDbwcRgQTHmeL0V/KTwc2PktpyC2C5l+esmJpLDCb4zfnt479hJfyQufY7HQAA
AABJRU5ErkJggg==
</value>
</data>
<data name="btnAdd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA5FJREFUOE81U21M
m1UUvg3LmJMlilvUaJzsDzr/7AeJmdkWcW5LlwmYQCmLIZotISbEqSzMQaY4iGYxTaYuQmGwQUtbPtrS
0Q9aoKUv/aKlLf2iLYVVsTgXOhyxMWQzeTx9wZs8uSf3nue555x7jqCqqorl1+7CQravqCiPXSWvHzz6
6msHy4v37z/89MnT3F+Psr4Ha2uW7MZG+u9cjm1ubrKtrS0mEAgYywvk8SHh6pUrpy0z9rAzmYY5nsZY
eAm6SAoWsmejiSeq4WHZZ42NL9XX1zOxWMzq6uq2Bc4Khaz5ctOl2XAc2sgyBubCGPCEeNx1h9DrCqKX
dl3sPgzTtvSFTz5+s6amhhdhQiJ/dP58pcntxVAwgcG5CGQ7AipfFIPeCPrprJ/ObjuD0C6mcWdQERWe
ObOvoqKCsXdPnHjmZmdXXBNO8c55sjGcxMqDh1hd+wORRBLT8wtQ5O9I8I4nDN1CApebmq6La2sZq/zg
XKXK6oDSv8iTDeEEcrkcqHBYTqXg83pht07DZLNvR+aNQhlKQdLVff/UyfeeYxcuXpSM+iIYJHU5Ofz6
cJ3IjxCLxWCz2aBWq6FQKjGu1UA2xaHTFUK3N4Zbo/dwTig8zr5sbh4dptfllKfaH8Pq7xkE/H7o9Xoo
FArIZDJoNBo4OA4W1xx6yW8gkIDUMAVRdXUd+6q1VcUXi9Dn8MPudMJoMPBkuVzOk/ORpJJJuCMxyOix
EfoN6bgZoppqEWtpabmudPkhdQRxTc+hX2fACIX8P3lmZgbxeBwb2XVMBKPQxFagX87gR7nq37paURm7
KZEcl2oNaDM50WacxQ2jHQOqIT5nB2dHaimJx1RQbzwJDTXWxNIqzCTw7fc3Ap82NOxmkxYzuyXt4drG
bWifcOIHqxc/T7mgtNhg83jhjS5iciHKd+XkSgb2zDpUVg5t33zd0NHRwRgViVlMpiN3NbrH35mdkNh8
+IXS6ck3D9VFGYhDR82TJ3OZLPSBCHr7+u719HSz9vZ2xopogOgrmdloODZkmMh2cfPodEfQN7/I//cY
zYGJQrb+9icsFIlCqdK3tlzdW1paygoKCvhB3EXYS0tw7J2jb136/AuNdEj9j8LuwYhnAWO+ELScGz91
316rFYmuHTpU8mx+eAl7CDSO28YBwiuEFwnFB14oPvJ2WZn49Kn3G0+WlzccfqP07J7CwhK6e37H7+Ud
u+A/uGZ/VDhOBqoAAAAASUVORK5CYII=
</value>
</data>
<data name="btnTest.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA3hJREFUOE9VU2tM
m2UUfjsJ6EI1upHFmGgG/tAYSYwzJi7q2CVN6iKQ9IImZT+IoolBfvijpJiiY0sMczGTzBVoGQgtnb1N
Li1sY6X0QkfX0dIy6J2tY6wr05Bg5hJ4PG9BE0/yfDnJ9z7Pc857ziuora1lPIqLi1lpaSl7TigsKS8v
//Dl/fuP7i0rq/j7yZPHj3K54L3s3bFcfu32+vo649jY2GACgYAxLlBATQ37tlVVc83tjbljGYwtpGCZ
W4IlFIODclc0tmmyWm3NTU2v1NfXM6lUymQy2baAWCxmqpYW1XR0CWYi9M+ECaEC+nwh6Ly30OMNwRpJ
wuFy3/+soeEA50kkEsZEIhE7oVB8Mu4PYih4G4M35nfI4UI+4J/Hr34uGEaPZw7mSAoDJkvyuFi8t5qq
ZlWHDj3b2a1Nm8PxAmGQDt9MLmMiEkMfVTBwIwL9bASDBJ73kpAtHINSqTwrl8upherqOuOUD/rAAvTc
kUirf/wJHsnVHCzBKPpIdGA2Soign5uE4vhJe3Hl2JHD+9jnjV+cNwW2HfTkwCu4/2hbgAdNAf54GhpX
AJ3TQWi8c+jyR3DeZsfHxz8SsW+ULSOXdnofCkShdQeRyeX/E/g3eUxCV0ML0NKl9gcX0T3uhEwiaWDK
1lYbJ/I+NeSgHnYisfLgfwJbm5tIpDMwOj0YJLNLdJE99knIpdITTKVq/cHgC+ICOatHpvD9qAsp6r0Q
W1tI3bkD05QXuukATSCJy7QTI/EsOodM+LROfpCd7eg4rLk8BrXdg+/GXDjtcGP5wUOs5fMwOd3QXPfB
SLsxvJjB6FIG9iWaUOoeTnaciX7Z2LibOex2dk7T5Wmj0k86PDhzzY/+SQ867U5oaWSmSKLgyolXEncx
lX1YaKVNrW5qb29nzGAwsKsT429ftPy+fnrcix+vz+Kc6yZ0fP50Web5OEYW05ggsiubx2gwAm1vr0On
1e5qP3WKMaFQyBQKBbMPD39gHHWsXaBx/TIzDx3thYFKty6kYU9kMbm8iitzURiGjA5yL62srGRFRUWF
h8i/uykE7x98782vm5utXUbzX3part9mbsE2S29g2oefu3tW6mSytlcrKoT88RKeJuziAjwpI7xE2EfY
U7bnhbfefedAnejY0a+OVFU1vvH6a+JnSkrK6d/zO+de3Mmf+gcr/Y3/aW/RkQAAAABJRU5ErkJggg==
</value>
</data>
<data name="button2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAj9JREFUOE+lk82L
UlEYxmtRGBTlv5CIFti+VQtDF65NUAIh2rRoQHBjs1RQBwYcFGli/Nh4NRyvCaNgk9JVm4RmIMfE8VvE
r2Bma4r5dM4lxeJOmy48XDjnPL/347znKoAr//VRwGXSaDQ3/rXPB18e+AksRt/PMZvNMJlM0Gg0JgzD
9EKh0Ger1Rra2Hj5XK/XP/obuAL8mC0W5W9lDIdDTKdTcg5wOByIx+Not9vodNqIRMJQqVTP1iErwPnF
BfL5PM7OzsjhDubzOUwmE7xeLzKZDEqlrzg8fA+1Wv1GEDAYDJDLcTg5OSH/HGq1GpxOJ9LpNAF8AEf2
Eol3MBqNHkEAqRmVSgXZbBaxWAxhhuHNhUKBGBNIJg9AegKDwSAMODr6hDqJOh6P+TKKxSJSqRTCYQbB
YJCYQ/D7/dDpdMIAlmVRPj1FvV7n0282m+h2u+j1eqhWq/D5fHC73dBqtcKA3d3XfFRqol1vtVr0KnkY
zWjPt4etrS0olUq3YA9sNhsPoGZqoFGXmdC1QCAAu90OhUIRJJN7k0j0xyBtbr7iATQyFTVR0VJoJrQH
dC7kcvkBMT8kkhPdWc2BxWKZlstl9Pt93rRMncLoFbNsDNvb25DJZBFivP8b8mAFEIvFMp3uyVOO4wKl
UqlBAbSB1Dwajcg1JuHxeCCVSt8S8z2iu0TXBB9SMBi47nK5FPE4++L4+AtLShly3Efsx/YhkUgYYry1
bOSlL3G909Fo9PbOzs5js9lsEYlE0vW9X7L1rrIM3ozpAAAAAElFTkSuQmCC
</value>
</data>
</root>

View file

@ -0,0 +1,229 @@
namespace WebsitePanel.Installer.Controls
{
partial class SettingsControl
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsControl));
this.grpWebUpdate = new System.Windows.Forms.GroupBox();
this.btnCheck = new System.Windows.Forms.Button();
this.chkAutoUpdate = new System.Windows.Forms.CheckBox();
this.btnUpdate = new System.Windows.Forms.Button();
this.grpProxy = new System.Windows.Forms.GroupBox();
this.txtPassword = new System.Windows.Forms.TextBox();
this.lblPassword = new System.Windows.Forms.Label();
this.txtUserName = new System.Windows.Forms.TextBox();
this.lblUsername = new System.Windows.Forms.Label();
this.txtAddress = new System.Windows.Forms.TextBox();
this.lblAddress = new System.Windows.Forms.Label();
this.chkUseHTTPProxy = new System.Windows.Forms.CheckBox();
this.btnViewLog = new System.Windows.Forms.Button();
this.grpWebUpdate.SuspendLayout();
this.grpProxy.SuspendLayout();
this.SuspendLayout();
//
// grpWebUpdate
//
this.grpWebUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpWebUpdate.Controls.Add(this.btnCheck);
this.grpWebUpdate.Controls.Add(this.chkAutoUpdate);
this.grpWebUpdate.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpWebUpdate.Location = new System.Drawing.Point(14, 3);
this.grpWebUpdate.Name = "grpWebUpdate";
this.grpWebUpdate.Size = new System.Drawing.Size(379, 83);
this.grpWebUpdate.TabIndex = 0;
this.grpWebUpdate.TabStop = false;
this.grpWebUpdate.Text = "Web update";
//
// btnCheck
//
this.btnCheck.Image = ((System.Drawing.Image)(resources.GetObject("btnCheck.Image")));
this.btnCheck.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnCheck.Location = new System.Drawing.Point(19, 44);
this.btnCheck.Name = "btnCheck";
this.btnCheck.Size = new System.Drawing.Size(128, 28);
this.btnCheck.TabIndex = 1;
this.btnCheck.Text = "&Check For Updates";
this.btnCheck.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.btnCheck.UseVisualStyleBackColor = true;
this.btnCheck.Click += new System.EventHandler(this.OnCheckClick);
//
// chkAutoUpdate
//
this.chkAutoUpdate.Checked = true;
this.chkAutoUpdate.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkAutoUpdate.Location = new System.Drawing.Point(19, 20);
this.chkAutoUpdate.Name = "chkAutoUpdate";
this.chkAutoUpdate.Size = new System.Drawing.Size(184, 18);
this.chkAutoUpdate.TabIndex = 0;
this.chkAutoUpdate.Text = "Automatically check for updates";
this.chkAutoUpdate.UseVisualStyleBackColor = true;
//
// btnUpdate
//
this.btnUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnUpdate.Image")));
this.btnUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnUpdate.Location = new System.Drawing.Point(14, 236);
this.btnUpdate.Name = "btnUpdate";
this.btnUpdate.Size = new System.Drawing.Size(128, 28);
this.btnUpdate.TabIndex = 2;
this.btnUpdate.Text = "&Save Settings";
this.btnUpdate.Click += new System.EventHandler(this.OnUpdateClick);
//
// grpProxy
//
this.grpProxy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpProxy.Controls.Add(this.txtPassword);
this.grpProxy.Controls.Add(this.lblPassword);
this.grpProxy.Controls.Add(this.txtUserName);
this.grpProxy.Controls.Add(this.lblUsername);
this.grpProxy.Controls.Add(this.txtAddress);
this.grpProxy.Controls.Add(this.lblAddress);
this.grpProxy.Controls.Add(this.chkUseHTTPProxy);
this.grpProxy.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.grpProxy.Location = new System.Drawing.Point(14, 91);
this.grpProxy.Name = "grpProxy";
this.grpProxy.Size = new System.Drawing.Size(379, 139);
this.grpProxy.TabIndex = 1;
this.grpProxy.TabStop = false;
this.grpProxy.Text = "Proxy";
//
// txtPassword
//
this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtPassword.Enabled = false;
this.txtPassword.Location = new System.Drawing.Point(125, 101);
this.txtPassword.Name = "txtPassword";
this.txtPassword.PasswordChar = '*';
this.txtPassword.Size = new System.Drawing.Size(234, 21);
this.txtPassword.TabIndex = 6;
//
// lblPassword
//
this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblPassword.Location = new System.Drawing.Point(19, 101);
this.lblPassword.Name = "lblPassword";
this.lblPassword.Size = new System.Drawing.Size(100, 21);
this.lblPassword.TabIndex = 5;
this.lblPassword.Text = "Password";
//
// txtUserName
//
this.txtUserName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtUserName.Enabled = false;
this.txtUserName.Location = new System.Drawing.Point(125, 74);
this.txtUserName.Name = "txtUserName";
this.txtUserName.Size = new System.Drawing.Size(234, 21);
this.txtUserName.TabIndex = 4;
//
// lblUsername
//
this.lblUsername.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblUsername.Location = new System.Drawing.Point(19, 74);
this.lblUsername.Name = "lblUsername";
this.lblUsername.Size = new System.Drawing.Size(100, 21);
this.lblUsername.TabIndex = 3;
this.lblUsername.Text = "User name";
//
// txtAddress
//
this.txtAddress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtAddress.Enabled = false;
this.txtAddress.Location = new System.Drawing.Point(125, 47);
this.txtAddress.Name = "txtAddress";
this.txtAddress.Size = new System.Drawing.Size(234, 21);
this.txtAddress.TabIndex = 2;
//
// lblAddress
//
this.lblAddress.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblAddress.Location = new System.Drawing.Point(19, 47);
this.lblAddress.Name = "lblAddress";
this.lblAddress.Size = new System.Drawing.Size(100, 21);
this.lblAddress.TabIndex = 1;
this.lblAddress.Text = "Address";
//
// chkUseHTTPProxy
//
this.chkUseHTTPProxy.Location = new System.Drawing.Point(19, 22);
this.chkUseHTTPProxy.Name = "chkUseHTTPProxy";
this.chkUseHTTPProxy.Size = new System.Drawing.Size(184, 18);
this.chkUseHTTPProxy.TabIndex = 0;
this.chkUseHTTPProxy.Text = "Use HTTP Proxy";
this.chkUseHTTPProxy.UseVisualStyleBackColor = true;
this.chkUseHTTPProxy.CheckedChanged += new System.EventHandler(this.OnUseHTTPProxyCheckedChanged);
//
// btnViewLog
//
this.btnViewLog.Image = ((System.Drawing.Image)(resources.GetObject("btnViewLog.Image")));
this.btnViewLog.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.btnViewLog.Location = new System.Drawing.Point(148, 236);
this.btnViewLog.Name = "btnViewLog";
this.btnViewLog.Size = new System.Drawing.Size(128, 28);
this.btnViewLog.TabIndex = 3;
this.btnViewLog.Text = "&View System Log";
this.btnViewLog.Click += new System.EventHandler(this.OnViewLogClick);
//
// SettingsControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.btnViewLog);
this.Controls.Add(this.grpProxy);
this.Controls.Add(this.btnUpdate);
this.Controls.Add(this.grpWebUpdate);
this.Name = "SettingsControl";
this.Size = new System.Drawing.Size(406, 327);
this.grpWebUpdate.ResumeLayout(false);
this.grpProxy.ResumeLayout(false);
this.grpProxy.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpWebUpdate;
private System.Windows.Forms.Button btnUpdate;
private System.Windows.Forms.CheckBox chkAutoUpdate;
private System.Windows.Forms.Button btnCheck;
private System.Windows.Forms.GroupBox grpProxy;
private System.Windows.Forms.TextBox txtPassword;
private System.Windows.Forms.Label lblPassword;
private System.Windows.Forms.TextBox txtUserName;
private System.Windows.Forms.Label lblUsername;
private System.Windows.Forms.TextBox txtAddress;
private System.Windows.Forms.Label lblAddress;
private System.Windows.Forms.CheckBox chkUseHTTPProxy;
private System.Windows.Forms.Button btnViewLog;
}
}

View file

@ -0,0 +1,182 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Threading;
using System.Diagnostics;
using System.IO;
using System.Configuration;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using WebsitePanel.Installer.Common;
using WebsitePanel.Installer.Core;
using WebsitePanel.Installer.Configuration;
namespace WebsitePanel.Installer.Controls
{
/// <summary>
/// Settings control
/// </summary>
internal partial class SettingsControl : ResultViewControl
{
/// <summary>
/// Initializes a new instance of the SettingsControl class.
/// </summary>
public SettingsControl()
{
InitializeComponent();
}
/// <summary>
/// Shows control
/// </summary>
/// <param name="context"></param>
public override void ShowControl(AppContext context)
{
base.ShowControl(context);
if (!IsInitialized)
{
AppContext = context;
LoadSettings();
IsInitialized = true;
}
}
/// <summary>
/// Loads application settings
/// </summary>
private void LoadSettings()
{
InstallerSection appConfig = AppConfigManager.AppConfiguration;
chkAutoUpdate.Checked = appConfig.GetBooleanSetting(ConfigKeys.Web_AutoCheck);
chkUseHTTPProxy.Checked = appConfig.GetBooleanSetting(ConfigKeys.Web_Proxy_UseProxy);
txtAddress.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_Address);
txtUserName.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_UserName);
txtPassword.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_Password);
}
private void OnUseHTTPProxyCheckedChanged(object sender, EventArgs e)
{
txtAddress.Enabled = chkUseHTTPProxy.Checked;
txtUserName.Enabled = chkUseHTTPProxy.Checked;
txtPassword.Enabled = chkUseHTTPProxy.Checked;
}
/// <summary>
/// Save application configuration
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnUpdateClick(object sender, EventArgs e)
{
KeyValueConfigurationCollection settings = AppConfigManager.AppConfiguration.Settings;
settings[ConfigKeys.Web_AutoCheck].Value = chkAutoUpdate.Checked.ToString();
settings[ConfigKeys.Web_Proxy_UseProxy].Value = chkUseHTTPProxy.Checked.ToString();
settings[ConfigKeys.Web_Proxy_Address].Value = txtAddress.Text;
settings[ConfigKeys.Web_Proxy_UserName].Value = txtUserName.Text;
settings[ConfigKeys.Web_Proxy_Password].Value = txtPassword.Text;
//
AppConfigManager.SaveConfiguration(true);
}
/// <summary>
/// Checks for updates
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnCheckClick(object sender, EventArgs e)
{
//start check in the separated thread
AppContext.AppForm.StartAsyncProgress("Connecting...", true);
ThreadStart threadDelegate = new ThreadStart(StartCheck);
Thread newThread = new Thread(threadDelegate);
newThread.Start();
}
/// <summary>
/// Starts check
/// </summary>
private void StartCheck()
{
bool startUpdate = CheckForUpdate();
if (startUpdate)
{
AppContext.AppForm.Close();
}
}
/// <summary>
/// Checks for update
/// </summary>
/// <returns></returns>
private bool CheckForUpdate()
{
string fileName;
bool updateAvailable = false;
try
{
updateAvailable = AppContext.AppForm.CheckForUpdate(out fileName);
AppContext.AppForm.FinishProgress();
}
catch (Exception ex)
{
Log.WriteError("Service error", ex);
AppContext.AppForm.FinishProgress();
AppContext.AppForm.ShowServerError();
return false;
}
string appName = AppContext.AppForm.Text;
if (updateAvailable)
{
string message = string.Format("This version of {0} is out of date.\nWould you like to download the latest version?", appName);
if (MessageBox.Show(AppContext.AppForm, message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
{
return AppContext.AppForm.StartUpdateProcess(fileName);
}
}
else
{
string message = string.Format("This version of {0} is up to date.", appName);
Log.WriteInfo(message);
AppContext.AppForm.ShowInfo(message);
}
return false;
}
private void OnViewLogClick(object sender, EventArgs e)
{
Log.ShowLogFile();
}
}
}

View file

@ -0,0 +1,173 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btnCheck.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA05JREFUOE+Vk2tI
k2EYhtMF/Qqi0haVaaP80jbnnIecNQ+bh5k5yxpump+Zh2EnSbODqalBcxrNkppJTd1Sl3kIKrTylMM0
MyxL1LKWqQyMEjpQpnefKwLzVy88f16e++J+3vd+LBb8cxi8TP5KxhrhklXLfWm0hXafP34dGB963/zh
/Wjr9M+pJ1T754nBQsyRLd9wkFbbOW7pE6dRBCqKv0fps5H2IB/7dfUIPdsCmaoHwqR7RtczZDXV60jV
wjmAnZmdFgHJN25xSuNBNmQi7Xot8l5qIL7cjnDNE8SUvYD4VBsiztZN27kUKikAiyrLv5DNkmvniSsS
eL5g49FEIyan+nHXMIR9dc9AthgRWzWA3Wc6kFJ9HduOX5he5XT6KAVYZgasdk73ts9JmnHslCJ2WIY3
3wz4OmPEgNEE5esxRLWPgtQPQlrQDaUpGrkmARwj8set7JMFZoCdKEttqWZhbeU28Hvk0EwWYNQ0CaW2
A2SPCTsajYjQ9iMs24CMES+kjPHgmnMEa7l5p8yADWT2CHtXOVhRWngm6BB0qBInLjZB2vcJIQYTAmuG
IS56hpDjBuRN+CF6iI1Nl/zgKChrMgNsYlN/uElugyVvAjv/OTzL+sG/MQx+zVvwda8gLOqD6HQ3BPKH
COhdB+dGa1ir3OHgUzViBtAlKWNMUgVuZD2YUj2YkTqwZKVwjqkAL6UJ/uldECS1w0PagPXFMrDO7QVn
jxoMbskfB2xVEeFWj00CPThherj37YR4MA7y1ydBVpfAV94Cr6g28KJbwU9sxtaEeniSNVjDVGT9duCQ
EUS43QaxpQLrykVY3CwGrzsBW3oTETJwAJE31fBNNkCY2ozwC72I1vfDJ6Htk5X9EZEZQP3nYlt28VXC
ow6EpBAWaiZod9zB6AiHy9N4cJ/GgPtyO/XA5Yi4RiXycCdsXQuyKR39b5AoGpPB0TUQHrWwleVihU4I
u8Yw2Dz0hU1HAFy6EsFPq4T3/nY4h1ZpKbHrnCTOZpuCODFcrhQ7eNVi6TERrDWBoN/ngaPNhb/yPoJy
W6ftvdUFf8SL/l3C2VFos/Gkb0wPXr31aCndP/4dsUfxhfAqfczgnFdYE6nBs7bnLdI80n9e/AKxCsOV
gSO8kwAAAABJRU5ErkJggg==
</value>
</data>
<data name="btnUpdate.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAg1JREFUOE+tk+9L
U1EYx/fXFPQierHeDXphtZmFUBLcjNYLLcyiH26lkIbZFMfd1cwNXS0N07iL5na31tyVkshl5Cimc7AN
8dZWLdLSpTbb+nbvCVYnrAg88Hlznuf5POccnqNSbcR64F+GV8hiaHAeNx0Z2KxpcBYJraYkGuqjBKNh
Goa6qSKHK+0o9vZ6sxgVAXPHPP62/I8i2FrmgplNYMv2kp+CYdfiPwWruTwE8QU273ZCV2qiBTy/gNHg
+idYWytA4dPnL7gXmMSmXTzU6hpa4LjxDvd9OTSZUsUbFArf8DVfwIePqwTp7SKGPE+J4NTZcVpgs6bg
dq/A0DSLaDyN8NQcxsMJPAzNYHgkTOB9EzByPwTHa8doQScnwelcgtkmgamdRNnRx9AcDGDbXjcp+BVN
pQB9lUgL2ttmcXtwAb32N+iySrBwSbS2x3CpJYJz5ycIJ888wbETY9BXi2D0flpwuTmOvv4MurolsB0J
qEur1kXpzBzx4wAj0ILGizH02NNgLUlS+CqVQV5+QIXsSo7A9gVJbD/jwb4KFy2ovxDF1WtzuNI2Q5KU
wopDAoKhGF6/XyIM+KZJTCnWlTtpgUEeU7Mljsbml38U9HsiJKYt51Gy585vAnnGjQ3PcbouRJLuep/B
1D0CziHKBAns9QCJ7dAOQLPzFi2Qp0el07aQzf9hIz6y6juAficIctTi+AAAAABJRU5ErkJggg==
</value>
</data>
<data name="btnViewLog.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAiFJREFUOE+lk/9P
EmEcx+tPdLVaqx9arbH1Rbf8ha10Za3N1dJNB6sEhkFcXid+IcRSQjlJhJqAfJETIowvhzlLZjV4znfP
c4xDg7a2bnvfPXf7vF/vz/N8dicBnPiviwGa4ld3urhApWr3lzHuK8CyuI1nbz5jjPPAxLkguBZgdQjf
l7zevqZHM7MPjhW5FP1SQ0pWkGQqK1gJxzAyFYaYKuInLVrLyrDwc4okpW+q3bPb35KNc1k8tTnBBQuQ
9oC4DCR2AU+0BGFyWtIAnZITNH2jSGCxC/hIjemvQHkf2DkAkhRmsgl1DfB8qai2vVlpiK0ZIF5SYH0x
geX0HuQfwC8C7CuAN16CwWBMagAzPaxNmVAjwUaJIFYgiFJFtusQnK9hn/Ehla+ARYakAgwmGwmHw90a
4Ml8jiY3TO+zNYhbNQQyNbyaFcHzAvS378I8zoHjXmLYYEFkff3GsSmMurYQo8mBTB1+qSHeHUQ+l4fu
ei9EiaBn1E+3UseVhwvU2xq9OoUhZwprOdIyT3qQ/5THJV033iUOaEcEV4d8EDOHuPhgvh0wOBGn6UQt
ZFpdXoR+4DHM0yH6rqhiyQxwfsDdDrhvj2iFTUPreaglO8QKzvbPVtq20G/9cATQMPwplnymb6Z66tZU
VxtAPxbcdYa+dTQyUKfkY1PoNQZO94z4q9eGfdA98uLy4Fv1sC7cc+PcHVfH5I4/09HW/nX9G9TaBKNr
RrciAAAAAElFTkSuQmCC
</value>
</data>
</root>

View file

@ -0,0 +1,115 @@
namespace WebsitePanel.Installer
{
partial class TopLogoControl
{
private System.Windows.Forms.Panel pnlLogo;
private System.Windows.Forms.PictureBox imgLogo;
private System.Windows.Forms.Label lblVersion;
private LineBox line;
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TopLogoControl));
this.pnlLogo = new System.Windows.Forms.Panel();
this.progressIcon = new WebsitePanel.Installer.Controls.ProgressIcon();
this.lblVersion = new System.Windows.Forms.Label();
this.imgLogo = new System.Windows.Forms.PictureBox();
this.line = new WebsitePanel.Installer.LineBox();
this.pnlLogo.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.imgLogo)).BeginInit();
this.SuspendLayout();
//
// pnlLogo
//
this.pnlLogo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pnlLogo.BackColor = System.Drawing.Color.White;
this.pnlLogo.Controls.Add(this.progressIcon);
this.pnlLogo.Controls.Add(this.lblVersion);
this.pnlLogo.Controls.Add(this.imgLogo);
this.pnlLogo.Location = new System.Drawing.Point(0, 0);
this.pnlLogo.Name = "pnlLogo";
this.pnlLogo.Size = new System.Drawing.Size(496, 63);
this.pnlLogo.TabIndex = 2;
//
// progressIcon
//
this.progressIcon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.progressIcon.Location = new System.Drawing.Point(452, 15);
this.progressIcon.Name = "progressIcon";
this.progressIcon.Size = new System.Drawing.Size(30, 30);
this.progressIcon.TabIndex = 4;
this.progressIcon.Visible = false;
//
// lblVersion
//
this.lblVersion.Font = new System.Drawing.Font("Verdana", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.lblVersion.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.lblVersion.Location = new System.Drawing.Point(317, 31);
this.lblVersion.Name = "lblVersion";
this.lblVersion.Size = new System.Drawing.Size(42, 13);
this.lblVersion.TabIndex = 2;
this.lblVersion.Text = "v1.0";
//
// imgLogo
//
this.imgLogo.Image = ((System.Drawing.Image)(resources.GetObject("imgLogo.Image")));
this.imgLogo.Location = new System.Drawing.Point(13, 7);
this.imgLogo.Name = "imgLogo";
this.imgLogo.Size = new System.Drawing.Size(303, 48);
this.imgLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.imgLogo.TabIndex = 0;
this.imgLogo.TabStop = false;
//
// line
//
this.line.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.line.Location = new System.Drawing.Point(0, 61);
this.line.Name = "line";
this.line.Size = new System.Drawing.Size(496, 2);
this.line.TabIndex = 3;
this.line.TabStop = false;
//
// TopLogoControl
//
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.line);
this.Controls.Add(this.pnlLogo);
this.Name = "TopLogoControl";
this.Size = new System.Drawing.Size(496, 64);
this.pnlLogo.ResumeLayout(false);
this.pnlLogo.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.imgLogo)).EndInit();
this.ResumeLayout(false);
}
#endregion
private WebsitePanel.Installer.Controls.ProgressIcon progressIcon;
}
}

View file

@ -0,0 +1,62 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System.Windows.Forms;
using System.Reflection;
namespace WebsitePanel.Installer
{
/// <summary>
/// Top logo
/// </summary>
internal partial class TopLogoControl : UserControl
{
/// <summary>
/// Initializes a new instance of the TopLogoControl class.
/// </summary>
public TopLogoControl()
{
// This call is required by the Windows Form Designer.
InitializeComponent();
lblVersion.Text = "v" + this.GetType().Assembly.GetName().Version.ToString(3);
}
internal void ShowProgress()
{
progressIcon.Visible = true;
progressIcon.StartAnimation();
}
internal void HideProgress()
{
progressIcon.Visible = false;
progressIcon.StopAnimation();
}
}
}

View file

@ -0,0 +1,202 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="imgLogo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhLwEwAIcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8P
DxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMj
IyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3
Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktL
S0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9f
X2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNz
c3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeH
h4iIiImJiYuLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5yc
nJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7Cw
sLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TE
xMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY
2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs
7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///wAA
ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQJAAD/ACwAAAAALwEwAAAI/wD/CRxIsKDBgwgTKlzIsKHDhxAj
SpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0BT+htKtKjR
o0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3DjyjVb7xcucl3x6Zvr
FhyuYPn4ZuV37Na1otxuEQtslp24cvuUqhP3Tqljc/yicqMQwBPXZDN6HPbabhy50+TMsRNctFEADuuW
wjONutxe1kTrzQjgpiigACjcnVUEwYKwpO5cPLDSDym9HRCW4NMcAQAnrmUAABD0NUyECeAlWP8YMcSQ
ONaLAGSIrVQQhAkUJkjAgA13bhgA2BT1A6CEcLO/CAAAH0npoh0F5SD1DAEA1CEVNxIA0AlXqjRQATBG
1RNMOFdJod2HIHLAimCMAKABe0npEUAA2gmggDVjTZOMVfXEAEAbRf0BgAn/lSVPCQD0cJtReXwYC1KT
ABAALw9GOCFX23BY1DYtECDLVVQA4MIvwgSDSyVOCNhAMHyVeOJS7GizBwASAMMNY2CB0UAYNNqII1E6
8ogWGQA40M1R+9QwAAMAwIGUFQB8gOJTEEpIVjLa1YIlAD4cxckBAAwRmVxmLpoUJABUcN5YLQBgRp03
5rhjj2Whop0oR1H/o8AFRgAwA5xDvfMBAFVM1eiTYjUj4C2T8jAkUVkAwACMnJroKVKNhOoNWTMAcAaq
dw6VJ6tkjTMBAHQahQkAMVwCgALUGAUMg5sclQ8zsLhyDD1H/TqUO8K4Qos2S42zyyq0KEMvUfios86m
8LCzi4CntLMOO5sSpY8zsbhSjDxIZWnsUZ9ol0tR9TwzC8D8HkWPOu40tw/Fr0TDVDq9tFJLNkh12lS0
FUxLVDzqwDNUPci8IgvNSfVjDS2r5GJNZv7YY7ALAHjBzjrq2GNUOsO4woov6hxVY6p4ropUPMS4Igs0
ERO8zjp75ZOMLuAwxY8SO2JcVBQApMENoZkY/2UIAA0wS5QpNRig3QAstItYhJ/w04gIH0IwheBEVcPF
t9oVoEIzRNWSgQijQXFBhABAcMF42xTFSg6YAiBACpU0V5TGxw7lina0DEUOICu0XjoW3xhVSAY/4DMM
Dwwq20TJRp1DhwYfOuDEM0bZzBTOOg9FRgZY+LPKC5GHkc5RtAixwIcMPDGPP5lYYAGDCZxugSZD9WOM
FxmA+IEhuH6drT/bMoo9GGECFgEgAT3AhVF2kYEMYCMbPygAAMZwMwAQwBhFQQf0TOEPGwCge0UhAgBs
MKR92EE7GjBCEfIHAD8szjptMBERkBAC7YRgGkVxhgcAYAAbNIEHFwDAlf+GwgoeSmMoSWiAArSTgAYw
QAMl60cfWHSBIhhhA9qxg+yGQrujVAIAAyDGUM6gnQ8AgQko0M4N2lGUE7rAFAlwQBCQsEMAwKBrU6qB
dlzQBBwYTgMzIor1loK9okABAEnIBACqSIQKaKcJViNKJgxHgR8wIQYLiEBsKMGABgwAAAVogBMrMZR2
gICHLEBCERw5oC36T1V6Ioo78NafJfzAAefiIFFmoR1c2MgCEADhUp6BKUQUpRali9sdAACCygxlHEHM
Q1EeoaQ5mGMo5RADGHVBlEbNAAGGwGM7DmG4H0RyH0cAgAjIpDtMMIMorTgXDv0hDmy0QkCayAY2tDH/
HX+MCwBrwIs/zqEG1x2JKF0sCj9E+AE2+mMLPJiFM+ehB+1Qoih4AAAFHFAFnaVDmwAwJlHkwQMAbKAV
/QyGCUa4vqEMUimFJMoU1MOAN5xjKN9IJwBWQRRvfKsJcfNHP6jxCOG04xrZWAEArqDPa/wHHSRIgzMY
040eAI5o/nhl2GLpD36MAQALmEQ8hmINICwye7QAwAGaYAFTiCMbzdhiUuxhIyMU5Q2ZiswtBECAX+wS
jAocSje+pQaj3MODT+gm6RhxFD5oZ4jkiFAilhJPBcxzKM8QUGCJMo78hYtgPgDAESKWpR4YRR+BEBCB
hrKMgeWmVE/YYkYB8IN6/xQlHicAAA62GC0F9MIoujBcKwTprArmrCgzBQAYjKKNCHWBKKcAI/WWUi00
HEUeyziKMD55nZ/ZCZY92msALmEUbgQREERJawB8KxU5aHQc3gXAIIayDg4AIBBEcS8HVjOUQixSoEWJ
hHqu6Q9v9rMo58hfGoYCDggAwA6UlWdRliEgSRUFVBPIniRLB18uAkAG0KCGNIaRiSJoxwcOVUp2aBBJ
f2Q0AMQyCl41MD5/zANqYjgKP/RYBuKe6XrSQm6fKDcUut2gn6JwHZOWIgNTPYUep+xDbr671R5lCQdp
G0oXKHWbtC51KrdYkSswWwABFAOhAABCZvBxAwBYgf8o6ARAE+oxjzrXmR5FFEB2CxyhPSQlCZSKTD5w
0KdM2BYplb2sPygMAAsTpQmZorOd50GPXLgOQx4OQAEKkDztPAHARnmHN5KRCrOywG4uBgAGbmoUSwBg
AtwYSjQkOAp6TJrSiPqB7F6alJgOZaYxYFpR2AAAFNhtGudbAaaT0uRTKYUf6cDGLyqBAQDIYcpg05bY
/NGOXfFB0namB3804Ewvg2Iq7OhAfobiiB35bCiujkDwtHE+8g4lHipgEwtUwG9+s2BXAPArnwGAiaRk
RwX3GAovSDeDR3S4KImecIWLsg8WACACK+g3v1cAOQDAAs0BIAABCvCAEkRhFbj/Gooz+BCEEhDqQytA
dUZT4MyijOLi9fEHLGyYcY2v4AEfjiSvoRVkmWYKKUUawViHMgjtrJUVri1Ks5GCj1iQwQYd6DQA4oDt
/wXQH9NogEn3rXEWBNEBCfKHl8U4FSxoaTpMUG5RpoEAAKjCH0lOQDWIwo4drghELTKAAXYxFHshhYwo
aDEymCBB9eyBVREnCqMd7Y8fKcmAIAqA4Ifr4RlQ4xrY8EaKi5IPPixRWStQAht0AICYEyWjKnh3UUiB
86GEQjt/BzwBDECDlg79KL72x0yLgJSKKp0o/SBFk7UDA1gZZepGEQcSPmSBGlSBDfnjeny9vm1lGC73
IBqA/wEmEFQvv3MqnQAAAqbBDkfqcij4oIG1/PFVGxz4HSRwszOUwf/+9//dhncUWUJCRdEPw1AGrKQD
UuIPkcdaE0cwaRQFzOB/FJhipdUUScIrszAOA1MkrjcUsCd7REF7EZBzquA6nzCBFMh/1MA0v2cUwTd8
xQcAx1cU9LAKTdA6aoAr0EcwdAMBeWAM7JBw/WAj2pdVVKZtsfQMSxQIzbCC/NcM/eRlnDMV2oBLm1AL
AQABf1IU7vUC6GBxdFAU+EBovdIUjTIJSHEPTXYFScENYsAiPTYUDbhoD0gUOwAASvAUCZUU96BUUSBs
Q1FQH5hqsXcUJJhzwvBYTvGCrf9RdL8GAMR3FMa3dEdBDG1md1LnZEWxXQHQXUTxDrl1hFqlhP8RDhYA
AJPVFFRIFfvwAwDwBUXyA4LoD8i0AKZAKB9TFF/FATW2FI3iBUihDJjyCM82fSYwMHXIaLlzV4uUdkzR
h0jBDUBnCUbBD7BYiCGIiLXnD+WQivrRFI5IFDEoiTNYg0jRDak4h0PRZGQgLn2SOkVhDUtEikkIQNu2
YwAQBHKVFK1IFYIAADWgR4RwFAkmAE8gABvwi0PhZVJ2FPdgiY3iAIEEZzMVAV2YZUMRBzuijBJGFM9g
OKNgFLzwSWMIkZboD9J4FFd4X0ZBCxKkjQBwiEaRiPVzBa//5gxIoQ5bNI5DQU2iImSTaBSVOBQa6Q/5
9o5EQWiJVRSudgDnRxRroB32mG34yFX+VQB3dxTwkHANqR1VOBXFMAAIMHLDgBRPoH4AIAVHYQ+1YgCE
wF+VZwtEIHADFwAiYJfoEEMA8AdEQQ1ooAxwMg0rpQXw9JG6E0RTMB34EBj64AQW5Ad4ZGO6QAS76GEb
oxT0kEYfcH79cAsbkGwyN5MiOBQ2ORTHQCgnsAtwQg6JsAQ9WVxKAQ/ioCMTYAzkcBsySIk0uHSkwAdB
5Q/7cAoJAAChUBRuhwHMYlu+ICBVwB7xUAgGUI9dB15EQQ6QUwGi4FrsEApB8HD/OBXy/5BbAEACLWUU
GUhwSJFU2jECVEAGVmBxAHAchVcdanABASAEY3AFNQQAVOBa0MBDOcAFY7AEDvYB6UKHB6Ro/eB2unUF
QZBz3QA+ABACU1AGVwA1ALBkkbgDtXMUkqAdEPAEYWBWRnBwqLZMKVCa/nBzEJBzQ1EJhjMAOeAFYoAE
QfQCRZEe67EUgQABxQkAD0AfQ+EhRIB06rR00UIBRRAGX9ADLMIEUZcKZXQFRNAu+ABoO8IFXZACD9Zk
hvIz+BGOQ8Ef/lEUuYA5MLAFZPAENQQBrKZ2YGkVabBp7GgU0eAABRABilYU4BAGQAciLjAJrtUNF1AA
pZAMy4dCgP9waM8UBJ/0IQpABYr2CiSXoETRDSWlHQ0gj/5ADmXgYCDCAo5wnv5wBQUABB9qFPtACBTw
IQGABe3ABwXwAqi2BwXgAixqCgVgAVg1FLBQA5gHVk9wlkThCAWgKEuRB3y1aWS5d/5gBQWQBEjRBwVw
AkunC0ACIhpgB6WpD3MQpABASp8qBY33aowwDzVQACeZVesapkMhCJrDLciABIbzIQTQA6wQMbWwaTpZ
Fe/ADdxQc6wKDtwADrVYXqoQCZEwCsxgqv6QD9/ADWM1D7xQCZMgCwRmWM4gCo4ACarwq0MxD9zgDQdG
FJVmCZ7QDFnmDawgCZAgCsuAakRxDtyWQA79mBTeYAqO0Alx5Q/rwA3iIGzsILQJKw8lm3JZdQyd4AiW
IAtdWBQBCw5HyXcCe7XdwBg2C41FUbThIGztAAya0AiUcAsbexTO0AmXgAuotg/KoAmPoAqjIg7cgCL9
MA51WxTtwA1fCyjRIAqPMAmrYA21Qw8Ce7L2kbiKu7iM27iO+7iQG7mSO7mUW7mWe7mYm7maOLu5nNu5
nvu5oBu6lhsUpFu6pnu6qJu6qru6rNu6rvu6sBu7sju7tFu7tnu7uJu7uru7vNu7DxEQADs=
</value>
</data>
</root>

View file

@ -0,0 +1,255 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Security;
using System.Security.Permissions;
using WebsitePanel.Installer.Common;
using WebsitePanel.Installer.Services;
using System.Xml;
using System.Runtime.Remoting.Lifetime;
using System.Security.Principal;
using WebsitePanel.Installer.Core;
using WebsitePanel.Installer.Configuration;
using System.Reflection;
namespace WebsitePanel.Installer
{
/// <summary>
/// Entry point class
/// </summary>
static class Program
{
public const string SetupFromXmlFileParam = "setupxml";
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
//
Utils.FixConfigurationSectionDefinition();
//check security permissions
if (!Utils.CheckSecurity())
{
ShowSecurityError();
return;
}
//check administrator permissions
if (!Utils.IsAdministrator())
{
ShowSecurityError();
return;
}
//check for running instance
if ( !Utils.IsNewInstance())
{
UiUtils.ShowRunningInstance();
return;
}
Log.WriteApplicationStart();
//AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
Application.ApplicationExit += new EventHandler(OnApplicationExit);
Application.ThreadException += new ThreadExceptionEventHandler(OnThreadException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//check OS version
Log.WriteInfo("{0} detected", Global.OSVersion);
//check IIS version
if (Global.IISVersion.Major == 0)
Log.WriteError("IIS not found.");
else
Log.WriteInfo("IIS {0} detected", Global.IISVersion);
ApplicationForm mainForm = new ApplicationForm();
if (!CheckCommandLineArgument("/nocheck"))
{
//Check for new versions
if (CheckForUpdate(mainForm))
{
return;
}
}
// Load setup parameters from an XML file
LoadSetupXmlFile();
//start application
mainForm.InitializeApplication();
Application.Run(mainForm);
//
Utils.SaveMutex();
}
private static void LoadSetupXmlFile()
{
string file = GetCommandLineArgumentValue(SetupFromXmlFileParam);
if (!string.IsNullOrEmpty(file))
{
if (FileUtils.FileExists(file))
{
try
{
XmlDocument doc = new XmlDocument();
doc.Load(file);
Global.SetupXmlDocument = doc;
}
catch (Exception ex)
{
Log.WriteError("I/O error", ex);
}
}
}
}
/// <summary>
/// Application thread exception handler
/// </summary>
static void OnThreadException(object sender, ThreadExceptionEventArgs e)
{
Log.WriteError("Fatal error occured.", e.Exception);
string message = "A fatal error has occurred. We apologize for this inconvenience.\n" +
"Please contact Technical Support at support@websitepanel.net.\n\n" +
"Make sure you include a copy of the Installer.log file from the\n" +
"WebsitePanel Installer home directory.";
MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
/// <summary>
/// Application exception handler
/// </summary>
static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Log.WriteError("Fatal error occured.", (Exception)e.ExceptionObject);
string message = "A fatal error has occurred. We apologize for this inconvenience.\n" +
"Please contact Technical Support at support@websitepanel.net.\n\n" +
"Make sure you include a copy of the Installer.log file from the\n" +
"WebsitePanel Installer home directory.";
MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error);
Process.GetCurrentProcess().Kill();
}
private static void ShowSecurityError()
{
string message = "You do not have the appropriate permissions to perform this operation. Make sure you are running the application from the local disk and you have local system administrator privileges.";
MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
/// <summary>
/// Writes to log on application exit
/// </summary>
private static void OnApplicationExit(object sender, EventArgs e)
{
Log.WriteApplicationEnd();
}
/// <summary>
/// Check whether application is up-to-date
/// </summary>
private static bool CheckForUpdate(ApplicationForm mainForm)
{
if (!AppConfigManager.AppConfiguration.GetBooleanSetting(ConfigKeys.Web_AutoCheck))
return false;
string appName = mainForm.Text;
string fileName;
bool updateAvailable;
try
{
updateAvailable = mainForm.CheckForUpdate(out fileName);
}
catch (Exception ex)
{
Log.WriteError("Update error", ex);
mainForm.ShowServerError();
return false;
}
if (updateAvailable)
{
string message = string.Format("An updated version of {0} is available now.\nWould you like to download and install the latest version?", appName);
if (MessageBox.Show(message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
{
return mainForm.StartUpdateProcess(fileName);
}
}
return false;
}
/// <summary>
/// Check for existing command line argument
/// </summary>
private static bool CheckCommandLineArgument(string argName)
{
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++)
{
string arg = args[i];
if (string.Equals(arg, argName, StringComparison.InvariantCultureIgnoreCase))
{
return true;
}
}
return false;
}
/// <summary>
/// Check for existing command line argument
/// </summary>
private static string GetCommandLineArgumentValue(string argName)
{
string key = "/"+argName.ToLower()+":";
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++)
{
string arg = args[i].ToLower();
if (arg.StartsWith(key))
{
return arg.Substring(key.Length);
}
}
return null;
}
}
}

View file

@ -0,0 +1,49 @@
// Copyright (c) 2011, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("WebsitePanel Installer")]
[assembly: AssemblyDescription("WebsitePanel Installer")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("WebsitePanel Installer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("45D4837C-45BA-426A-B41C-BCD17AD97FCD")]

Some files were not shown because too many files have changed in this diff Show more