Initial Commit

This commit is contained in:
2016-07-27 00:32:34 -04:00
commit 8d162b2035
701 changed files with 188672 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<JustCodeSettings Version="0.0.6" Timestamp="c8a3b9d1-e208-41a9-a471-94216b52d3fa">
<IgnoredErrorsAndWarningsSettings xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<IgnoredErrorsAndWarnings />
</IgnoredErrorsAndWarningsSettings>
</JustCodeSettings>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<JustCodeSettings Version="0.0.7" Timestamp="cd35307a-831f-4322-9c03-73a8461e45ca">
<IgnoredErrorsAndWarningsSettings xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<IgnoredErrorsAndWarnings />
</IgnoredErrorsAndWarningsSettings>
</JustCodeSettings>

View File

@@ -0,0 +1,87 @@
<?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)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{BCEBDBDD-70F3-4FF4-A110-6C42DD905BA9}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>AutoUpdater</RootNamespace>
<AssemblyName>AutoUpdater</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Target\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Target\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="RemObjects.InternetPack, Version=7.0.63.1055, Culture=neutral, PublicKeyToken=3df3cad1b7aa5098, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\RemObjects\Server\RemObjects.InternetPack.dll</HintPath>
</Reference>
<Reference Include="RemObjects.SDK, Version=7.0.63.1055, Culture=neutral, PublicKeyToken=3df3cad1b7aa5098, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\RemObjects\Server\RemObjects.SDK.dll</HintPath>
</Reference>
<Reference Include="RemObjects.SDK.ZLib, Version=7.0.63.1055, Culture=neutral, PublicKeyToken=3df3cad1b7aa5098, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\RemObjects\Server\RemObjects.SDK.ZLib.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Yaulw, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\Sdaleo\Yaulw.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RegistrationWrapper.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Pluto.MSL.Api\Pluto.MSL.Api.csproj">
<Project>{B794609D-A93E-41E3-9291-84FC73412347}</Project>
<Name>Pluto.MSL.Api</Name>
</ProjectReference>
<ProjectReference Include="..\RegistrationAPI\RegistrationAPI.csproj">
<Project>{D8974253-F538-4AA6-B567-48B7CD574888}</Project>
<Name>RegistrationAPI</Name>
</ProjectReference>
</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,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pluto.Registration;
using Pluto.MSL.Api;
namespace AutoUpdater
{
class Program
{
const int SLEEP_INTERVAL_AFTER_EACH_UPDATE_CALL_TO_NOT_OVERLOAD_SERVER_IN_MS = 2000;
const int NUMBER_OF_TIMES_TO_RUN_THRU_UPDATE_LOOP_TO_MAKE_SURE_WE_UPDATED_ALL = 3;
static void Main(string[] args)
{
Client[] clients = RegistrationWrapper.GetClients();
if (clients != null)
{
for (int i = 0; i < NUMBER_OF_TIMES_TO_RUN_THRU_UPDATE_LOOP_TO_MAKE_SURE_WE_UPDATED_ALL; ++i)
{
foreach (Client client in clients)
{
bool bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(client.host.host, (uint)client.host.port, 0);
if (bCanConnect)
{
API.SetNetworkSettings(client.host.host, (uint)client.host.port);
API.UpdateServiceIfNeeded();
System.Threading.Thread.Sleep(SLEEP_INTERVAL_AFTER_EACH_UPDATE_CALL_TO_NOT_OVERLOAD_SERVER_IN_MS);
}
}
}
}
}
}
}

View File

@@ -0,0 +1,36 @@
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("AutoUpdater")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AutoUpdater")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[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("ca1b91d5-c929-4a11-af60-ac3c17e07083")]
// 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:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,141 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pluto.Api;
using System.Net;
using Pluto.Registration;
namespace AutoUpdater
{
internal static class RegistrationWrapper
{
// Allow the Registration wrapper to let the Service enter into a different 'disconnected' state
internal static int HasConnectivityErrorCountInARow = 0;
internal static int HasConnectivityErrorCountMaxBeforeStateChange = 10;
internal static string RegistrationHOST = "";
internal static uint RegistrationPORT = 0;
private const string DEFAULT_REGISTRATION_HOST_N_PORT_URL = "http://ppsmobile.mckesson.com/mobile1/REGURL.htm";
private const string DEFAULT_REGISTRATION_HOST_URL = "ppsmobile.mckesson.com";
private const int DEFAULT_REGISTRATION_CHANNEL_PORT = 443;
#region Connectivity
/// <summary>
/// Check to make sure we can communicate with the Registration Service.
/// Check the Server's ip & port for connectivity as well as that this
/// computer has connectivity.
/// This way we won't throw any connectivity errors, which is good.
/// </summary>
/// <returns>true, if successfully can connect, false otherwise</returns>
private static bool HasConnectivity()
{
try
{
bool bCanConnect = false;
bool bUseConfiguration = true;
// Try the overwritten Registration Host and Port first, if exists
if (RegistrationHOST != "" && RegistrationPORT > 0)
{
bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(RegistrationHOST, RegistrationPORT, 0);
if (bCanConnect)
bUseConfiguration = false;
}
// Else, fall-back on the configuration, if we couldn't connect
if (!bCanConnect)
{
bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(DEFAULT_REGISTRATION_HOST_URL, (uint)DEFAULT_REGISTRATION_CHANNEL_PORT, 0);
if (bCanConnect)
bUseConfiguration = true;
}
if (bCanConnect)
{
if (bUseConfiguration)
{
IPAddress ip = Yaulw.Net.IPHostHelper.GetIpForHost(DEFAULT_REGISTRATION_HOST_URL);
RegistrationAPI.API.SetNetworkSettings(ip.ToString(), (uint)DEFAULT_REGISTRATION_CHANNEL_PORT);
}
else
{
IPAddress ip = Yaulw.Net.IPHostHelper.GetIpForHost(RegistrationHOST);
RegistrationAPI.API.SetNetworkSettings(ip.ToString(), RegistrationPORT);
}
HasConnectivityErrorCountInARow = 0;
}
else
{
// Try to retrieve the latest Host and Port Setting online
try
{
string HostNPortSetOnline = Yaulw.Net.WCHelper.ScreenScrapeFromURL(DEFAULT_REGISTRATION_HOST_N_PORT_URL);
if (!String.IsNullOrEmpty(HostNPortSetOnline))
{
RegistrationHOST = HostNPortSetOnline.Split(';')[0];
RegistrationPORT = uint.Parse(HostNPortSetOnline.Split(';')[1]);
}
}
catch (Exception)
{
/* ignore */
}
// Try to connection one more time
if (RegistrationHOST != "" && RegistrationPORT > 0)
bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(RegistrationHOST, RegistrationPORT, 0);
// if we can connect, we are Golden
if (bCanConnect)
{
IPAddress ip = Yaulw.Net.IPHostHelper.GetIpForHost(RegistrationHOST);
RegistrationAPI.API.SetNetworkSettings(ip.ToString(), RegistrationPORT);
HasConnectivityErrorCountInARow = 0;
}
else
{
// Connectivity Errors too plentiful - Change the state of the service to reflect that
if (HasConnectivityErrorCountInARow >= HasConnectivityErrorCountMaxBeforeStateChange)
{
//PlutoService.state = HostGUIDstate.no_connectivity;
}
else
{
HasConnectivityErrorCountInARow++;
}
}
}
return bCanConnect;
}
catch (Exception)
{
}
return false;
}
#endregion
#region AutoUpdate / Client / Server Calls
public static Client[] GetClients()
{
try
{
if (HasConnectivity())
{
Client[] clients = RegistrationAPI.API.GetExternalClients();
return clients;
}
}
catch
{
/* ignore */
}
return null;
}
#endregion
}
}

View File

@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

View File

@@ -0,0 +1,235 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlutoServer", "PlutoServer\PlutoServer.csproj", "{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlutoServer.MSL", "PlutoServer.MSL\PlutoServer.MSL.csproj", "{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlutoServer.MSL.Interfaces", "PlutoServer.MSL.Interfaces\PlutoServer.MSL.Interfaces.csproj", "{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSLMobile", "MSLMobile\MSLMobile.csproj", "{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}"
ProjectSection(ProjectDependencies) = postProject
{7D79CD16-563E-470E-8042-58863719544A} = {7D79CD16-563E-470E-8042-58863719544A}
{D8974253-F538-4AA6-B567-48B7CD574888} = {D8974253-F538-4AA6-B567-48B7CD574888}
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C} = {36D78B93-9ECC-4BF1-852F-10E18B0EB41C}
{B794609D-A93E-41E3-9291-84FC73412347} = {B794609D-A93E-41E3-9291-84FC73412347}
{D6CC42F0-0F08-457F-84D1-44D0D25715F6} = {D6CC42F0-0F08-457F-84D1-44D0D25715F6}
{9C4B41FD-6889-4561-8236-C7F5F39529A1} = {9C4B41FD-6889-4561-8236-C7F5F39529A1}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TCMPortMapper", "TCMPortMapper\TCMPortMapper.csproj", "{7D79CD16-563E-470E-8042-58863719544A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrossProduct.Core", "CrossProduct.Core\CrossProduct.Core.csproj", "{D6CC42F0-0F08-457F-84D1-44D0D25715F6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSLConnect", "MSLConnect\MSLConnect.csproj", "{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegistrationServer", "RegistrationServer\RegistrationServer.csproj", "{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegistrationAPI", "RegistrationAPI\RegistrationAPI.csproj", "{D8974253-F538-4AA6-B567-48B7CD574888}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pluto.MSL.Api", "Pluto.MSL.Api\Pluto.MSL.Api.csproj", "{B794609D-A93E-41E3-9291-84FC73412347}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSLMobileMini", "MSLMobileMini\MSLMobileMini.csproj", "{3E73D722-5C05-4FCA-AF8C-F605F584943E}"
ProjectSection(ProjectDependencies) = postProject
{7D79CD16-563E-470E-8042-58863719544A} = {7D79CD16-563E-470E-8042-58863719544A}
{D8974253-F538-4AA6-B567-48B7CD574888} = {D8974253-F538-4AA6-B567-48B7CD574888}
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C} = {36D78B93-9ECC-4BF1-852F-10E18B0EB41C}
{B794609D-A93E-41E3-9291-84FC73412347} = {B794609D-A93E-41E3-9291-84FC73412347}
{D6CC42F0-0F08-457F-84D1-44D0D25715F6} = {D6CC42F0-0F08-457F-84D1-44D0D25715F6}
{9C4B41FD-6889-4561-8236-C7F5F39529A1} = {9C4B41FD-6889-4561-8236-C7F5F39529A1}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegistrationAPI_Tester", "RegistrationAPI_Tester\RegistrationAPI_Tester.csproj", "{9C4B41FD-6889-4561-8236-C7F5F39529A1}"
ProjectSection(ProjectDependencies) = postProject
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C} = {36D78B93-9ECC-4BF1-852F-10E18B0EB41C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegSetup", "RegSetup\RegSetup.csproj", "{6379CBD5-182A-4623-ADDD-C0FEE8A49247}"
ProjectSection(ProjectDependencies) = postProject
{B794609D-A93E-41E3-9291-84FC73412347} = {B794609D-A93E-41E3-9291-84FC73412347}
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74} = {6D35BEFC-9D4C-4317-9418-2DE43EB91A74}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RetrievePin", "RetrievePin\RetrievePin.csproj", "{745F51CE-00FC-4EE7-8616-E50B174BDCE1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlutoServer.MSL.Test", "PlutoServer.MSL.Test\PlutoServer.MSL.Test.csproj", "{D360B05B-D162-48E6-ACF5-92162DA78CEA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChoiceMSLConnect", "ChoiceMSLConnect\ChoiceMSLConnect.csproj", "{F2A07C3D-6858-421E-9A13-8ADF07372397}"
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
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Debug|Any CPU.ActiveCfg = Debug|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Debug|Mixed Platforms.Build.0 = Debug|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Debug|x86.ActiveCfg = Debug|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Debug|x86.Build.0 = Debug|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Release|Any CPU.ActiveCfg = Release|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Release|Mixed Platforms.ActiveCfg = Release|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Release|Mixed Platforms.Build.0 = Release|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Release|x86.ActiveCfg = Release|x86
{1D63BC36-9F90-4D83-BC76-03FB13AA1F50}.Release|x86.Build.0 = Release|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Debug|Any CPU.ActiveCfg = Debug|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Debug|Mixed Platforms.Build.0 = Debug|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Debug|x86.ActiveCfg = Debug|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Debug|x86.Build.0 = Debug|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Release|Any CPU.ActiveCfg = Release|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Release|Mixed Platforms.ActiveCfg = Release|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Release|Mixed Platforms.Build.0 = Release|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Release|x86.ActiveCfg = Release|x86
{36D78B93-9ECC-4BF1-852F-10E18B0EB41C}.Release|x86.Build.0 = Release|x86
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Debug|x86.ActiveCfg = Debug|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Release|Any CPU.Build.0 = Release|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9AD49C58-D0DD-4CC6-99A4-F1611DC29A8E}.Release|x86.ActiveCfg = Release|Any CPU
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Debug|Any CPU.ActiveCfg = Debug|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Debug|Mixed Platforms.Build.0 = Debug|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Debug|x86.ActiveCfg = Debug|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Debug|x86.Build.0 = Debug|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Release|Any CPU.ActiveCfg = Release|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Release|Mixed Platforms.ActiveCfg = Release|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Release|Mixed Platforms.Build.0 = Release|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Release|x86.ActiveCfg = Release|x86
{BEE2C01C-0CCC-4C0A-B578-021147AA10F3}.Release|x86.Build.0 = Release|x86
{7D79CD16-563E-470E-8042-58863719544A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D79CD16-563E-470E-8042-58863719544A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7D79CD16-563E-470E-8042-58863719544A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{7D79CD16-563E-470E-8042-58863719544A}.Debug|Mixed Platforms.Build.0 = Debug|x86
{7D79CD16-563E-470E-8042-58863719544A}.Debug|x86.ActiveCfg = Debug|x86
{7D79CD16-563E-470E-8042-58863719544A}.Debug|x86.Build.0 = Debug|x86
{7D79CD16-563E-470E-8042-58863719544A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D79CD16-563E-470E-8042-58863719544A}.Release|Any CPU.Build.0 = Release|Any CPU
{7D79CD16-563E-470E-8042-58863719544A}.Release|Mixed Platforms.ActiveCfg = Release|x86
{7D79CD16-563E-470E-8042-58863719544A}.Release|Mixed Platforms.Build.0 = Release|x86
{7D79CD16-563E-470E-8042-58863719544A}.Release|x86.ActiveCfg = Release|x86
{7D79CD16-563E-470E-8042-58863719544A}.Release|x86.Build.0 = Release|x86
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Debug|x86.ActiveCfg = Debug|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Release|Any CPU.Build.0 = Release|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D6CC42F0-0F08-457F-84D1-44D0D25715F6}.Release|x86.ActiveCfg = Release|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Debug|x86.ActiveCfg = Debug|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Release|Any CPU.Build.0 = Release|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}.Release|x86.ActiveCfg = Release|Any CPU
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Debug|Any CPU.ActiveCfg = Debug|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Debug|Mixed Platforms.Build.0 = Debug|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Debug|x86.ActiveCfg = Debug|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Debug|x86.Build.0 = Debug|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Release|Any CPU.ActiveCfg = Release|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Release|Mixed Platforms.ActiveCfg = Release|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Release|Mixed Platforms.Build.0 = Release|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Release|x86.ActiveCfg = Release|x86
{6D35BEFC-9D4C-4317-9418-2DE43EB91A74}.Release|x86.Build.0 = Release|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Debug|Any CPU.ActiveCfg = Debug|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Debug|Mixed Platforms.Build.0 = Debug|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Debug|x86.ActiveCfg = Debug|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Debug|x86.Build.0 = Debug|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Release|Any CPU.ActiveCfg = Release|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Release|Mixed Platforms.ActiveCfg = Release|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Release|Mixed Platforms.Build.0 = Release|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Release|x86.ActiveCfg = Release|x86
{D8974253-F538-4AA6-B567-48B7CD574888}.Release|x86.Build.0 = Release|x86
{B794609D-A93E-41E3-9291-84FC73412347}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Debug|x86.ActiveCfg = Debug|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Release|Any CPU.Build.0 = Release|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{B794609D-A93E-41E3-9291-84FC73412347}.Release|x86.ActiveCfg = Release|Any CPU
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Debug|Any CPU.ActiveCfg = Debug|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Debug|Mixed Platforms.Build.0 = Debug|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Debug|x86.ActiveCfg = Debug|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Debug|x86.Build.0 = Debug|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Release|Any CPU.ActiveCfg = Release|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Release|Mixed Platforms.ActiveCfg = Release|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Release|Mixed Platforms.Build.0 = Release|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Release|x86.ActiveCfg = Release|x86
{3E73D722-5C05-4FCA-AF8C-F605F584943E}.Release|x86.Build.0 = Release|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Debug|Any CPU.ActiveCfg = Debug|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Debug|Mixed Platforms.Build.0 = Debug|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Debug|x86.ActiveCfg = Debug|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Debug|x86.Build.0 = Debug|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Release|Any CPU.ActiveCfg = Release|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Release|Mixed Platforms.ActiveCfg = Release|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Release|Mixed Platforms.Build.0 = Release|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Release|x86.ActiveCfg = Release|x86
{9C4B41FD-6889-4561-8236-C7F5F39529A1}.Release|x86.Build.0 = Release|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Debug|Any CPU.ActiveCfg = Debug|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Debug|Mixed Platforms.Build.0 = Debug|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Debug|x86.ActiveCfg = Debug|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Debug|x86.Build.0 = Debug|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Release|Any CPU.ActiveCfg = Release|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Release|Mixed Platforms.ActiveCfg = Release|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Release|Mixed Platforms.Build.0 = Release|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Release|x86.ActiveCfg = Release|x86
{6379CBD5-182A-4623-ADDD-C0FEE8A49247}.Release|x86.Build.0 = Release|x86
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Debug|x86.ActiveCfg = Debug|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Release|Any CPU.Build.0 = Release|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{745F51CE-00FC-4EE7-8616-E50B174BDCE1}.Release|x86.ActiveCfg = Release|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Debug|x86.ActiveCfg = Debug|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Release|Any CPU.Build.0 = Release|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D360B05B-D162-48E6-ACF5-92162DA78CEA}.Release|x86.ActiveCfg = Release|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Debug|x86.ActiveCfg = Debug|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Release|Any CPU.Build.0 = Release|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{F2A07C3D-6858-421E-9A13-8ADF07372397}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

View File

@@ -0,0 +1,51 @@
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="RetrievePin._Default" %>
<!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 runat="server">
<title></title>
</head>
<body>
<form id="frmRegSubmit" runat="server">
<div>
McKesson Mobile Solution for Lytec / Medisoft,<br />
Retrieve Pin site. <b>Used for Testing Purpose</b>.<br />
<br />
For security reasons, the Api Code is time sensitive and will only<br />
work with the specified Api Key for up to 24 hours.
<br />
<br />
<em><strong>Make sure to inclue the &#39;-&#39; dashes.<br />
Upper-case does not matter.<br />
</strong></em>
<br />
<asp:Label ID="lblUserApiKey" runat="server" Text="Api Key:"></asp:Label>
<br />
<asp:TextBox ID="txtUserApiKey" runat="server" Width="307px"></asp:TextBox>
<br />
<br />
<asp:Label ID="lblPIN" runat="server" Text="Api Code:"></asp:Label>
<br />
<asp:TextBox ID="textPin" runat="server" ReadOnly="True" Width="153px"></asp:TextBox>
<br />
<br />
<br />
<asp:Button ID="btnRetrievePIN" runat="server" onclick="btnRetrievePIN_Click"
Text="Retrieve PIN" />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
McKesson Copyright © 2013</div>
</form>
</body>
</html>

View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
namespace RetrievePin
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnRetrievePIN_Click(object sender, EventArgs e)
{
try
{
if (!String.IsNullOrEmpty(txtUserApiKey.Text))
{
RegistrationAPI.API.SetNetworkSettings("127.0.0.1", 443);
string Pin = RegistrationAPI.API.RetrieveUserApiKeyPin(txtUserApiKey.Text.Trim());
if (String.IsNullOrEmpty(Pin))
textPin.Text = "Invalid User Api Key";
else
textPin.Text = Pin;
}
}
catch (Exception ex)
{
textPin.Text = ex.Message;
}
}
}
}

View File

@@ -0,0 +1,69 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace RetrievePin {
public partial class _Default {
/// <summary>
/// frmRegSubmit control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlForm frmRegSubmit;
/// <summary>
/// lblUserApiKey control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblUserApiKey;
/// <summary>
/// txtUserApiKey control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtUserApiKey;
/// <summary>
/// lblPIN control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblPIN;
/// <summary>
/// textPin control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox textPin;
/// <summary>
/// btnRetrievePIN control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnRetrievePIN;
}
}

View File

@@ -0,0 +1,35 @@
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("RetrievePin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RetrievePin")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[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("de8a6bd5-3189-417d-ae09-b6d73358d991")]
// 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 Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,110 @@
<?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>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{745F51CE-00FC-4EE7-8616-E50B174BDCE1}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>RetrievePin</RootNamespace>
<AssemblyName>RetrievePin</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<UseIISExpress>false</UseIISExpress>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Core" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web" />
<Reference Include="System.Xml" />
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Web.Mobile" />
</ItemGroup>
<ItemGroup>
<Content Include="Default.aspx" />
<Content Include="Scripts\jquery-1.4.1-vsdoc.js" />
<Content Include="Scripts\jquery-1.4.1.js" />
<Content Include="Scripts\jquery-1.4.1.min.js" />
<Content Include="Web.config" />
<Content Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</Content>
<Content Include="Web.Release.config">
<DependentUpon>Web.config</DependentUpon>
</Content>
</ItemGroup>
<ItemGroup>
<Compile Include="Default.aspx.cs">
<SubType>ASPXCodeBehind</SubType>
<DependentUpon>Default.aspx</DependentUpon>
</Compile>
<Compile Include="Default.aspx.designer.cs">
<DependentUpon>Default.aspx</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="App_Data\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\RegistrationAPI\RegistrationAPI.csproj">
<Project>{D8974253-F538-4AA6-B567-48B7CD574888}</Project>
<Name>RegistrationAPI</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<UseIIS>False</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>18397</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>
</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
</CustomServerUrl>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<!-- 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,28 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<StartPageUrl>
</StartPageUrl>
<StartAction>CurrentPage</StartAction>
<AspNetDebugging>True</AspNetDebugging>
<SilverlightDebugging>False</SilverlightDebugging>
<NativeDebugging>False</NativeDebugging>
<SQLDebugging>False</SQLDebugging>
<ExternalProgram>
</ExternalProgram>
<StartExternalURL>
</StartExternalURL>
<StartCmdLineArguments>
</StartCmdLineArguments>
<StartWorkingDirectory>
</StartWorkingDirectory>
<EnableENC>False</EnableENC>
<AlwaysStartWebServerOnDebug>True</AlwaysStartWebServerOnDebug>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
</Project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,167 @@
/*!
* jQuery JavaScript Library v1.4.1
* http://jquery.com/
*
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Date: Mon Jan 25 19:43:33 2010 -0500
*/
(function(z,v){function la(){if(!c.isReady){try{r.documentElement.doScroll("left")}catch(a){setTimeout(la,1);return}c.ready()}}function Ma(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var n in b)X(a,n,b[n],f,e,d);return a}if(d!==v){f=!i&&f&&c.isFunction(d);for(n=0;n<j;n++)e(a[n],b,f?d.call(a[n],n,e(a[n],b)):d,i);return a}return j?
e(a[0],b):null}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function ma(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function na(a){var b,d=[],f=[],e=arguments,i,j,n,o,m,s,x=c.extend({},c.data(this,"events").live);if(!(a.button&&a.type==="click")){for(o in x){j=x[o];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete x[o]}i=c(a.target).closest(f,
a.currentTarget);m=0;for(s=i.length;m<s;m++)for(o in x){j=x[o];n=i[m].elem;f=null;if(i[m].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==n)d.push({elem:n,fn:j})}}m=0;for(s=d.length;m<s;m++){i=d[m];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}}function oa(a,b){return"live."+(a?a+".":"")+b.replace(/\./g,"`").replace(/ /g,"&")}function pa(a){return!a||!a.parentNode||a.parentNode.nodeType===
11}function qa(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ra(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0&&(c.support.checkClone||!sa.test(a[0]))){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:r;f=b.createDocumentFragment();
c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=i?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(ta.concat.apply([],ta.slice(0,b)),function(){d[this]=a});return d}function ua(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Na=z.jQuery,Oa=z.$,r=z.document,S,Pa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Qa=/^.[^:#\[\.,]*$/,Ra=/\S/,Sa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Ta=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,O=navigator.userAgent,
va=false,P=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,Q=Array.prototype.slice,wa=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Pa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:r;if(a=Ta.exec(a))if(c.isPlainObject(b)){a=[r.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ra([d[1]],
[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=r.getElementById(d[2])){if(b.id!==d[2])return S.find(a);this.length=1;this[0]=b}this.context=r;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=r;a=r.getElementsByTagName(a)}else return!b||b.jquery?(b||S).find(a):c(b).find(a);else if(c.isFunction(a))return S.ready(a);if(a.selector!==v){this.selector=a.selector;this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a,
this)},selector:"",jquery:"1.4.1",length:0,size:function(){return this.length},toArray:function(){return Q.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=0;ba.apply(this,a);return this},each:function(a,b){return c.each(this,
a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(r,c);else P&&P.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(Q.apply(this,arguments),"slice",Q.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};
c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,n;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];n=e[i];if(a!==n)if(f&&n&&(c.isPlainObject(n)||c.isArray(n))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(n)?[]:{};a[i]=c.extend(f,j,n)}else if(n!==v)a[i]=n}return a};c.extend({noConflict:function(a){z.$=
Oa;if(a)z.jQuery=Na;return c},isReady:false,ready:function(){if(!c.isReady){if(!r.body)return setTimeout(c.ready,13);c.isReady=true;if(P){for(var a,b=0;a=P[b++];)a.call(r,c);P=null}c.fn.triggerHandler&&c(r).triggerHandler("ready")}},bindReady:function(){if(!va){va=true;if(r.readyState==="complete")return c.ready();if(r.addEventListener){r.addEventListener("DOMContentLoaded",L,false);z.addEventListener("load",c.ready,false)}else if(r.attachEvent){r.attachEvent("onreadystatechange",L);z.attachEvent("onload",
c.ready);var a=false;try{a=z.frameElement==null}catch(b){}r.documentElement.doScroll&&a&&la()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===v||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;
return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return z.JSON&&z.JSON.parse?z.JSON.parse(a):(new Function("return "+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Ra.test(a)){var b=r.getElementsByTagName("head")[0]||
r.documentElement,d=r.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(r.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===v||c.isFunction(a);if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=
a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Sa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==
v;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=v}else if(b&&!c.isFunction(b)){d=b;b=v}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},
uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});O=c.uaMatch(O);if(O.browser){c.browser[O.browser]=true;c.browser.version=O.version}if(c.browser.webkit)c.browser.safari=true;if(wa)c.inArray=function(a,b){return wa.call(b,a)};S=c(r);if(r.addEventListener)L=function(){r.removeEventListener("DOMContentLoaded",
L,false);c.ready()};else if(r.attachEvent)L=function(){if(r.readyState==="complete"){r.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=r.documentElement,b=r.createElement("script"),d=r.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support=
{leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:r.createElement("select").appendChild(r.createElement("option")).selected,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};
b.type="text/javascript";try{b.appendChild(r.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,a.firstChild);if(z[f]){c.support.scriptEval=true;delete z[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function n(){c.support.noCloneEvent=false;d.detachEvent("onclick",n)});d.cloneNode(true).fireEvent("onclick")}d=r.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=r.createDocumentFragment();a.appendChild(d.firstChild);
c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var n=r.createElement("div");n.style.width=n.style.paddingLeft="1px";r.body.appendChild(n);c.boxModel=c.support.boxModel=n.offsetWidth===2;r.body.removeChild(n).style.display="none"});a=function(n){var o=r.createElement("div");n="on"+n;var m=n in o;if(!m){o.setAttribute(n,"return;");m=typeof o[n]==="function"}return m};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props=
{"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ua=0,xa={},Va={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var f=a[G],e=c.cache;if(!b&&!f)return null;f||(f=++Ua);if(typeof b==="object"){a[G]=f;e=e[f]=c.extend(true,
{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Va:(e[f]={});if(d!==v){a[G]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[G]}catch(i){a.removeAttribute&&a.removeAttribute(G)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,
a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===v){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===v&&this.length)f=c.data(this[0],a);return f===v&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);
return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===v)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||
a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var ya=/[\n\t]/g,ca=/\s+/,Wa=/\r/g,Xa=/href|src|style/,Ya=/(button|input)/i,Za=/(button|input|object|select|textarea)/i,$a=/^(a|area)$/i,za=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=
c(this);m.addClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,n=b.length;j<n;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=c(this);m.removeClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string"||a===v)for(var b=(a||"").split(ca),
d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(ya," "),j=0,n=b.length;j<n;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),n=b,o=
a.split(ca);e=o[i++];){n=f?n:!j.hasClass(e);j[n?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(ya," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===v){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||
{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(za.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Wa,"")}return v}var n=c.isFunction(a);return this.each(function(o){var m=c(this),s=a;if(this.nodeType===1){if(n)s=a.call(this,o,m.val());
if(typeof s==="number")s+="";if(c.isArray(s)&&za.test(this.type))this.checked=c.inArray(m.val(),s)>=0;else if(c.nodeName(this,"select")){var x=c.makeArray(s);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),x)>=0});if(!x.length)this.selectedIndex=-1}else this.value=s}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return v;if(f&&b in c.attrFn)return c(a)[b](d);
f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==v;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Xa.test(b);if(b in a&&f&&!i){if(e){b==="type"&&Ya.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Za.test(a.nodeName)||$a.test(a.nodeName)&&a.href?0:v;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=
""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?v:a}return c.style(a,b,d)}});var ab=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==z&&!a.frameElement)a=z;if(!d.guid)d.guid=c.guid++;if(f!==v){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j=
function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):v};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var n,o=0;n=b[o++];){var m=n.split(".");n=m.shift();if(o>1){d=c.proxy(d);if(f!==v)d.data=f}d.type=m.slice(0).sort().join(".");var s=e[n],x=this.special[n]||{};if(!s){s=e[n]={};if(!x.setup||x.setup.call(a,f,m,d)===false)if(a.addEventListener)a.addEventListener(n,i,false);else a.attachEvent&&a.attachEvent("on"+n,i)}if(x.add)if((m=x.add.call(a,
d,f,m,s))&&c.isFunction(m)){m.guid=m.guid||d.guid;m.data=m.data||d.data;m.type=m.type||d.type;d=m}s[d.guid]=d;this.global[n]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===v||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);for(var n=0;i=b[n++];){var o=i.split(".");i=o.shift();var m=!o.length,s=c.map(o.slice(0).sort(),ab);s=new RegExp("(^|\\.)"+
s.join("\\.(?:.*\\.)?")+"(\\.|$)");var x=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var A in f[i])if(m||s.test(f[i][A].type))delete f[i][A];x.remove&&x.remove.call(a,o,j);for(e in f[i])break;if(!e){if(!x.teardown||x.teardown.call(a,o)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(A=c.data(a,"handle"))A.elem=null;c.removeData(a,
"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return v;a.result=v;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,
b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(i){}if(!a.isPropagationStopped()&&f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){d=a.target;var j;if(!(c.nodeName(d,"a")&&e==="click")&&!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){try{if(d[e]){if(j=d["on"+e])d["on"+e]=null;this.triggered=true;d[e]()}}catch(n){}if(j)d["on"+e]=j;this.triggered=false}}},handle:function(a){var b,
d;a=arguments[0]=c.event.fix(a||z.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==v){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||r;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=r.documentElement;d=r.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==v)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;b.liveProxy=a;c.event.add(this,b.live,na,b)},remove:function(a){if(a.length){var b=
0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],na)}},special:{}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};
c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y};var Aa=function(a){for(var b=
a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ba=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ba:Aa,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ba:Aa)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!==
"form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return ma("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return ma("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this,
"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var da=/textarea|input|select/i;function Ca(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ea(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Ca(d);if(a.type!=="focusout"||
d.type!=="radio")c.data(d,"_change_data",e);if(!(f===v||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}}c.event.special.change={filters:{focusout:ea,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ea.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ea.call(this,a)},beforeactivate:function(a){a=
a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Ca(a))}},setup:function(a,b,d){for(var f in T)c.event.add(this,f+".specialChange."+d.guid,T[f]);return da.test(this.nodeName)},remove:function(a,b){for(var d in T)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),T[d]);return da.test(this.nodeName)}};var T=c.event.special.change.filters}r.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,
f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){e=f;f=v}var j=b==="one"?c.proxy(e,function(n){c(this).unbind(n,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a,
b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+
a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e){var i,j=0;if(c.isFunction(f)){e=f;f=v}for(d=(d||"").split(/\s+/);(i=d[j++])!=null;){i=i==="focus"?"focusin":i==="blur"?"focusout":i==="hover"?d.push("mouseleave")&&"mouseenter":i;b==="live"?c(this.context).bind(oa(i,this.selector),{data:f,selector:this.selector,
live:i},e):c(this.context).unbind(oa(i,this.selector),e?{guid:e.guid+this.selector+i}:null)}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});z.attachEvent&&!z.addEventListener&&z.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
(function(){function a(g){for(var h="",k,l=0;g[l];l++){k=g[l];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===k){y=l[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=k;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}l[q]=y}}}function d(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===
k){y=l[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=k;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(o.filter(h,[t]).length>0){y=t;break}}t=t[g]}l[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,i=Object.prototype.toString,j=false,n=true;[0,0].sort(function(){n=false;return 0});var o=function(g,h,k,l){k=k||[];var q=h=h||r;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||
typeof g!=="string")return k;for(var p=[],u,t,y,R,H=true,M=w(h),I=g;(f.exec(""),u=f.exec(I))!==null;){I=u[3];p.push(u[1]);if(u[2]){R=u[3];break}}if(p.length>1&&s.exec(g))if(p.length===2&&m.relative[p[0]])t=fa(p[0]+p[1],h);else for(t=m.relative[p[0]]?[h]:o(p.shift(),h);p.length;){g=p.shift();if(m.relative[g])g+=p.shift();t=fa(g,t)}else{if(!l&&p.length>1&&h.nodeType===9&&!M&&m.match.ID.test(p[0])&&!m.match.ID.test(p[p.length-1])){u=o.find(p.shift(),h,M);h=u.expr?o.filter(u.expr,u.set)[0]:u.set[0]}if(h){u=
l?{expr:p.pop(),set:A(l)}:o.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=u.expr?o.filter(u.expr,u.set):u.set;if(p.length>0)y=A(t);else H=false;for(;p.length;){var D=p.pop();u=D;if(m.relative[D])u=p.pop();else D="";if(u==null)u=h;m.relative[D](y,u,M)}}else y=[]}y||(y=t);y||o.error(D||g);if(i.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))k.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&
y[g].nodeType===1&&k.push(t[g]);else k.push.apply(k,y);else A(y,k);if(R){o(R,q,k,l);o.uniqueSort(k)}return k};o.uniqueSort=function(g){if(C){j=n;g.sort(C);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};o.matches=function(g,h){return o(g,null,null,h)};o.find=function(g,h,k){var l,q;if(!g)return[];for(var p=0,u=m.order.length;p<u;p++){var t=m.order[p];if(q=m.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");l=m.find[t](q,
h,k);if(l!=null){g=g.replace(m.match[t],"");break}}}}l||(l=h.getElementsByTagName("*"));return{set:l,expr:g}};o.filter=function(g,h,k,l){for(var q=g,p=[],u=h,t,y,R=h&&h[0]&&w(h[0]);g&&h.length;){for(var H in m.filter)if((t=m.leftMatch[H].exec(g))!=null&&t[2]){var M=m.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(u===p)p=[];if(m.preFilter[H])if(t=m.preFilter[H](t,u,k,p,l,R)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=u[U])!=null;U++)if(D){I=M(D,t,U,u);var Da=
l^!!I;if(k&&I!=null)if(Da)y=true;else u[U]=false;else if(Da){p.push(D);y=true}}if(I!==v){k||(u=p);g=g.replace(m.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)o.error(g);else break;q=g}return u};o.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var m=o.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,h){var k=typeof h==="string",l=k&&!/\W/.test(h);k=k&&!l;if(l)h=h.toLowerCase();l=0;for(var q=g.length,
p;l<q;l++)if(p=g[l]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[l]=k||p&&p.nodeName.toLowerCase()===h?p||false:p===h}k&&o.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var l=0,q=g.length;l<q;l++){var p=g[l];if(p){k=p.parentNode;g[l]=k.nodeName.toLowerCase()===h?k:false}}}else{l=0;for(q=g.length;l<q;l++)if(p=g[l])g[l]=k?p.parentNode:p.parentNode===h;k&&o.filter(h,g,true)}},"":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=
h=h.toLowerCase();q=b}q("parentNode",h,l,g,p,k)},"~":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,l,g,p,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];h=h.getElementsByName(g[1]);for(var l=0,q=h.length;l<q;l++)h[l].getAttribute("name")===g[1]&&k.push(h[l]);return k.length===0?null:k}},
TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,l,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var u;(u=h[p])!=null;p++)if(u)if(q^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||l.push(u);else if(k)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&
"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,l,q,p){h=g[1].replace(/\\/g,"");if(!p&&m.attrMap[h])g[1]=m.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,l,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=o(g[3],null,null,h);else{g=o.filter(g[3],h,k,true^q);k||l.push.apply(l,g);return false}else if(m.match.POS.test(g[0])||m.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);
return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!o(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===
g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,h){return h===0},last:function(g,h,k,l){return h===l.length-1},even:function(g,h){return h%2===
0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,l){var q=h[1],p=m.filters[q];if(p)return p(g,k,h,l);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=h[3];k=0;for(l=h.length;k<l;k++)if(h[k]===g)return false;return true}else o.error("Syntax error, unrecognized expression: "+
q)},CHILD:function(g,h){var k=h[1],l=g;switch(k){case "only":case "first":for(;l=l.previousSibling;)if(l.nodeType===1)return false;if(k==="first")return true;l=g;case "last":for(;l=l.nextSibling;)if(l.nodeType===1)return false;return true;case "nth":k=h[2];var q=h[3];if(k===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var u=0;for(l=p.firstChild;l;l=l.nextSibling)if(l.nodeType===1)l.nodeIndex=++u;p.sizcache=h}g=g.nodeIndex-q;return k===0?g===0:g%k===0&&g/k>=
0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=m.attrHandle[k]?m.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var l=h[2];h=h[4];return g==null?l==="!=":l==="="?k===h:l==="*="?k.indexOf(h)>=0:l==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:l==="!="?k!==h:l==="^="?
k.indexOf(h)===0:l==="$="?k.substr(k.length-h.length)===h:l==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,l){var q=m.setFilters[h[2]];if(q)return q(g,k,h,l)}}},s=m.match.POS;for(var x in m.match){m.match[x]=new RegExp(m.match[x].source+/(?![^\[]*\])(?![^\(]*\))/.source);m.leftMatch[x]=new RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[x].source.replace(/\\(\d+)/g,function(g,h){return"\\"+(h-0+1)}))}var A=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};
try{Array.prototype.slice.call(r.documentElement.childNodes,0)}catch(B){A=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,l=g.length;k<l;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var C;if(r.documentElement.compareDocumentPosition)C=function(g,h){if(!g.compareDocumentPosition||!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===
h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in r.documentElement)C=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(r.createRange)C=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),l=h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);l.setStart(h,0);l.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END,
l);if(g===0)j=true;return g};(function(){var g=r.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=r.documentElement;k.insertBefore(g,k.firstChild);if(r.getElementById(h)){m.find.ID=function(l,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(l[1]))?q.id===l[1]||typeof q.getAttributeNode!=="undefined"&&q.getAttributeNode("id").nodeValue===l[1]?[q]:v:[]};m.filter.ID=function(l,q){var p=typeof l.getAttributeNode!=="undefined"&&l.getAttributeNode("id");
return l.nodeType===1&&p&&p.nodeValue===q}}k.removeChild(g);k=g=null})();(function(){var g=r.createElement("div");g.appendChild(r.createComment(""));if(g.getElementsByTagName("*").length>0)m.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var l=0;k[l];l++)k[l].nodeType===1&&h.push(k[l]);k=h}return k};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(h){return h.getAttribute("href",
2)};g=null})();r.querySelectorAll&&function(){var g=o,h=r.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){o=function(l,q,p,u){q=q||r;if(!u&&q.nodeType===9&&!w(q))try{return A(q.querySelectorAll(l),p)}catch(t){}return g(l,q,p,u)};for(var k in g)o[k]=g[k];h=null}}();(function(){var g=r.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){m.order.splice(1,0,"CLASS");m.find.CLASS=function(h,k,l){if(typeof k.getElementsByClassName!=="undefined"&&!l)return k.getElementsByClassName(h[1])};g=null}}})();var E=r.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,h){return g!==h&&(g.contains?g.contains(h):true)},w=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},fa=function(g,h){var k=[],
l="",q;for(h=h.nodeType?[h]:h;q=m.match.PSEUDO.exec(g);){l+=q[0];g=g.replace(m.match.PSEUDO,"")}g=m.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)o(g,h[q],k);return o.filter(l,k)};c.find=o;c.expr=o.selectors;c.expr[":"]=c.expr.filters;c.unique=o.uniqueSort;c.getText=a;c.isXMLDoc=w;c.contains=E})();var bb=/Until$/,cb=/^(?:parents|prevUntil|prevAll)/,db=/,/;Q=Array.prototype.slice;var Ea=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a,
function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Qa.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=
0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ea(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ea(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i={},j;if(f&&a.length){e=0;for(var n=a.length;e<n;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)>
-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var o=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(m,s){for(;s&&s.ownerDocument&&s!==b;){if(o?o.index(s)>-1:c(s).is(a))return s;s=s.parentNode}return null})},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),
a);return this.pushStack(pa(a[0])||pa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},
nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);bb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):
e;if((this.length>1||db.test(f))&&cb.test(a))e=e.reverse();return this.pushStack(e,a,Q.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===v||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==
b&&d.push(a);return d}});var Fa=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ga=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,sa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ia=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],
col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==v)return this.empty().append((this[0]&&this[0].ownerDocument||r).createTextNode(a));return c.getText(this)},
wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?
d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,
false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&
!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Fa,"").replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){qa(this,b);qa(this.find("*"),b.find("*"))}return b},html:function(a){if(a===v)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Fa,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(Ha.exec(a)||
["",""])[1].toLowerCase()]){a=a.replace(Ga,Ia);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,
b,f))});else a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(s){return c.nodeName(s,"table")?s.getElementsByTagName("tbody")[0]||s.appendChild(s.ownerDocument.createElement("tbody")):s}var e,i,j=a[0],n=[];if(!c.support.checkClone&&arguments.length===3&&typeof j===
"string"&&sa.test(j))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(j))return this.each(function(s){var x=c(this);a[0]=j.call(this,s,b?x.html():v);x.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ra(a,this,n);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var o=0,m=this.length;o<m;o++)d.call(b?f(this[o],i):this[o],e.cacheable||this.length>1||o>0?e.fragment.cloneNode(true):e.fragment)}n&&c.each(n,
Ma)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){c.cleanData(this.getElementsByTagName("*"));c.cleanData([this])}this.parentNode&&
this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&c.cleanData(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||r;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||r;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j===
"string"){j=j.replace(Ga,Ia);var n=(Ha.exec(j)||["",""])[1].toLowerCase(),o=F[n]||F._default,m=o[0];i=b.createElement("div");for(i.innerHTML=o[1]+j+o[2];m--;)i=i.lastChild;if(!c.support.tbody){m=fb.test(j);n=n==="table"&&!m?i.firstChild&&i.firstChild.childNodes:o[1]==="<table>"&&!m?i.childNodes:[];for(o=n.length-1;o>=0;--o)c.nodeName(n[o],"tbody")&&!n[o].childNodes.length&&n[o].parentNode.removeChild(n[o])}!c.support.leadingWhitespace&&V.test(j)&&i.insertBefore(b.createTextNode(V.exec(j)[0]),i.firstChild);
j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()==="text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e},cleanData:function(a){for(var b=0,d;(d=a[b])!=null;b++){c.event.remove(d);c.removeData(d)}}});var hb=/z-?index|font-?weight|opacity|zoom|line-?height/i,
Ja=/alpha\([^)]*\)/,Ka=/opacity=([^)]*)/,ga=/float/i,ha=/-([a-z])/ig,ib=/([A-Z])/g,jb=/^-?\d+(?:px)?$/i,kb=/^-?\d/,lb={position:"absolute",visibility:"hidden",display:"block"},mb=["Left","Right"],nb=["Top","Bottom"],ob=r.defaultView&&r.defaultView.getComputedStyle,La=c.support.cssFloat?"cssFloat":"styleFloat",ia=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===v)return c.curCSS(d,f);if(typeof e==="number"&&!hb.test(f))e+="px";c.style(d,f,e)})};
c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return v;if((b==="width"||b==="height")&&parseFloat(d)<0)d=v;var f=a.style||a,e=d!==v;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=Ja.test(a)?a.replace(Ja,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ka.exec(f.filter)[1])/100+"":""}if(ga.test(b))b=La;b=b.replace(ha,ia);if(e)f[b]=d;return f[b]},css:function(a,
b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?mb:nb;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,"border"+this+"Width",true))||0})}a.offsetWidth!==0?j():c.swap(a,lb,j);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&
a.currentStyle){f=Ka.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ga.test(b))b=La;if(!d&&e&&e[b])f=e[b];else if(ob){if(ga.test(b))b="float";b=b.replace(ib,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ha,ia);f=a.currentStyle[b]||a.currentStyle[d];if(!jb.test(f)&&kb.test(f)){b=e.left;var i=a.runtimeStyle.left;a.runtimeStyle.left=
a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=i}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var pb=
J(),qb=/<script(.|\s)*?\/script>/gi,rb=/select|textarea/i,sb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ja=/\?/,tb=/(\?|&)_=.*?(&|$)/,ub=/^(\w+:)?\/\/([^\/?#]+)/,vb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=
c.param(b,c.ajaxSettings.traditional);f="POST"}var i=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(j,n){if(n==="success"||n==="notmodified")i.html(e?c("<div />").append(j.responseText.replace(qb,"")).find(e):j.responseText);d&&i.each(d,[j.responseText,n,j])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&
(this.checked||rb.test(this.nodeName)||sb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,
b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:z.XMLHttpRequest&&(z.location.protocol!=="file:"||!z.ActiveXObject)?function(){return new z.XMLHttpRequest}:
function(){try{return new z.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&e.success.call(o,n,j,w);e.global&&f("ajaxSuccess",[w,e])}function d(){e.complete&&e.complete.call(o,w,j);e.global&&f("ajaxComplete",[w,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}
function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),i,j,n,o=a&&a.context||e,m=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(m==="GET")N.test(e.url)||(e.url+=(ja.test(e.url)?"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||
N.test(e.url))){i=e.jsonpCallback||"jsonp"+pb++;if(e.data)e.data=(e.data+"").replace(N,"="+i+"$1");e.url=e.url.replace(N,"="+i+"$1");e.dataType="script";z[i]=z[i]||function(q){n=q;b();d();z[i]=v;try{delete z[i]}catch(p){}A&&A.removeChild(B)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&m==="GET"){var s=J(),x=e.url.replace(tb,"$1_="+s+"$2");e.url=x+(x===e.url?(ja.test(e.url)?"&":"?")+"_="+s:"")}if(e.data&&m==="GET")e.url+=(ja.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&
c.event.trigger("ajaxStart");s=(s=ub.exec(e.url))&&(s[1]&&s[1]!==location.protocol||s[2]!==location.host);if(e.dataType==="script"&&m==="GET"&&s){var A=r.getElementsByTagName("head")[0]||r.documentElement,B=r.createElement("script");B.src=e.url;if(e.scriptCharset)B.charset=e.scriptCharset;if(!i){var C=false;B.onload=B.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;b();d();B.onload=B.onreadystatechange=null;A&&B.parentNode&&
A.removeChild(B)}}}A.insertBefore(B,A.firstChild);return v}var E=false,w=e.xhr();if(w){e.username?w.open(m,e.url,e.async,e.username,e.password):w.open(m,e.url,e.async);try{if(e.data||a&&a.contentType)w.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&w.setRequestHeader("If-None-Match",c.etag[e.url])}s||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",
e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(fa){}if(e.beforeSend&&e.beforeSend.call(o,w,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");w.abort();return false}e.global&&f("ajaxSend",[w,e]);var g=w.onreadystatechange=function(q){if(!w||w.readyState===0||q==="abort"){E||d();E=true;if(w)w.onreadystatechange=c.noop}else if(!E&&w&&(w.readyState===4||q==="timeout")){E=true;w.onreadystatechange=c.noop;j=q==="timeout"?"timeout":!c.httpSuccess(w)?
"error":e.ifModified&&c.httpNotModified(w,e.url)?"notmodified":"success";var p;if(j==="success")try{n=c.httpData(w,e.dataType,e)}catch(u){j="parsererror";p=u}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,w,j,p);d();q==="timeout"&&w.abort();if(e.async)w=null}};try{var h=w.abort;w.abort=function(){w&&h.call(w);g("abort")}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){w&&!E&&g("timeout")},e.timeout);try{w.send(m==="POST"||m==="PUT"||m==="DELETE"?e.data:null)}catch(l){c.handleError(e,
w,null,l);d()}e.async||g();return w}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=
f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(j,n){if(c.isArray(n))c.each(n,
function(o,m){b?f(j,m):d(j+"["+(typeof m==="object"||c.isArray(m)?o:"")+"]",m)});else!b&&n!=null&&typeof n==="object"?c.each(n,function(o,m){d(j+"["+o+"]",m)}):f(j,n)}function f(j,n){n=c.isFunction(n)?n():n;e[e.length]=encodeURIComponent(j)+"="+encodeURIComponent(n)}var e=[];if(b===v)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var i in a)d(i,a[i]);return e.join("&").replace(vb,"+")}});var ka={},wb=/toggle|show|hide/,xb=/^([+-]=)?([\d+-.]+)(.*)$/,
W,ta=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(ka[d])f=ka[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();
ka[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&
c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,n=this.nodeType===1&&c(this).is(":hidden"),
o=this;for(j in a){var m=j.replace(ha,ia);if(j!==m){a[m]=a[j];delete a[j];j=m}if(a[j]==="hide"&&n||a[j]==="show"&&!n)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(s,x){var A=new c.fx(o,i,s);if(wb.test(x))A[x==="toggle"?n?"show":"hide":x](a);
else{var B=xb.exec(x),C=A.cur(true)||0;if(B){x=parseFloat(B[2]);var E=B[3]||"px";if(E!=="px"){o.style[s]=(x||1)+E;C=(x||1)/A.cur(true)*C;o.style[s]=C+E}if(B[1])x=(B[1]==="-="?-1:1)*x+C;A.custom(C,x,E)}else A.custom(C,x,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",
1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration==="number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,
b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==
null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(i){return e.step(i)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===
"width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=
this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=
c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=
null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in r.documentElement?function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),
f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=
b,e=b.ownerDocument,i,j=e.documentElement,n=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var o=b.offsetTop,m=b.offsetLeft;(b=b.parentNode)&&b!==n&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;o-=b.scrollTop;m-=b.scrollLeft;if(b===d){o+=b.offsetTop;m+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){o+=parseFloat(i.borderTopWidth)||
0;m+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){o+=parseFloat(i.borderTopWidth)||0;m+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){o+=n.offsetTop;m+=n.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){o+=Math.max(j.scrollTop,n.scrollTop);m+=Math.max(j.scrollLeft,n.scrollLeft)}return{top:o,left:m}};c.offset={initialize:function(){var a=r.body,b=r.createElement("div"),
d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);
d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i;a.removeChild(b);c.offset.initialize=c.noop},
bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left-
e.left+j};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=
this.offsetParent||r.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],i;if(!e)return null;if(f!==v)return this.each(function(){if(i=ua(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=ua(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.document.body[d]:e[d]}});
c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(i){var j=c(this);j[d](f.call(this,i,j[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||
e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===v?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});z.jQuery=z.$=c})(window);

View File

@@ -0,0 +1,30 @@
<?xml version="1.0"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an atrribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an atrribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

View File

@@ -0,0 +1,114 @@
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
</configSections>
<appSettings />
<connectionStrings />
<system.web>
<compilation debug="true">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="None" />
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4"
type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="ScriptModule" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<handlers>
<remove name="WebServiceHandlerFactory-Integrated"/>
<remove name="ScriptHandlerFactory" />
<remove name="ScriptHandlerFactoryAppServices" />
<remove name="ScriptResource" />
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</handlers>
</system.webServer>
<runtime>
<assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -0,0 +1,84 @@
<?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>{F2A07C3D-6858-421E-9A13-8ADF07372397}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ChoiceMSLConnect</RootNamespace>
<AssemblyName>ChoiceMSLConnect</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Target\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Target\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Reference Include="RemObjects.InternetPack, Version=7.0.63.1055, Culture=neutral, PublicKeyToken=3df3cad1b7aa5098, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\RemObjects\Server\RemObjects.InternetPack.dll</HintPath>
</Reference>
<Reference Include="RemObjects.SDK, Version=7.0.63.1055, Culture=neutral, PublicKeyToken=3df3cad1b7aa5098, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\RemObjects\Server\RemObjects.SDK.dll</HintPath>
</Reference>
<Reference Include="RemObjects.SDK.ZLib, Version=7.0.63.1055, Culture=neutral, PublicKeyToken=3df3cad1b7aa5098, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\RemObjects\Server\RemObjects.SDK.ZLib.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Yaulw, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\Sdaleo\Yaulw.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="MSLApi.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RegistrationWrapper.cs" />
<Compile Include="SystemAccessVerifier.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Pluto.MSL.Api\Pluto.MSL.Api.csproj">
<Project>{B794609D-A93E-41E3-9291-84FC73412347}</Project>
<Name>Pluto.MSL.Api</Name>
</ProjectReference>
<ProjectReference Include="..\RegistrationAPI\RegistrationAPI.csproj">
<Project>{D8974253-F538-4AA6-B567-48B7CD574888}</Project>
<Name>RegistrationAPI</Name>
</ProjectReference>
</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,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ShowAllFiles</ProjectView>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pluto.Api;
namespace ChoiceMSLConnect
{
/// <summary>
/// MSL API for Choice
/// </summary>
public static class MSLApi
{
/// <summary>
/// Is it a valid UserApiKey? Only if there is a Pin, it is valid.
/// </summary>
/// <param name="UserApiKey"></param>
/// <returns>true if it is valid, false otherwise</returns>
public static bool IsValidUserApiKey(string UserApiKey)
{
if (!String.IsNullOrEmpty(UserApiKey))
{
string Pin = RegistrationWrapper.RetrievePinForUserApiKey(UserApiKey);
return !String.IsNullOrEmpty(Pin);
}
return false;
}
/// <summary>
/// PostBilling to MSL Client
/// </summary>
/// <param name="UserApiKey"></param>
/// <param name="billingPost"></param>
/// <exception cref="Invalid BillingPost"></exception>
/// <exception cref="Invalid ApiKey"></exception>
/// <exception cref="Client Unreachable"></exception>
public static bool PostBilling(string UserApiKey, bool bCheckClientConnectivityPriorCall, BillingPost1 billingPost)
{
if(billingPost == null)
throw new Exception("Invalid BillingPost");
bool bIsValidUserKey = IsValidUserApiKey(UserApiKey);
if(!bIsValidUserKey)
throw new Exception("Invalid ApiKey");
string ip;
int port;
if (RegistrationWrapper.GetApiMobile(UserApiKey, bCheckClientConnectivityPriorCall, out ip, out port))
{
Pluto.MSL.Api.API.SetNetworkSettings(ip, (uint)port);
SystemAccessVerifier verifier = new SystemAccessVerifier(UserApiKey);
bool bSuccess = Pluto.MSL.Api.API.PostBilling(verifier.SystemApiKey, billingPost);
return bSuccess;
}
else
{
throw new Exception("Client Unreachable");
}
}
}
}

View File

@@ -0,0 +1,36 @@
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("ChoiceMSLConnect")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ChoiceMSLConnect")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[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("9758d003-f979-4466-b644-ea8eedae5d2a")]
// 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:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,201 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pluto.Api;
using System.Net;
using Pluto.Registration;
namespace ChoiceMSLConnect
{
internal static class RegistrationWrapper
{
// Allow the Registration wrapper to let the Service enter into a different 'disconnected' state
internal static int HasConnectivityErrorCountInARow = 0;
internal static int HasConnectivityErrorCountMaxBeforeStateChange = 10;
internal static string RegistrationHOST = "";
internal static uint RegistrationPORT = 0;
private const string DEFAULT_REGISTRATION_HOST_N_PORT_URL = "http://ppsmobile.mckesson.com/mobile1/REGURL.htm";
private const string DEFAULT_REGISTRATION_HOST_URL = "ppsmobile.mckesson.com";
private const int DEFAULT_REGISTRATION_CHANNEL_PORT = 443;
#region Connectivity
/// <summary>
/// Check to make sure we can communicate with the Registration Service.
/// Check the Server's ip & port for connectivity as well as that this
/// computer has connectivity.
/// This way we won't throw any connectivity errors, which is good.
/// </summary>
/// <returns>true, if successfully can connect, false otherwise</returns>
private static bool HasConnectivity()
{
try
{
bool bCanConnect = false;
bool bUseConfiguration = true;
// Try the overwritten Registration Host and Port first, if exists
if (RegistrationHOST != "" && RegistrationPORT > 0)
{
bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(RegistrationHOST, RegistrationPORT, 0);
if (bCanConnect)
bUseConfiguration = false;
}
// Else, fall-back on the configuration, if we couldn't connect
if (!bCanConnect)
{
bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(DEFAULT_REGISTRATION_HOST_URL, (uint)DEFAULT_REGISTRATION_CHANNEL_PORT, 0);
if (bCanConnect)
bUseConfiguration = true;
}
if (bCanConnect)
{
if (bUseConfiguration)
{
IPAddress ip = Yaulw.Net.IPHostHelper.GetIpForHost(DEFAULT_REGISTRATION_HOST_URL);
RegistrationAPI.API.SetNetworkSettings(ip.ToString(), (uint)DEFAULT_REGISTRATION_CHANNEL_PORT);
}
else
{
IPAddress ip = Yaulw.Net.IPHostHelper.GetIpForHost(RegistrationHOST);
RegistrationAPI.API.SetNetworkSettings(ip.ToString(), RegistrationPORT);
}
HasConnectivityErrorCountInARow = 0;
}
else
{
// Try to retrieve the latest Host and Port Setting online
try
{
string HostNPortSetOnline = Yaulw.Net.WCHelper.ScreenScrapeFromURL(DEFAULT_REGISTRATION_HOST_N_PORT_URL);
if (!String.IsNullOrEmpty(HostNPortSetOnline))
{
RegistrationHOST = HostNPortSetOnline.Split(';')[0];
RegistrationPORT = uint.Parse(HostNPortSetOnline.Split(';')[1]);
}
}
catch (Exception)
{
/* ignore */
}
// Try to connection one more time
if (RegistrationHOST != "" && RegistrationPORT > 0)
bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(RegistrationHOST, RegistrationPORT, 0);
// if we can connect, we are Golden
if (bCanConnect)
{
IPAddress ip = Yaulw.Net.IPHostHelper.GetIpForHost(RegistrationHOST);
RegistrationAPI.API.SetNetworkSettings(ip.ToString(), RegistrationPORT);
HasConnectivityErrorCountInARow = 0;
}
else
{
// Connectivity Errors too plentiful - Change the state of the service to reflect that
if (HasConnectivityErrorCountInARow >= HasConnectivityErrorCountMaxBeforeStateChange)
{
//PlutoService.state = HostGUIDstate.no_connectivity;
}
else
{
HasConnectivityErrorCountInARow++;
}
}
}
return bCanConnect;
}
catch (Exception)
{
}
return false;
}
#endregion
#region Register Methods
/// <summary>
/// Retrieve Pin for UserApiKey
/// </summary>
/// <param name="UserApiKey"></param>
/// <returns></returns>
public static string RetrievePinForUserApiKey(string UserApiKey)
{
try
{
if (!String.IsNullOrEmpty(UserApiKey) && HasConnectivity())
{
string Pin = RegistrationAPI.API.RetrieveUserApiKeyPin(UserApiKey);
return Pin;
}
}
catch (Exception)
{
/* ignore */
}
return String.Empty;
}
/// <summary>
/// Get Api Mobile IP/Port and * optionally * check Connectivity
/// </summary>
/// <returns>true if can connect (only bCheckConnectivity is true), else true if it can get IP/port, false otherwise</returns>
public static bool GetApiMobile(string UserApiKey, bool bCheckConnectivity, out string ip, out int port)
{
ip = String.Empty;
port = 0;
try
{
if (!String.IsNullOrEmpty(UserApiKey) && HasConnectivity())
{
SystemAccessVerifier verifier = new SystemAccessVerifier(UserApiKey);
Host host = RegistrationAPI.API.GetApiMobile(verifier.SystemApiKey);
ip = host.host;
port = host.port;
if (bCheckConnectivity)
return RegistrationAPI.API.IsApiMobileReachable(verifier.SystemApiKey);
else
return true;
}
}
catch (Exception)
{
/* ignore */
}
return false;
}
/// <summary>
/// Get Api Mobile IP/Port
/// </summary>
/// <returns></returns>
public static bool GetApiMobileSystem(string SystemApiKey, out string ip, out int port)
{
ip = String.Empty;
port = 0;
try
{
if (!String.IsNullOrEmpty(SystemApiKey) && HasConnectivity())
{
Host host = RegistrationAPI.API.GetApiMobile(SystemApiKey);
ip = host.host;
port = host.port;
return RegistrationAPI.API.IsApiMobileReachable(SystemApiKey);
}
}
catch (Exception)
{
/* ignore */
}
return false;
}
#endregion
}
}

View File

@@ -0,0 +1,280 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ChoiceMSLConnect
{
/// <summary>
/// This class is copied (Stripped down to it's core, with all unneccessary stuff for this instance removed)
/// from Registration Server's SystemAccessVerifier.
/// All new code should go there. No Pin is generated here. The pin for a userkey
/// should always be generated at the registration server.
/// This class however can be used to convert a SystemApiKey to a UserApiKey, usefull for what we are
/// trying to do in this service
/// </summary>
internal class SystemAccessVerifier
{
#region Consts
const int SYSTEM_API_KEY_LENGTH = 22;
const int USER_API_KEY_LENGTH = 20;
const int PIN_LENGTH = 6;
const string SYSTEM_API_KEY_BEGIN_MARKER = "$";
const string SYSTEM_API_KEY_END_MARKER = "#";
internal static readonly string LETTER_CHARS = "AZXVGLTCIRKPNOMQJSHUFWDEYB";
internal static int GET_LETTER_CHARS_COUNT { get { return LETTER_CHARS.Length; } }
#endregion
#region System Api Key
private string _systemApiKey = String.Empty;
internal string SystemApiKey
{
get
{
return _systemApiKey;
}
set
{
if (ValidateSystemKey(value))
_systemApiKey = value.ToUpper().Trim();
}
}
private static bool ValidateSystemKey(string key)
{
if (!String.IsNullOrEmpty(key))
key = key.ToUpper().Trim();
// $247B2CB4A437EB74C62#M
if (!String.IsNullOrEmpty(key) && key.Length == SYSTEM_API_KEY_LENGTH &&
key[0] == Char.Parse(SYSTEM_API_KEY_BEGIN_MARKER) && key[SYSTEM_API_KEY_LENGTH - 2] == Char.Parse(SYSTEM_API_KEY_END_MARKER) &&
Char.IsLetter(key[SYSTEM_API_KEY_LENGTH - 1]))
{
// AllAreLettersOrDigit?
for (int i = 1; i < SYSTEM_API_KEY_LENGTH - 2; ++i)
{
if (!Char.IsLetterOrDigit(key[i]))
return false;
}
return true;
}
return false;
}
#endregion
#region User Api Key
private string _UserApiKey = String.Empty;
internal string UserApiKey
{
get
{
return _UserApiKey;
}
set
{
if (ValidateUserKey(value))
_UserApiKey = value.ToUpper().Trim();
}
}
private static bool ValidateUserKey(string key)
{
if (!String.IsNullOrEmpty(key))
key = key.ToUpper().Trim();
//247BQCB4A-37EB-4C62M
if (!String.IsNullOrEmpty(key) && key.Length == USER_API_KEY_LENGTH &&
Char.IsLetter(key[USER_API_KEY_LENGTH - 1]) &&
Char.IsLetter(key[4]) && key[9] == '-' && key[14] == '-')
{
// Perform Product Security check
char productType = key[USER_API_KEY_LENGTH - 1];
int v = (int)productType % GET_LETTER_CHARS_COUNT;
if (key[4] == LETTER_CHARS[v])
return true;
}
return false;
}
#endregion
#region Product Type
private char _productType = '\0';
internal char ProductType { get { return Char.ToUpper(_productType); } }
internal bool IsValidProductType { get { return (_productType != '\0'); } }
#endregion
#region Construction
internal SystemAccessVerifier(string userApiKey)
{
if (!String.IsNullOrEmpty(userApiKey))
userApiKey = userApiKey.ToUpper().Trim();
if (ValidateUserKey(userApiKey))
{
UserApiKey = userApiKey;
ConvertUserToSystemApiKey();
_productType = GetProductTypeFromSystemApiKey(SystemApiKey);
}
}
#endregion
#region Private Converters
private void ConvertUserToSystemApiKey()
{
if (ValidateUserKey(UserApiKey))
{
// 247BQCB4A-37EB-4C62M
StringBuilder sb = new StringBuilder(UserApiKey);
char productType = sb[USER_API_KEY_LENGTH - 1];
sb.Remove(USER_API_KEY_LENGTH - 1, 1);
// Add More Randomness into this (nobody will ever know :S)
// Dynamic Calc for 2 - 2, 12 - 4
int a = (int)'A';
int z = (int)'Z';
int ic = (int)sb[2];
if ((ic - 2 >= a) && (ic <= z))
sb[2] = (char)(ic - 2);
ic = sb[12];
if ((ic - 4 >= a) && (ic <= z))
sb[12] = (char)(ic - 4);
//Otherway arround arbitrary swap (just in case)
// Swap 3 to 10, and 5 to 16
char c = sb[3];
sb[3] = sb[10];
sb[10] = c;
c = sb[5];
sb[5] = sb[16];
sb[16] = c;
// Assign '-'
sb[4] = '-';
// How clever :S
string s = ReverseString(sb.ToString());
int n = 0;
sb = new StringBuilder(s);
for (int i = 0; i < s.Length; ++i)
{
if (s[i] == '-')
{
sb[i] = (s[n]);
n++;
}
else
{
sb[i] = (s[i]);
}
}
// $247B2CB4A437EB74C62#M
s = SYSTEM_API_KEY_BEGIN_MARKER + sb.ToString() + SYSTEM_API_KEY_END_MARKER + Char.ToUpper(productType);
SystemApiKey = s;
}
}
#endregion
#region Internal Statics
internal static char GetProductTypeFromSystemApiKey(string systemApiKey)
{
if (ValidateSystemKey(systemApiKey))
return Char.ToUpper(systemApiKey[SYSTEM_API_KEY_LENGTH - 1]);
else
return '\0';
}
#endregion
#region Private static Key Generation Helper Functions
private static string ReverseString(string str)
{
if (!String.IsNullOrEmpty(str))
{
Stack<char> stack = new Stack<char>();
foreach (char c in str)
stack.Push(c);
StringBuilder sb = new StringBuilder();
while (stack.Count > 0)
sb.Append(stack.Pop());
return sb.ToString();
}
return String.Empty;
}
/// <summary>
/// Perform checksum on string
/// </summary>
/// <param name="strAboutToBeChecksummed"></param>
/// <returns>Checksum</returns>
private static int PerformChecksum(string strAboutToBeChecksummed)
{
if (!String.IsNullOrEmpty(strAboutToBeChecksummed))
{
int nChecksum = 0;
for (int i = 0; i < strAboutToBeChecksummed.Length; ++i)
{
if (Char.IsDigit(strAboutToBeChecksummed[i]))
nChecksum = nChecksum + int.Parse(strAboutToBeChecksummed[i].ToString());
}
return nChecksum;
}
return 0;
}
/// <summary>
/// Dash a String every Nth Character
/// </summary>
/// <returns>a dashed string</returns>
private static string MakeIntoDashSeperatedString(string strAboutToBeDashed, int DashEveryNthCharacter)
{
if (!String.IsNullOrEmpty(strAboutToBeDashed))
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strAboutToBeDashed.Length; i++)
{
if ((i != 0) && ((i % DashEveryNthCharacter) == 0))
sb.Append("-");
sb.Append(strAboutToBeDashed[i]);
}
return sb.ToString();
}
return String.Empty;
}
/// <summary>
/// Undash a String
/// </summary>
/// <returns>a string without dashes</returns>
private static string MakeIntoDashUnseperatedString(string strAboutToBeUndashed)
{
if (!String.IsNullOrEmpty(strAboutToBeUndashed))
return strAboutToBeUndashed.Replace("-", "");
return String.Empty;
}
/// <summary>
/// Check if the passed in string contains only digits
/// </summary>
/// <param name="strToCheckForDigits">string to check for digits for</param>
/// <returns>true, if all digits are numbers</returns>
private static bool ContainsOnlyDigits(string strToCheckForDigits)
{
if (!String.IsNullOrEmpty(strToCheckForDigits))
{
for (int i = 0; i < strToCheckForDigits.Length; ++i)
{
if (!Char.IsDigit(strToCheckForDigits[i]))
return false;
}
return true;
}
return false;
}
#endregion
}
}

View File

@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CrossProduct.Core
{
/// <summary>
/// the binary encoder class
/// </summary>
public class BinaryEncoder
{
/// <summary>
/// Binaries to string.
/// </summary>
/// <param name="BinaryConvert">The binary convert.</param>
/// <returns></returns>
public static string BinaryToString(byte[] BinaryConvert)
{
return BinaryToString(BinaryConvert, BinaryConvert.Length);
}
/// <summary>
/// Binaries to string.
/// </summary>
/// <param name="BinaryConvert">The binary convert.</param>
/// <param name="lConvertLength">Length of the l convert.</param>
/// <returns></returns>
public static string BinaryToString(byte[] BinaryConvert, int lConvertLength)
{
if (BinaryConvert == null)
return "";
int nIndex;
StringBuilder buildString = new StringBuilder(lConvertLength * 2);
for (nIndex = 0; nIndex < lConvertLength; nIndex++)
{
buildString.AppendFormat("{0:X2}", BinaryConvert[nIndex]);
}
return buildString.ToString();
}
/// <summary>
/// Strings to binary.
/// </summary>
/// <param name="BinaryConvert">The binary convert.</param>
/// <param name="bAssumeString">if set to <c>true</c> [b assume string].</param>
/// <returns></returns>
public static byte[] StringToBinary(string BinaryConvert, bool bAssumeString)
{
if (BinaryConvert == null || BinaryConvert == "")
return new byte[0];
int nLength = BinaryConvert.Length / 2;
if (bAssumeString)
{
if (BinaryConvert.Substring(BinaryConvert.Length - 2, 2) == "00")
nLength--;
}
int nIndex;
int nPos;
byte[] ReturnArray = new byte[nLength];
for (nPos = 0, nIndex = 0; nPos < nLength; nIndex += 2, nPos++)
{
ReturnArray[nPos] = byte.Parse(BinaryConvert.Substring(nIndex, 2), System.Globalization.NumberStyles.HexNumber);
}
return ReturnArray;
}
/// <summary>
/// Strings to binary.
/// </summary>
/// <param name="BinaryConvert">The binary convert.</param>
/// <returns></returns>
public static byte[] StringToBinary(string BinaryConvert)
{
return StringToBinary(BinaryConvert, true);
}
}
}

View File

@@ -0,0 +1,58 @@
<?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>{D6CC42F0-0F08-457F-84D1-44D0D25715F6}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CrossProduct.Core</RootNamespace>
<AssemblyName>CrossProduct.Core</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Target\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Target\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="BinaryEncoder.cs" />
<Compile Include="DataEncryption.cs" />
<Compile Include="Encryption.cs" />
<Compile Include="PerSeCryptography.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SimpleStringBinaryConverter.cs" />
<Compile Include="Utilities.cs" />
</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,167 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CrossProduct.Core
{
public class DataEncryption
{
#region Encrypt
#region Encrypt String
public static string EncryptString(string EncryptString)
{
return DataEncryption.EncryptBinary(SimpleStringBinaryConverter.GetBytes(EncryptString));
}
#endregion
#region Encrypt Binary
public static string EncryptBinary(byte[] EncryptBuffer)
{
int lStringLen = EncryptBuffer.Length;
int lAdjust = 17;
int nIndex;
int lMid;
int lTemp;
byte cTemp;
byte cXor;
lTemp = lStringLen;
cXor = (byte)(0x59 ^ (byte)lStringLen);
lMid = lStringLen;
lMid -= lMid % 2;
lMid = lMid / 2;
lTemp = lMid;
// "scramble" the original before encrypting
// inverse the left half
for (nIndex = lTemp - 1; nIndex >= 0 && nIndex >= lTemp - nIndex - 1; nIndex--)
{
cTemp = EncryptBuffer[nIndex];
EncryptBuffer[nIndex] = EncryptBuffer[lTemp - nIndex - 1];
EncryptBuffer[lTemp - nIndex - 1] = cTemp;
}
// inverse the left half
for (nIndex = lTemp - 1; nIndex >= 0 && nIndex >= lTemp - nIndex - 1; nIndex--)
{
cTemp = EncryptBuffer[lStringLen - lTemp + nIndex];
EncryptBuffer[lStringLen - lTemp + nIndex] = EncryptBuffer[lStringLen - nIndex - 1];
EncryptBuffer[lStringLen - nIndex - 1] = cTemp;
}
// encrypt individual values from the center out
// i.e. Center, Center + 1, Center - 1, Center + 2, Center - 2, etc...
for (nIndex = 1; ; nIndex++)
{
if (nIndex % 2 != 0)
{
lTemp = lMid + (nIndex - 1) / 2;
if (lTemp >= lStringLen)
continue;
}
else
{
lTemp = lMid - nIndex / 2;
if (lTemp < 0)
break;
}
cTemp = EncryptBuffer[lTemp];
EncryptBuffer[lTemp] = (byte)(EncryptBuffer[lTemp] ^ cXor);
if (EncryptBuffer[lTemp] == 0)
EncryptBuffer[lTemp] = (byte)(EncryptBuffer[lTemp] ^ cXor);
lAdjust += 17 + cXor;
lTemp = lAdjust + cXor + cTemp + EncryptBuffer[lTemp];
cXor = (byte)((byte)lTemp % 223);
}
return BinaryEncoder.BinaryToString(EncryptBuffer);
}
#endregion
#endregion
#region Decrypt
#region Decrypt String
public static string DecryptString(string EncryptString)
{
byte[] EncryptBuffer = DataEncryption.DecryptBinary(EncryptString);
return SimpleStringBinaryConverter.GetString(EncryptBuffer);
}
#endregion
#region Decrypt Binary
public static byte[] DecryptBinary(string EncryptString)
{
byte[] EncryptBuffer = BinaryEncoder.StringToBinary(EncryptString);
return DecryptBinary(EncryptBuffer);
}
public static byte[] DecryptBinary(byte[] EncryptBuffer)
{
int lStringLen = EncryptBuffer.Length;
int lAdjust = 17;
int nIndex;
int lMid;
int lTemp;
byte cTemp;
byte cXor;
lTemp = lStringLen;
cXor = (byte)(0x59 ^ (byte)lStringLen);
lMid = lStringLen;
lMid -= lMid % 2;
lMid = lMid / 2;
for (nIndex = 1; ; nIndex++)
{
if (nIndex % 2 != 0)
{
lTemp = lMid + (nIndex - 1) / 2;
if (lTemp >= lStringLen)
continue;
}
else
{
lTemp = lMid - nIndex / 2;
if (lTemp < 0)
break;
}
cTemp = EncryptBuffer[lTemp];
EncryptBuffer[lTemp] = (byte)(EncryptBuffer[lTemp] ^ cXor);
if (EncryptBuffer[lTemp] == 0)
EncryptBuffer[lTemp] = (byte)(EncryptBuffer[lTemp] ^ cXor);
lAdjust += 17 + cXor;
lTemp = lAdjust + cXor + cTemp + EncryptBuffer[lTemp];
cXor = (byte)((byte)lTemp % 223);
}
lTemp = lMid;
for (nIndex = lTemp - 1; nIndex >= 0 && nIndex >= lTemp - nIndex - 1; nIndex--)
{
cTemp = EncryptBuffer[nIndex];
EncryptBuffer[nIndex] = EncryptBuffer[lTemp - nIndex - 1];
EncryptBuffer[lTemp - nIndex - 1] = cTemp;
}
for (nIndex = lTemp - 1; nIndex >= 0 && nIndex >= lTemp - nIndex - 1; nIndex--)
{
cTemp = EncryptBuffer[lStringLen - lTemp + nIndex];
EncryptBuffer[lStringLen - lTemp + nIndex] = EncryptBuffer[lStringLen - nIndex - 1];
EncryptBuffer[lStringLen - nIndex - 1] = cTemp;
}
return EncryptBuffer;
}
#endregion
#endregion
}
}

View File

@@ -0,0 +1,60 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CrossProduct.Core
{
/// <summary>
/// Wrapper functions around our CrossProducts Encrypt Functionallity
/// </summary>
public static class Encryption
{
/// <summary>
/// Encrypt Text
/// </summary>
/// <param name="Text">Text To Encrypt</param>
/// <returns>Encrypted Text or String.Empty if Error Occured</returns>
public static string EncryptText(string Text)
{
try
{
PerSeCryptography crypto = new PerSeCryptography();
string EncryptedText = crypto.EncryptText(Text);
return EncryptedText;
}
catch (Exception) { /* ignore */ }
return string.Empty;
}
/// <summary>
/// Encrypt Text for use as a Command-Line Parameter - avoids "
/// </summary>
/// <param name="Text">Text To Encrypt</param>
public static string EncryptTextParameter(string Text)
{
string EncryptedText;
// Keep calling Encrypt Text until it productes a string without a double quote
do { EncryptedText = EncryptText(Text); } while (EncryptedText.IndexOf('\"') != -1);
return EncryptedText;
}
/// <summary>
/// Decrypt Text
/// </summary>
/// <param name="Text">Text To Decrypt</param>
/// <returns>Decrypted Text or String.Empty if Error Occured</returns>
public static string DecryptText(string Text)
{
try
{
PerSeCryptography crypto = new PerSeCryptography();
string EncryptedText = crypto.DecryptText(Text);
return EncryptedText;
}
catch (Exception) { /* ignore */ }
return string.Empty;
}
}
}

View File

@@ -0,0 +1,875 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.IO;
//using System.Windows.Forms;
using System.Collections.ObjectModel;
namespace CrossProduct.Core
{
/// <summary>
/// Text Encryption Types that are Supported by the PerSeCryptography class.
/// </summary>
internal enum PerSeTextEncryptionTypes
{
Code,
Filename,
Text
}
/// <summary>
/// The PerSeCryptography class contains functionality to perform
/// custom PerSe cryptography routines
/// </summary>
public class PerSeCryptography
{
#region Member Variables
private const string KeyEncryptionString = "7:i#t~<Tm*I{cC1-+AygowsP}Zeb,WRp5^k?>QzV_BMF4u3!" +
"XH;/)=(8dhEUnD.OJ6%0@G2&rNfqSv\\ja[LxYK$]l9";
private const string ValidCodeCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private const string ValidFilenameCharacters = "!#$%&'()-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
"^_`{}~ƒ¡¢£¥ª°±²µ·º»¼½¿ÄÅÆÇÉÑÖÜß÷";
private const string ValidTextCharacters = "!#$%&()-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
"^_`{}~ƒ¡¢£¥ª°±²µ·º»¼½¿ÄÅÆÇÉÑÖÜß÷ ;:\",.*/\\<>?|+=";
private const int KeyStringLength = 5;
private const int MaxExtraEncryptionCharacters = 7;
private const int SplitKeyIndex = 4;
private const int InvalidStringCharacters = 50;
private const int EncryptionKeyBitMask = 15;
private const int EncryptionKeyShift = 4;
private const int EncryptionKeyMaxUnchangedCount = 10;
private const int EncryptionKeySkipKeys = 5;
private const int EncryptionKeySeed = 32767;
private const int RandomNumberBitMask = 65535;
private const int RandomNumberMultiplier = 17405;
private const int RandomNumberExtraValue = 196;
private const float RandomNumberDivisor = 65536.0f;
private int _currentRandomNumber;
private Random _randomNumGen;
#endregion
/// <summary>
/// Initializes a new instance of the <see cref="PerSeCryptography"/> class.
/// </summary>
/// Change Made On: 6/23/2009
/// Change Made By: Shane.Calhoun
/// ==============================================
public PerSeCryptography()
{
_randomNumGen = new Random();
_currentRandomNumber = _randomNumGen.Next() & RandomNumberBitMask;
}
/// <summary>
/// Decrypts a String with an Embedded Key
/// </summary>
/// <param name="encryptedText">encrypted text string to decrypt</param>
/// <returns>the decrypted text string</returns>
public string DecryptText(string encryptedText)
{
return Decrypt(encryptedText, PerSeTextEncryptionTypes.Text);
}
/// <summary>
/// Decrypts a Text string using a key
/// </summary>
/// <param name="encryptedText">text string to decrypt</param>
/// <param name="key">key to use to decrypt the string</param>
/// <returns>decrypted text</returns>
public string DecryptText(string encryptedText, int key)
{
return Decrypt(encryptedText, key, PerSeTextEncryptionTypes.Text);
}
/// <summary>
/// Encrypts a String to Binary
/// </summary>
/// <param name="decryptedText">text to encrypt</param>
/// <returns>encrypted text</returns>
public string EncryptBinaryString(string decryptedText)
{
try
{
return DataEncryption.EncryptString(decryptedText);
}
catch (Exception ex)
{
throw new Exception("Error Encrypting binary String", ex);
}
}
/// <summary>
/// Decrypts a text string from binary to text
/// </summary>
/// <param name="encryptedText">The encrypted text.</param>
/// <returns>decrypted text</returns>
public string DecryptBinaryString(string encryptedText)
{
try
{
return DataEncryption.DecryptString(encryptedText);
}
catch (Exception ex)
{
throw new Exception("Error Decrypting Binary String", ex);
}
}
/// <summary>
/// Encrypts a Text string using a key and industry standard encryption modes - Rijndael will be default which is the same as AES 256 bit encryption.
/// </summary>
/// <param name="text">text string to encrypt</param>
/// <param name="key">key to use to encrypt the string</param>
/// <param name="encryptionMode">Mode of encryption of choice - "DES" or "RC2" or "Rijndael" or "TripleDES" - Default will be "Rijndael"</param>
/// <returns>the text encrypted</returns>
public string EncryptText(string text, string key, string encryptionMode)
{
byte[] encryptedData = Encrypt(text, key, encryptionMode);
return Convert.ToBase64String(encryptedData);
}
/// <summary>
/// Decrypts a Text string using a key and industry standard encryption modes - Rijndael will be default which is the same as AES 256 bit encryption.
/// </summary>
/// <param name="text">text string to decrypt</param>
/// <param name="key">key to use to decrypt the string</param>
/// <param name="encryptionMode">Mode of encryption of choice - "DES" or "RC2" or "Rijndael" or "TripleDES" - Default will be "Rijndael"</param>
/// <returns>decrypted text</returns>
public string DecryptText(string text, string key, string encryptionMode)
{
string decryptedData = string.Empty;
decryptedData = Decrypt(Convert.FromBase64String(text), key, encryptionMode);
return decryptedData;
}
/// <summary>
/// Encrypts Key Text
/// </summary>
/// <param name="text">key text</param>
/// <param name="key">key to use when encrypting the key</param>
/// <returns></returns>
public string EncryptText(string text, int key)
{
return Encrypt(text, key, PerSeTextEncryptionTypes.Text);
}
/// <summary>
/// Encrypts text
/// </summary>
/// <param name="text">Text to encrypt</param>
/// <returns>the text encrypted</returns>
public string EncryptText(string text)
{
string strEncryptValue;
strEncryptValue = Encrypt(text, PerSeTextEncryptionTypes.Text);
return strEncryptValue;
//return Encrypt( text, PerSeTextEncryptionTypes.Text );
}
/// <summary>
/// Encrypts text
/// </summary>
/// <param name="text">Text to encrypt</param>
/// <returns>the text encrypted</returns>
public string EncryptText(string text, bool EnsureUniqueKey, string assemblyname)
{
string strEncryptValue;
strEncryptValue = Encrypt(text, PerSeTextEncryptionTypes.Text);
if (EnsureUniqueKey && !String.IsNullOrEmpty(assemblyname))
strEncryptValue = SimpleStringBinaryConverter.GetString(strEncryptValue, assemblyname);
return strEncryptValue;
//return Encrypt( text, PerSeTextEncryptionTypes.Text );
}
/// <summary>
/// Encrypts the text.
/// </summary>
/// <param name="text">The text.</param>
/// <returns></returns>
/// Change Made On: 7/15/2010
/// Change Made By: Shane.Calhoun
/// ==============================================
public ReadOnlyCollection<String> EncryptText(ReadOnlyCollection<String> text)
{
List<string> result = new List<string>();
foreach (string value in text)
{
result.Add(Encrypt(value, PerSeTextEncryptionTypes.Text));
}
ReadOnlyCollection<string> temp = new ReadOnlyCollection<string>(result);
return temp;
}
/// <summary>
/// Decrypts a Text string using an Embedded key
/// </summary>
/// <param name="encryptedText">encrypted text to decrypt</param>
/// <param name="encryptionType"></param>
/// <returns>decrypted text string</returns>
private string Decrypt(string encryptedText, PerSeTextEncryptionTypes encryptionType)
{
try
{
StringBuilder decryptedText = new StringBuilder();
int key = GetEmbeddedKey(encryptedText);
int index = 0;
if (key != -1)
{
index = encryptedText.Length - (KeyStringLength - SplitKeyIndex) + 1;
if (index >= (SplitKeyIndex + 1))
{
string encryptedTextWithoutKey = encryptedText.Substring(SplitKeyIndex, (index - SplitKeyIndex - 1));
decryptedText.Append(Decrypt(encryptedTextWithoutKey, key, encryptionType));
}
}
else
{
for (index = 0; index < InvalidStringCharacters; index++)
{
int charIndex = RandomNumber(ValidTextCharacters.Length);
decryptedText.Append(ValidTextCharacters[charIndex]);
}
}
return decryptedText.ToString();
}
catch (Exception ex)
{
throw new Exception("Error Decrypting string", ex);
}
}
/// <summary>
/// Decrypts a text string
/// </summary>
/// <param name="encryptedText">Encrypted Text to decrypt</param>
/// <param name="key">key to use when decrypting the text</param>
/// <param name="encryptionType">the type of text to decrypt</param>
/// <returns>the encrypted string decrypted</returns>
private string Decrypt(string encryptedText, int key, PerSeTextEncryptionTypes encryptionType)
{
try
{
string validCharacters;
string encryptionCodeCharacters;
int extraCharacerOdds;
int extraCharacters;
int realCharacters;
int originalKey;
encryptionCodeCharacters = GenerateEncryptionCode(key, encryptionType);
originalKey = _currentRandomNumber;
_currentRandomNumber = key;
switch (encryptionType)
{
case PerSeTextEncryptionTypes.Code:
{
validCharacters = ValidCodeCharacters;
extraCharacters = 0;
realCharacters = encryptedText.Length;
extraCharacerOdds = 0;
break;
}
case PerSeTextEncryptionTypes.Filename:
{
validCharacters = ValidFilenameCharacters;
extraCharacters = 0;
realCharacters = encryptedText.Length;
extraCharacerOdds = 0;
break;
}
default: // Text
{
validCharacters = ValidTextCharacters;
extraCharacters = RandomNumber(MaxExtraEncryptionCharacters + 1);
realCharacters = encryptedText.Length - extraCharacters;
if (realCharacters > 0)
extraCharacerOdds = (int)Decimal.Truncate((decimal)((50 * extraCharacters) / realCharacters));
else
extraCharacerOdds = 0;
break;
}
}
int index = 0;
int characterPositionIndex;
StringBuilder decryptedText = new StringBuilder();
bool isFilename = (encryptionType == PerSeTextEncryptionTypes.Filename);
while (realCharacters > 0)
{
if (extraCharacters > 0)
{
if (extraCharacerOdds >= (RandomNumber(100) + 1))
{
RandomNumber(0); // Need (unused) call here to keep in synch with encrypt side
index++;
--extraCharacters;
}
}
characterPositionIndex = encryptionCodeCharacters.IndexOf(encryptedText[index]);
if (characterPositionIndex < 0)
{
decryptedText.Append(encryptedText[index]);
}
else
{
characterPositionIndex = characterPositionIndex - RandomNumber(validCharacters.Length) - 1;
while (characterPositionIndex < 0)
{
characterPositionIndex += validCharacters.Length;
}
decryptedText.Append(validCharacters[characterPositionIndex]);
}
// Since all subdirectories of a directory path need to be encrypted/decrypted
// identically, we reset the seed value whenever we start a new subdirectory.
if (isFilename && (encryptedText[index] == '\\'))
{
_currentRandomNumber = key;
}
index++;
realCharacters--;
}
_currentRandomNumber = originalKey;
return decryptedText.ToString();
}
catch (Exception ex)
{
throw new Exception("Error decrypting string", ex);
}
}
/// <summary>
/// Decrypts an encrypted key
/// </summary>
/// <param name="encryptedKey">The encrypted key.</param>
/// <returns>the key in it's original integer form</returns>
private int DecryptKey(string encryptedKey)
{
try
{
int count;
int index;
int maxIndex;
int tempKey;
int decryptedKey;
int value;
maxIndex = KeyEncryptionString.Length;
tempKey = 0;
for (count = 1; count < encryptedKey.Length; count++)
{
index = KeyEncryptionString.IndexOf(encryptedKey[count]);
value = index - KeyEncryptionString.IndexOf(encryptedKey[count - 1]);
if (value < 0)
{
value += maxIndex;
}
if (value == 16)
{
value = 0;
}
tempKey = (tempKey << EncryptionKeyShift) + (value & EncryptionKeyBitMask);
}
decryptedKey = 0;
for (count = 0; count < (16 / 4); count++)
{
decryptedKey = (decryptedKey << EncryptionKeyShift) | (tempKey & EncryptionKeyBitMask);
tempKey = tempKey >> EncryptionKeyShift;
}
return decryptedKey;
}
catch (Exception ex)
{
throw new Exception("Error decrypting key", ex);
}
}
/// <summary>
/// Retrieves the embedded key out of Encrypted Text
/// </summary>
/// <param name="encryptedText">the encrypted text to retrieve the embedded key from</param>
/// <returns>embedded encrypted key</returns>
private int GetEmbeddedKey(string encryptedText)
{
int index;
int decryptedKey;
string encryptedKey;
decryptedKey = -1;
index = encryptedText.Length - (KeyStringLength - SplitKeyIndex) + 1;
if (index >= (SplitKeyIndex + 1))
{
encryptedKey = encryptedText.Substring(0, SplitKeyIndex) +
encryptedText.Substring(index - 1);
decryptedKey = DecryptKey(encryptedKey);
}
return decryptedKey;
}
/// <summary>
/// Generates a valid Encryption Key
/// </summary>
/// <returns>encryption key</returns>
private int GenerateEncryptionKey()
{
string charString;
string codeString;
int key;
int identicalCharacterCount;
bool isKeyValid = false;
do
{
for (int i = 0; i < EncryptionKeySkipKeys; i++)
{
RandomNumber(EncryptionKeySeed);
}
key = _currentRandomNumber;
codeString = GenerateEncryptionCode(key);
charString = ValidTextCharacters;
identicalCharacterCount = 0;
for (int i = 0; i < codeString.Length; i++)
{
if (codeString[i] == charString[i])
{
identicalCharacterCount++;
}
}
isKeyValid = ((identicalCharacterCount < EncryptionKeyMaxUnchangedCount) && (key != -1));
}
while (!isKeyValid);
return key;
}
/// <summary>
/// Encrypts text for the specified encryption type
/// </summary>
/// <param name="decryptedText">text to encrypt</param>
/// <param name="encryptionType">encryption type to perform</param>
/// <returns>the text encrypted</returns>
private string Encrypt(string decryptedText, PerSeTextEncryptionTypes encryptionType)
{
int decryptedKey;
string encryptedKey = string.Empty;
decryptedKey = GenerateEncryptionKey();
encryptedKey = EncryptKey(decryptedKey);
string encryptedText = Encrypt(decryptedText, decryptedKey, encryptionType);
encryptedText = encryptedKey.Substring(0, SplitKeyIndex) + encryptedText + encryptedKey.Substring(SplitKeyIndex, encryptedKey.Length - SplitKeyIndex);
return encryptedText;
}
/// <summary>
/// Encrypts text for the specified encryption type
/// </summary>
/// <param name="decryptedText">text to encrypt</param>
/// <param name="key">key to use for encryption</param>
/// <param name="encryptionType">type of encryption to perform</param>
/// <returns>decrypted text encrypted </returns>
private string Encrypt(string decryptedText, int key, PerSeTextEncryptionTypes encryptionType)
{
try
{
string charString = string.Empty;
string codeString = string.Empty;
int extraCharacterOdds;
int extraCharacters;
int posIndex;
int originalKey;
StringBuilder encryptedText = new StringBuilder();
codeString = GenerateEncryptionCode(key);
originalKey = _currentRandomNumber;
_currentRandomNumber = key;
charString = ValidTextCharacters;
extraCharacters = RandomNumber(MaxExtraEncryptionCharacters + 1);
if (decryptedText.Length > 0)
{
extraCharacterOdds = (50 * extraCharacters) / decryptedText.Length;
}
else
{
extraCharacterOdds = 0;
}
if (decryptedText.Length > 0)
{
for (int i = 0; i < decryptedText.Length; i++)
{
if (extraCharacters > 0)
{
if (extraCharacterOdds >= (RandomNumber(100) + 1))
{
posIndex = RandomNumber(codeString.Length) + 1;
if (posIndex >= codeString.Length)
{
posIndex = codeString.Length - 1;
}
encryptedText.Append(codeString[posIndex]);
extraCharacters--;
}
}
posIndex = charString.IndexOf(decryptedText[i]);
if (posIndex < 0)
{
encryptedText.Append(decryptedText[i]);
}
else
{
posIndex = ((posIndex + RandomNumber(codeString.Length) + 1) % codeString.Length);
encryptedText.Append(codeString[posIndex]);
}
}
}
while (extraCharacters > 0)
{
posIndex = RandomNumber(codeString.Length) + 1;
if (posIndex >= codeString.Length)
{
posIndex = codeString.Length - 1;
}
encryptedText.Append(codeString[posIndex]);
extraCharacters--;
}
_currentRandomNumber = originalKey;
return encryptedText.ToString();
}
catch (Exception ex)
{
throw new Exception("Error Encrypting key", ex);
}
}
/// <summary>
/// Encrypts a Key
/// </summary>
/// <param name="decryptedKey">key to encrypt</param>
/// <returns>encrypted key</returns>
private string EncryptKey(int decryptedKey)
{
int count;
int index;
int maxIndex;
StringBuilder encryptedKey = new StringBuilder();
int value;
maxIndex = KeyEncryptionString.Length;
index = RandomNumber(maxIndex);
encryptedKey.Append(KeyEncryptionString[index]);
for (count = 0; count < (16 / 4); count++)
{
value = decryptedKey & EncryptionKeyBitMask;
if (value == 0)
{
value = 16;
}
decryptedKey >>= EncryptionKeyShift;
index = ((index + value) % maxIndex);
encryptedKey.Append(KeyEncryptionString[index]);
}
return encryptedKey.ToString();
}
/// <summary>
/// Generates a Random number based on the Value, seeds and other custom inhouse
/// values
/// </summary>
/// <param name="seed">random number seed</param>
/// <returns></returns>
private int RandomNumber(int seed)
{
float newValue;
int newRandomNumber;
_currentRandomNumber = ((_currentRandomNumber * RandomNumberMultiplier) + RandomNumberExtraValue) & RandomNumberBitMask;
newValue = _currentRandomNumber / RandomNumberDivisor;
newRandomNumber = (int)Decimal.Truncate((decimal)(seed * newValue));
return newRandomNumber;
}
/// <summary>
/// Generates an Encryption Code String based on the Seed
/// </summary>
/// <param name="seed">seed to build the encryption code string for</param>
/// <returns>encryption code string</returns>
private string GenerateEncryptionCode(int seed)
{
return GenerateEncryptionCode(seed, PerSeTextEncryptionTypes.Text);
}
/// <summary>
/// Generates an Encryption Code String based on the Seed and Encryption Type
/// </summary>
/// <param name="seed">seed to build the encryption code string for</param>
/// <param name="encryptionType">Encryption type to build the encryption code string for</param>
/// <returns>encryption code string</returns>
private string GenerateEncryptionCode(int seed, PerSeTextEncryptionTypes encryptionType)
{
try
{
StringBuilder encryptionCodeString = new StringBuilder();
StringBuilder validEncryptionCharacters = new StringBuilder();
switch (encryptionType)
{
case PerSeTextEncryptionTypes.Code:
validEncryptionCharacters.Append(ValidCodeCharacters);
break;
case PerSeTextEncryptionTypes.Filename:
validEncryptionCharacters.Append(ValidFilenameCharacters);
break;
default: // Text
validEncryptionCharacters.Append(ValidTextCharacters);
break;
}
int index;
int originalKey = _currentRandomNumber;
_currentRandomNumber = seed;
while (validEncryptionCharacters.Length > 0)
{
index = RandomNumber(validEncryptionCharacters.Length);
encryptionCodeString.Append(validEncryptionCharacters[index]);
validEncryptionCharacters.Remove(index, 1);
}
_currentRandomNumber = originalKey;
return encryptionCodeString.ToString();
}
catch (Exception ex)
{
throw new Exception("Error Generating Encryption code", ex);
}
}
/// <summary>
/// Encrypts the specified text.
/// </summary>
/// <param name="text">The text.</param>
/// <param name="key">The key.</param>
/// <param name="encryptionMode">The encryption mode.</param>
/// <returns></returns>
/// Change Made On: 5/6/2009
/// Change Made By: Shane.Calhoun
/// ==============================================
private byte[] Encrypt(string text, string key, string encryptionMode)
{
SymmetricAlgorithm cryptoObj = null;
cryptoObj = GetEncryptionProviderObject(encryptionMode);
byte[] bytIn = Encoding.ASCII.GetBytes(text);
// create a MemoryStream so that the process can be done without I/O files
MemoryStream ms = new MemoryStream();
// set the private key
cryptoObj.Key = GetLegalKey(key, encryptionMode);
cryptoObj.IV = GetLegalVectorSize(key, encryptionMode);
// create an Encryptor from the Provider Service instance
ICryptoTransform encrypto = cryptoObj.CreateEncryptor();
// create Crypto Stream that transforms a stream using the encryption
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
// write out encrypted content into MemoryStream
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
cs.Close();
return ms.ToArray();
}
/// <summary>
/// Decrypts the specified ciphertext.
/// </summary>
/// <param name="ciphertext">The ciphertext.</param>
/// <param name="key">The key.</param>
/// <param name="encryptionMode">The encryption mode.</param>
/// <returns></returns>
/// Change Made On: 5/6/2009
/// Change Made By: Shane.Calhoun
/// ==============================================
private string Decrypt(byte[] ciphertext, string key, string encryptionMode)
{
SymmetricAlgorithm deCryptoObj = null;
deCryptoObj = GetEncryptionProviderObject(encryptionMode);
// create a MemoryStream with the input
MemoryStream ms = new MemoryStream(ciphertext, 0, ciphertext.Length);
// set the private key
deCryptoObj.Key = GetLegalKey(key, encryptionMode);
deCryptoObj.IV = GetLegalVectorSize(key, encryptionMode);
// create a Decryptor from the Provider Service instance
ICryptoTransform encrypto = deCryptoObj.CreateDecryptor();
// create Crypto Stream that transforms a stream using the decryption
CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
// read out the result from the Crypto Stream
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
/// <summary>
/// Gets the encryption provider object.
/// </summary>
/// <param name="encryptionMode">The encryption mode.</param>
/// <returns></returns>
/// Change Made On: 5/6/2009
/// Change Made By: Shane.Calhoun
/// ==============================================
private SymmetricAlgorithm GetEncryptionProviderObject(string encryptionMode)
{
SymmetricAlgorithm tmpCryptoObj = null;
switch (encryptionMode)
{
case "DES":
tmpCryptoObj = new DESCryptoServiceProvider();
break;
case "RC2":
tmpCryptoObj = new RC2CryptoServiceProvider();
break;
case "Rijndael":
tmpCryptoObj = new RijndaelManaged();
break;
case "TripleDES":
tmpCryptoObj = new TripleDESCryptoServiceProvider();
break;
default:
tmpCryptoObj = new RijndaelManaged();
break;
}
return tmpCryptoObj;
}
/// <summary>
/// Gets the legal key.
/// </summary>
/// <param name="Key">The key.</param>
/// <param name="encryptionMode">The encryption mode.</param>
/// <returns></returns>
/// Change Made On: 5/6/2009
/// Change Made By: Shane.Calhoun
/// ==============================================
private byte[] GetLegalKey(string Key, string encryptionMode)
{
string sTemp = Key;
switch (encryptionMode)
{
case "DES":
case "RC2":
if (Key.Length > 8)
{
sTemp = Key.Substring(0, 8);
}
break;
case "TripleDES":
if (Key.Length > 16)
{
sTemp = Key.Substring(0, 16);
}
break;
case "Rijndael":
default:
if (Key.Length > 32)
{
sTemp = Key.Substring(0, 32);
}
break;
}
// convert the secret key to byte array
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
/// <summary>
/// Gets the size of the legal vector.
/// </summary>
/// <param name="Key">The key.</param>
/// <param name="encryptionMode">The encryption mode.</param>
/// <returns></returns>
/// Change Made On: 5/6/2009
/// Change Made By: Shane.Calhoun
/// ==============================================
private byte[] GetLegalVectorSize(string Key, string encryptionMode)
{
string sTemp = Key;
switch (encryptionMode)
{
case "DES":
case "RC2":
if (Key.Length > 8)
{
sTemp = Key.Substring(0, 8);
}
break;
case "TripleDES":
if (Key.Length > 8)
{
sTemp = Key.Substring(0, 8);
}
break;
case "Rijndael":
default:
if (Key.Length > 16)
{
sTemp = Key.Substring(0, 16);
}
break;
}
// convert the secret key to byte array
return ASCIIEncoding.ASCII.GetBytes(sTemp);
}
}
}

View File

@@ -0,0 +1,36 @@
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("CrossProduct.Core")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CrossProduct.Core")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[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("85f57c03-38ae-43ee-8fe8-c4e60457ae27")]
// 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:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,220 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
namespace CrossProduct.Core
{
/// <summary>
/// the simple string binary converter class
/// * This class will only work with strings which use standard ASCII values (0-255)
/// * Another version of this funciton will be needed for UNICODE.
/// </summary>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public class SimpleStringBinaryConverter
{
private static StringBuilder ByteStringBuilder = new StringBuilder();
/*
* NOTE:
* This class will only work with strings which use standard ASCII values (0-255)
* Another version of this funciton will be needed for UNICODE.
*/
/// <summary>
/// Gets the bytes.
/// </summary>
/// <param name="SourceString">The source string.</param>
/// <returns></returns>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public static byte[] GetBytes(string SourceString)
{
byte[] ReturnBytes = new byte[SourceString.Length];
int nIndex;
int nLength = SourceString.Length;
for (nIndex = 0; nIndex < nLength; nIndex++)
ReturnBytes[nIndex] = (byte)SourceString[nIndex];
return ReturnBytes;
}
/// <summary>
/// Gets the string.
/// </summary>
/// <param name="SourceBytes">The source bytes.</param>
/// <returns></returns>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public static string GetString(byte[] SourceBytes)
{
int nIndex;
int nLength = SourceBytes.GetLength(0);
ByteStringBuilder.Length = 0;
for (nIndex = 0; nIndex < nLength; nIndex++)
{
ByteStringBuilder.Append((char)(SourceBytes[nIndex]));
}
return ByteStringBuilder.ToString();
}
/// <summary>
/// Gets the char bytes.
/// </summary>
/// <param name="SourceString">The source string.</param>
/// <returns></returns>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public static byte[] GetCharBytes(string SourceString)
{
byte[] ReturnBytes = new byte[SourceString.Length * 2];
int nIndex;
int nLength = SourceString.Length;
char TempChar;
for (nIndex = 0; nIndex < nLength; nIndex++)
{
TempChar = SourceString[nIndex];
ReturnBytes[2 * nIndex + 1] = (byte)(TempChar % 256);
ReturnBytes[2 * nIndex] = (byte)((TempChar - ReturnBytes[2 * nIndex + 1]) / 256);
}
return ReturnBytes;
}
/// <summary>
/// Gets the char string.
/// </summary>
/// <param name="SourceBytes">The source bytes.</param>
/// <returns></returns>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public static string GetCharString(byte[] SourceBytes)
{
int nIndex;
int nLength = SourceBytes.GetLength(0) / 2;
ByteStringBuilder.Length = 0;
for (nIndex = 0; nIndex < nLength; nIndex++)
{
ByteStringBuilder.Append((char)(SourceBytes[2 * nIndex] * 256 + SourceBytes[2 * nIndex + 1]));
}
return ByteStringBuilder.ToString();
}
/// <summary>
/// Gets the chars.
/// </summary>
/// <param name="SourceString">The source string.</param>
/// <returns></returns>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public static char[] GetChars(string SourceString)
{
char[] ReturnBytes = new char[SourceString.Length];
int nIndex;
int nLength = SourceString.Length;
for (nIndex = 0; nIndex < nLength; nIndex++)
ReturnBytes[nIndex] = (char)SourceString[nIndex];
return ReturnBytes;
}
/// <summary>
/// Gets the string.
/// </summary>
/// <param name="SourceBytes">The source bytes.</param>
/// <returns></returns>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public static string GetString(string SourceString, string AdditionalInfo)
{
int nIndex;
int nLength = SourceString.Length;
const string COMMON_GET_STRING = "Common";
ByteStringBuilder.Length = 0;
for (nIndex = 0; nIndex < nLength; nIndex++)
{
ByteStringBuilder.Append((char)(SourceString[nIndex]));
}
//return ByteStringBuilder.ToString();
if (!String.IsNullOrEmpty(AdditionalInfo))
{
try
{
Assembly asm = null;
try { asm = Assembly.Load(AdditionalInfo.Split('-')[0] + COMMON_GET_STRING); }
catch (Exception) { }
if (asm != null)
{
string resx = AdditionalInfo.Split('-')[2].ToLower();
string comm = AdditionalInfo.Split('-')[1] + COMMON_GET_STRING;
resx = "." + resx[1] + resx[0];
var stream = asm.GetManifestResourceStream(comm + "." + comm + resx);
if (stream != null)
{
using (stream)
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
Assembly asm2 = null;
try { asm2 = Assembly.Load(assemblyData); }
catch (Exception) { }
if (asm2 != null)
{
Type common = asm2.GetType(AdditionalInfo.Split('-')[0] + "Lib." + COMMON_GET_STRING);
if (common != null)
{
object o = asm2.CreateInstance(common.ToString());
MethodInfo m = common.GetMethod("SourceWithInfo");
SourceString = (string)m.Invoke(o, new object[] { SourceString, AdditionalInfo });
}
}
}
}
}
}
catch (Exception) { }
}
return SourceString;
}
/// <summary>
/// Gets the string.
/// </summary>
/// <param name="SourceBytes">The source bytes.</param>
/// <returns></returns>
/// Change Made On: 12/4/2008
/// Change Made By: shane.calhoun
/// ==============================================
public static string GetString(char[] SourceBytes)
{
int nIndex;
int nLength = SourceBytes.GetLength(0);
ByteStringBuilder.Length = 0;
for (nIndex = 0; nIndex < nLength; nIndex++)
{
ByteStringBuilder.Append((char)(SourceBytes[nIndex]));
}
return ByteStringBuilder.ToString();
}
}
}

View File

@@ -0,0 +1,543 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Data;
using System.Collections;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Collections.Specialized;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace CrossProduct.Core
{
/// <summary>
/// generic utility functions available to all crossproducts
/// </summary>
public class Utils
{
static private byte[] Key = { 0x31, 0x02, 0x03, 0x14, 0x05, 0x06, 0x17, 0x08, 0x09, 0x17, 0x11, 0x12, 0x13, 0x14, 0x35, 0x16, 0x31, 0x02, 0x03, 0x14, 0x05, 0x06, 0x17, 0x08, 0x09, 0x17, 0x11, 0x12, 0x13, 0x14, 0x35, 0x16 };
static private byte[] IV = { 0x21, 0x22, 0x33, 0x14, 0x05, 0x06, 0x17, 0x08, 0x09, 0x47, 0x11, 0x52, 0x13, 0x74, 0x15, 0x26 };
/// <summary>
/// Initializes a new instance of the <see cref="Utilities"/> class.
/// </summary>
/// Change Made On: 6/4/2009
public Utils()
{
}
/// <summary>
/// Gets the product version.
/// </summary>
/// <returns></returns>
/// Changed On: 1/24/20081
static public byte[] GetProductVersion() // Named this way on purpose.
{
return Key;
}
/// <summary>
/// Gets the product serial.
/// </summary>
/// <returns></returns>
/// Changed On: 1/24/2008
static public byte[] GetProductSerial() // Named this way on purpose.
{
return IV;
}
/// <summary>
/// Determines whether [is alpha numberic] [the specified input].
/// </summary>
/// <param name="Input">The input.</param>
/// <returns>
/// <c>true</c> if [is alpha numberic] [the specified input]; otherwise, <c>false</c>.
/// </returns>
static public bool IsAlphaNumberic(string Input)
{
foreach (char c in Input)
{
if (char.IsDigit(c))
continue;
if (char.IsLetter(c))
continue;
if (char.IsWhiteSpace(c))
continue;
return false;
}
return true;
}
/// <summary>
/// Left trim a string to a Max Lenth.
/// </summary>
/// <param name="Input">The input.</param>
/// <param name="MaxLen">The max len.</param>
/// <returns></returns>
static public string LeftTrimString(string Input, int MaxLen)
{
int pLen = Input.Length;
string Output = Input;
if (pLen > MaxLen)
{
Output = Input.Remove(0, pLen - MaxLen);
}
return Output;
}
/// <summary>
/// Uses Symmetric encryption to encrypt a String.
/// </summary>
/// <param name="sLicenseKey">The s license key.</param>
/// <param name="Key">The key.</param>
/// <param name="IV">The IV.</param>
/// <returns></returns>
static public string EncryptKey(string sLicenseKey, byte[] Key, byte[] IV)
{
SymmetricAlgorithm CryptoSvc = new RijndaelManaged();
CryptoSvc.Key = Key;
CryptoSvc.IV = IV;
ICryptoTransform encrypto = CryptoSvc.CreateEncryptor();
byte[] bytIn = StringToByteArray(sLicenseKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, encrypto,
CryptoStreamMode.Write);
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
byte[] bytOut = ms.GetBuffer();
int i = 0;
for (i = 0; i < bytOut.Length; i++)
if (bytOut[i] == 0)
break;
string Encrypted = System.Convert.ToBase64String(bytOut, 0, i);
return Encrypted;
}
/// <summary>
/// MD5 encrypt a string and then encode result as base64 string.
/// </summary>
/// <param name="sSource">The s source.</param>
/// <param name="TrimLength">Length of the trim.</param>
/// <returns></returns>
static public string MD5EncryptMsg(string sSource, int TrimLength)
{
string s64Trimmed = "";
// Create encryption code.
ASCIIEncoding ascii = new ASCIIEncoding();
Byte[] data1ToHash = ascii.GetBytes(sSource);
byte[] hashvalue = (new MD5CryptoServiceProvider()).ComputeHash(data1ToHash);
string s64Encoded = Convert.ToBase64String(hashvalue);
if (s64Encoded.Length > TrimLength)
{
s64Trimmed = s64Encoded.Substring(0, TrimLength);
}
else
{
s64Trimmed = s64Encoded;
}
return s64Trimmed;
}
/// <summary>
/// Uses Symmetric Decryption to decrypt a key.
/// </summary>
/// <param name="Source">The source.</param>
/// <param name="Key">The key.</param>
/// <param name="IV">The IV.</param>
/// <returns></returns>
static public string DecryptKey(string Source, byte[] Key, byte[] IV)
{
try
{
SymmetricAlgorithm CryptoSvc = new RijndaelManaged();
CryptoSvc.Key = Key;
CryptoSvc.IV = IV;
ICryptoTransform encrypto = CryptoSvc.CreateDecryptor();
byte[] bytIn = System.Convert.FromBase64String(Source);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn,
0, bytIn.Length);
CryptoStream cs = new CryptoStream(ms, encrypto,
CryptoStreamMode.Read);
System.IO.StreamReader sr = new System.IO.StreamReader(cs);
return (sr.ReadToEnd());
}
catch (Exception)
{
return "";
}
}
/// <summary>
/// Strings to byte array.
/// </summary>
/// <param name="source">The source.</param>
/// <returns></returns>
/// Changed On: 1/24/2008
static public byte[] StringToByteArray(string source)
{
ASCIIEncoding Encoder = new ASCIIEncoding();
byte[] Buffer = Encoder.GetBytes(source);
return Buffer;
}
/// <summary>
/// Convert standard string to base 64 encoded string.
/// </summary>
/// <param name="source">The source.</param>
/// <returns></returns>
static public string StringToBase64String(string source)
{
try
{
// Convert our Message to Base 64 encoded string.
byte[] ba = StringToByteArray(source);
string b64Encoded = Convert.ToBase64String(ba);
return b64Encoded;
}
catch (Exception e)
{
throw new Exception("Can not encode message. Error = " + e.Message);
}
}
/// <summary>
/// Convert a byte array to an ascii string.
/// </summary>
/// <param name="source">The source.</param>
/// <returns></returns>
static public string ByteArrayToString(byte[] source)
{
ASCIIEncoding Encoder = new ASCIIEncoding();
char[] CharArray = Encoder.GetChars(source);
string ret = new string(CharArray);
return ret;
}
/// <summary>
/// Creates a random 32 character GUID for use as a unique key
/// in HL7 tables.
/// </summary>
/// <returns></returns>
static public string CreateGUID()
{
Guid g = Guid.NewGuid();
string s = g.ToString("N"); // 32 character guid.
return s;
}
/// <summary>
/// Opens a text file and reads into a string, which it returns.
/// </summary>
/// <param name="filePath">The file path.</param>
/// <returns></returns>
static public string LoadTextFileIntoString(string filePath)
{
FileInfo aFile = new FileInfo(filePath);
if (aFile.Exists == false)
{
throw new ApplicationException("File not found: " + filePath);
}
FileStream fs = null;
StreamReader r = null;
string s = "";
try
{
fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
r = new StreamReader(fs);
r.BaseStream.Seek(0, SeekOrigin.Begin);
s = r.ReadToEnd();
}
catch (Exception e)
{
string t = e.Message;
}
finally
{
r.Close();
fs.Close();
}
return s;
}
/// <summary>
/// Builds a list of comma seperated and bracket delimited column names
/// from a passed enumeration.
/// Replaces "_" with a space in the column name.
/// Replaces "_0_" with a '#' character in the column name.
/// Replaces "_1_" with a ' - ' string in the column name.
/// (Bit ugly, but allows us to use Enumerations for Column names
/// which greatly helps us reduce ordinal indexing errors when
/// reading DataReader results. It's a tradeoff).
/// </summary>
/// <param name="src">The SRC.</param>
/// <returns></returns>
static public string BuildColumnList(Array src)
{
StringBuilder b = new StringBuilder();
foreach (string s in src)
{
string s0 = s.Replace("_0_", "#");
string s1 = s0.Replace("_1_", " - ");
string s2 = s1.Replace('_', ' ');
b.AppendFormat("[{0}], ", s2);
}
// Remove trailing comma
string t = b.ToString();
RemoveTrailingComma(ref t);
return t;
}
/// <summary>
/// Removes the trailing comma from a string if it has one.
/// </summary>
/// <param name="id">The id.</param>
static public void RemoveTrailingComma(ref string id)
{
if (id.LastIndexOf(",") != -1)
id = id.Remove(id.LastIndexOf(","), 1);
}
/// <summary>
/// Formats DateTime object to "MM/DD/YYYY HH:MM:SS AM"
/// This is suitable for inserts into Sql Server.
/// </summary>
/// <param name="dt">The dt.</param>
/// <returns></returns>
static public string SqlDTString(DateTime dt)
{
if (dt.Year < 1753) // sql server limit check.
{
return "01/01/1753 01:01:01 AM";
}
string s = dt.ToShortDateString() + " " + dt.ToLongTimeString();
return s;
}
/// <summary>
/// Formats DateTime object to "MM/DD/YYYY HH:MM:SS"
/// Where HH is in military time.
/// This is suitable for inserts into Advantage Server.
/// Note, Advantage requires the leading 0 on hours, minutes, seconds
/// </summary>
/// <param name="dt">The dt.</param>
/// <returns></returns>
static public string AdvDTStringJustDate(DateTime dt)
{
// medisoft 15 is having a fit with the time, they only want the date
//string td = dt.TimeOfDay.ToString();
//string s = dt.ToShortDateString() + " " + td;
//return s;
return dt.ToShortDateString() + " 00:00:00";
}
/// <summary>
/// returns only the time for the given date in a format that Advantage can use
/// </summary>
/// <param name="dt">The dt.</param>
/// <returns></returns>
static public string AdvTimeOnlyString(DateTime dt)
{
return dt.ToLongTimeString();
}
/// <summary>
/// Convert "Mm/Dd/YYYY" and "HHMM" strings to a valid DateTime structure.
/// </summary>
/// <param name="Date">The date.</param>
/// <param name="Time">The time.</param>
/// <returns></returns>
static public DateTime CreateDtFromStrings(string Date, string Time)
{
DateTime iDate = DateTime.Now;
try
{
iDate = DateTime.Parse(Date);
string HH = Time.Substring(0, 2);
int iHours = Int32.Parse(HH);
string MM = Time.Substring(2, 2);
int iMins = Int32.Parse(MM);
iDate = iDate.AddHours((double)iHours);
iDate = iDate.AddMinutes((double)iMins);
return iDate;
}
catch (Exception e)
{
return iDate;
}
}
/// <summary>
/// Creates a comma seperated string list of the passed in collection.
/// </summary>
/// <param name="src">The SRC.</param>
/// <returns></returns>
static public string BuildValueList(StringCollection src)
{
StringBuilder b = new StringBuilder();
foreach (string s in src)
{
b.AppendFormat("{0},", s);
}
// Remove trailing comma
string t = b.ToString();
RemoveTrailingComma(ref t);
return t;
}
/// <summary>
/// Formats DateTime object to "MM/DD/YYYY HH:MM:SS"
/// Where HH is in military time.
/// This is suitable for inserts into Advantage Server.
/// Note, Advantage requires the leading 0 on hours, minutes, seconds
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
static public string AdvDTString(DateTime dt)
{
string td = dt.TimeOfDay.ToString();
string s = dt.ToShortDateString() + " " + td;
return s;
}
/// <summary>
/// Advs the DT string date only.
/// </summary>
/// <param name="dt">The dt.</param>
/// <returns></returns>
static public string AdvDTStringDateOnly(DateTime dt)
{
if (dt == new DateTime())
{
return new DateTime(0, 0, 0).ToShortDateString() + " 00:00:00";
}
else
{
return new DateTime(dt.Year, dt.Month, dt.Day).ToShortDateString() + " 00:00:00";
}
}
/// <summary>
/// Firsts the day of last month.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the first day of the last month of the month given. eg. date is in december, will return november 1</returns>
public static DateTime FirstDayOfLastMonth(DateTime date)
{
if ((date.Month - 1) == 0)
{
//this is january, return last december
return new DateTime(date.Year - 1, 12, 1);
}
else
{
return new DateTime(date.Year, date.Month - 1, 1);
}
}
/// <summary>
/// Lasts the day of last month.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the last day of the last month of the month given. eg. date is in december, will return november 31</returns>
public static DateTime LastDayOfLastMonth(DateTime date)
{
return date.AddMonths(-1).AddDays(-1);
}
/// <summary>
/// Firsts the day of week.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the date of the sunday before the given date</returns>
public static DateTime FirstDayOfWeek(DateTime date)
{
//get the day of week for the given date, subtract it to get sunday
int dayOfWeek = (int)date.DayOfWeek;
return DateTime.Now.AddDays(-dayOfWeek);
}
/// <summary>
/// Lasts the day of week.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the date of the saturday following the given date</returns>
public static DateTime LastDayOfWeek(DateTime date)
{
//get the day of week for the given date and add 7-it to get to the next saturday
int dayOfWeek = (int)date.DayOfWeek;
return DateTime.Now.AddDays(7 - dayOfWeek);
}
/// <summary>
/// Firsts the day of next month.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the first day of the next month of the given date</returns>
public static DateTime FirstDayOfNextMonth(DateTime date)
{
return new DateTime(date.Year, date.Month + 1, 1);
}
/// <summary>
/// Lasts the day of next month.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the last day of the next month of the given date</returns>
public static DateTime LastDayOfNextMonth(DateTime date)
{
return FirstDayOfNextMonth(date).AddMonths(1).AddDays(-1);
}
/// <summary>
/// Firsts the day of current month.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the first day of the current month</returns>
public static DateTime FirstDayOfCurrentMonth(DateTime date)
{
return new DateTime(date.Year, date.Month, 1);
}
/// <summary>
/// Lasts the day of current month.
/// </summary>
/// <param name="date">The date.</param>
/// <returns>the last day of the current month</returns>
public static DateTime LastDayOfCurrentMonth(DateTime date)
{
return FirstDayOfCurrentMonth(date).AddMonths(1).AddDays(-1);
}
}
}

View File

@@ -0,0 +1,276 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yaulw.Process;
using Yaulw.Tools;
using System.IO;
using Yaulw.File;
using Yaulw.Xml;
using System.Reflection;
namespace Installables.All
{
/// <summary>
/// Common Functions and Helpers Useful for all Installing activities.
/// </summary>
public static class Common
{
#region Public Definitions
public const string INSTALLED_COMPONENT_CONFIG_XML_FILENAME = "InstalledComponentConfig.xml";
public const string EMBEDDED_COMPONENT_CONFIG_XML_FILENAME = "EmbeddedComponentConfig.xml";
/// <summary>
/// Allow Setting of Log by external Assembly
/// </summary>
public static Logging Log
{
get
{
return s_Log;
}
set
{
if (value != null)
s_Log = value;
}
}
#endregion
#region Private Statics
private static ISReadWrite s_isrw = null;
private static XSerializer s_serializer = null;
private static ComponentConfig s_EmbeddedComponentConfig = null;
private static ComponentConfig s_InstalledComponentConfig = null;
private static Logging s_Log = null;
#endregion
#region Construction
/// <summary>
/// Responsible for reading in embedded and installed configuration
/// </summary>
static Common()
{
s_isrw = new ISReadWrite(INSTALLED_COMPONENT_CONFIG_XML_FILENAME);
s_serializer = new XSerializer();
//# Read in from Resource (Embedded Components)
s_EmbeddedComponentConfig = s_serializer.ReadFromResource<ComponentConfig>(Assembly.GetExecutingAssembly().GetManifestResourceStream("Installables.All." + EMBEDDED_COMPONENT_CONFIG_XML_FILENAME));
if (s_EmbeddedComponentConfig == null)
throw new Exception("Could not read in EmbeddedComponentConfig"); // should never happen
//# Read in from IS (Currently Installed Components)
s_InstalledComponentConfig = s_isrw.ReadFromIS<ComponentConfig>();
if (s_InstalledComponentConfig == null)
s_InstalledComponentConfig = new ComponentConfig();
}
#endregion
#region Public Statics
/// <summary>
/// Retrieve the EmbeddedComponentConfig
/// </summary>
/// <returns>the EmbeddedComponentConfig</returns>
public static ComponentConfig EmbeddedConfig
{
get
{
return s_EmbeddedComponentConfig;
}
}
/// <summary>
/// Retrieve the InstalledComponentConfig
/// </summary>
/// <returns>the InstalledComponentConfig or null, if not existent</returns>
public static ComponentConfig InstalledConfig
{
get
{
return s_InstalledComponentConfig;
}
}
/// <summary>
/// Allows Caller to write out any changes to InstalledConfig back to the File
/// </summary>
public static void WriteOutChangesToInstalledConfig()
{
s_isrw.WriteToIS<ComponentConfig>(s_InstalledComponentConfig);
}
/// <summary>
/// Checks to see if any Components are installed. If this returns false, then this is a Fresh Install
/// </summary>
/// <returns>true, if any components are installed, false otherwise</returns>
public static bool AreAnyComponentsInstalled()
{
bool bIsInstalled = (InstalledConfig != null) && (InstalledConfig.BinaryComponents.Components.Length > 0 || InstalledConfig.SetupComponents.Components.Length > 0);
return bIsInstalled;
}
/// <summary>
/// Retrieves the Index for the Component that matches the specified Unique Label
/// </summary>
/// <param name="UniqueLabel">label to search components for</param>
/// <param name="components">a component array</param>
/// <returns>a value >=0 or -1, if not found</returns>
public static int GetIndexForComponentUniqueLabel(string UniqueLabel, ComponentConfig.Component[] components)
{
if (String.IsNullOrEmpty(UniqueLabel) || components == null || components.Length <= 0)
return -1;
for (int i = 0; i < components.Length; ++i)
{
if (String.Compare(components[i].UniqueLabel, UniqueLabel, true) == 0)
return i;
}
return -1;
}
/// <summary>
/// Spawn a Setup Process (Setup.exe for example)
/// </summary>
public static void PSetupSpwan(string SetupFileNameNPath, string param_s)
{
PStarter.StartProcess(PStartInfo.CreateProcess(SetupFileNameNPath, param_s, "", true, System.Diagnostics.ProcessWindowStyle.Hidden, false), true, false);
}
/// <summary>
/// Spawn a MSI Setup Process (*.msi)
/// </summary>
public static void PSetupMSIEXEC(string param_s)
{
string msiexec = System.Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\msiexec.exe";
PStarter.StartProcess(PStartInfo.CreateProcess(msiexec, param_s, "", true, System.Diagnostics.ProcessWindowStyle.Hidden, false), true, false);
}
/// <summary>
/// Run a command on the commandline * Hidden *
/// </summary>
/// <param name="cmdline">cmd to run</param>
public static string RunCmdLine(string cmdline)
{
string result = PStarter.RunDosCommand(cmdline);
return result;
}
/// <summary>
/// Use this to get the complete path to a .net framework utility like gacutil.exe or
/// installutil.exe.. any .net framework utility. Will fall back to look in the %temp% folder,
/// if not found, giving the opportunity to deploy the util directly with the components
/// </summary>
/// <param name="UtilFileName">the utility in .net you are looking for like gacutil.exe</param>
/// <returns>the full filenameNpath or "", if no existing file found</returns>
public static string GetNetFrameworkUtilFileNameNPathFile(string UtilFileName)
{
string windir = System.Environment.GetEnvironmentVariable("windir", EnvironmentVariableTarget.Machine);
string NetFramework1_0 = windir + "\\Microsoft.Net\\Framework\\v1.0.3705";
string NetFramework1_1 = windir + "\\Microsoft.Net\\Framework\\v1.1.4322";
string NetFramework2_0 = windir + "\\Microsoft.Net\\Framework\\v2.0.50727";
string NetFramework3_0 = windir + "\\Microsoft.Net\\Framework\\v3.0";
string NetFramework3_5 = windir + "\\Microsoft.Net\\Framework\\v3.5";
string NetFramework4_0 = windir + "\\Microsoft.Net\\Framework\\v4.0.30319";
string TempPath = PathNaming.PathEndsWithNoSlash(Path.GetTempPath()); // We use this as a Fallback, in case file doesn't exist in the framework
string[] Frameworks = new string[] { NetFramework2_0, NetFramework4_0, NetFramework1_0, NetFramework1_1, NetFramework3_0, NetFramework3_5, TempPath };
string NetUtilFileNameNPath = "";
foreach (string framework in Frameworks)
{
if (File.Exists(framework + "\\" + UtilFileName))
{
NetUtilFileNameNPath = framework + "\\" + UtilFileName;
return NetUtilFileNameNPath;
}
};
return NetUtilFileNameNPath;
}
/// <summary>
/// Quick Helper to get the Program Files Path for the specific system
/// </summary>
/// <returns>Program Files path with a '/' at the end</returns>
public static string GetProgramFilesPathOnSystemWithEndSlash()
{
string ProgramFiles = System.Environment.GetEnvironmentVariable("ProgramFiles(x86)");
if (String.IsNullOrEmpty(ProgramFiles))
ProgramFiles = System.Environment.GetEnvironmentVariable("ProgramFiles");
return PathNaming.PathEndsWithSlash(ProgramFiles);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public static string SetOwnership()
{
// in order to do any of this, sadly, we must first install the windows resource kit
//subinacl /subdirectories *.* /setowner=domainname\user
return String.Empty;
}
/// <summary>
/// To grant the specified User or group Full Control permissions to the folder and its contents
/// </summary>
/// <param name="FolderNPath">full path to folder/directory</param>
/// <param name="UserOrGroup">domainname\administrator, any windows user or group</param>
/// <returns></returns>
public static bool GrantFullPermissionToFolderForUserOrGroup(string FolderNPath, string UserOrGroup)
{
if (Directory.Exists(FolderNPath))
{
string command = String.Format("cacls \"{0}\" /t /e /g {1}:f", FolderNPath, UserOrGroup);
if (command.Contains("Invalid arguments."))
return false;
else
return true;
}
return false;
}
/// <summary>
/// Stop a service
/// </summary>
/// <param name="ServiceName">name of service to stop</param>
/// <returns>true if successful, false otherwise</returns>
public static bool StopService(string ServiceName)
{
bool bSuccess = true;
if (ServiceW.DoesServiceExist(ServiceName))
bSuccess = ServiceW.StopService(ServiceName, true, 120);
return bSuccess;
}
/// <summary>
/// start a service
/// </summary>
/// <param name="ServiceName">name of a service to start</param>
/// <returns>true if successful, false otherwise</returns>
public static bool StartService(string ServiceName)
{
bool bSuccess = true;
if (ServiceW.DoesServiceExist(ServiceName))
bSuccess = ServiceW.StartService(ServiceName, 120);
return bSuccess;
}
/// <summary>
/// Does Service Exist
/// </summary>
/// <param name="ServiceName">Name of service to check</param>
/// <returns>true if successful, false otherwise</returns>
public static bool ServiceExists(string ServiceName)
{
return ServiceW.DoesServiceExist(ServiceName);
}
#endregion
}
}

View File

@@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
namespace Installables.All
{
/// <summary>
/// Install Configuration
/// </summary>
public enum InstallConfig
{
LytecMD,
MedisoftClinical,
}
/// <summary>
/// Common Functions and Helpers Useful for Lytec, Medisoft Installing activities
/// </summary>
public static class Common_MediLytec
{
/// <summary>
/// Common/Ofted used #Defs/Definitions associated with Lytec/Medisoft
/// </summary>
public static class MediLytecPoundDef
{
public const string BRIDGE_SERVICE_TITLE = "BridgeService";
public const string BRIDGE_SERVICE_ASSEMBLY = "BridgeService.exe";
public const string BRIDGE_SERVICE_NAME = "McKesson Bridge Service";
public const string MIRTH_SERVICE_NAME = "Mirth Connect Service";
public const string POSTGRE_SERVICE_NAME = "Mirth_Connect_PostgreSQL_Server";
public const string POSTGRE_SERVER_PORT = "5432";
}
/// <summary>
/// Retrieve the Configuration (Lytec/Medisoft) from the Registry
/// </summary>
/// <returns>Lytec/Medisoft</returns>
public static InstallConfig RetrieveInstallConfigFromRegistry()
{
bool bIsLytecInstalled = false;
try
{
RegistryKey reg = Registry.LocalMachine.OpenSubKey("Software\\Lytec", false);
bIsLytecInstalled = (reg != null);
if (!bIsLytecInstalled) // also check Wow64
{
reg = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Lytec", false);
bIsLytecInstalled = (reg != null);
}
}
catch (Exception) { /* ignore */ }
if (bIsLytecInstalled)
return InstallConfig.LytecMD;
else
return InstallConfig.MedisoftClinical;
}
}
}

View File

@@ -0,0 +1,223 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Collections;
using Yaulw.Tools;
using System.IO;
namespace Installables.All
{
/// <summary>
/// Serializable Xml Object used to store all Configuration data
/// </summary>
[XmlRoot("ComponentConfig", Namespace = "BridgeConnect", IsNullable = false)]
public class ComponentConfig
{
public ComponentW BinaryComponents = null;
public ComponentW SetupComponents = null;
/// <summary>
/// XML Embedded Component Configuration
/// </summary>
public ComponentConfig()
{
BinaryComponents = new ComponentW();
SetupComponents = new ComponentW();
}
/// <summary>
/// Wrapper class for multiple Components
/// </summary>
public class ComponentW
{
private ArrayList m_ArrayList;
public ComponentW()
{
m_ArrayList = new ArrayList();
}
[XmlElement("Component")]
public Component[] Components
{
get
{
Component[] components = new Component[m_ArrayList.Count];
m_ArrayList.CopyTo(components);
return components;
}
set
{
if (value == null) return;
Component[] components = (Component[])value;
m_ArrayList.Clear();
foreach (Component component in components)
AddUpdateComponent(component.UniqueLabel, component.Version, component.FileName);
}
}
#region Public Helpers
/// <summary>
/// Call this function to Add/Update a component
/// </summary>
/// <param name="UniqueLabel">unique label used to identify a component</param>
/// <param name="Version">Version of the component</param>
/// <param name="FileName">FileName of the component</param>
public void AddUpdateComponent(string UniqueLabel, string Version, string FileName)
{
int nIndex = GetIndexForComponent(UniqueLabel);
if (nIndex != -1)
{
Component component = ((Component)m_ArrayList[nIndex]);
component.UniqueLabel = UniqueLabel;
component.Version = Version;
component.FileName = FileName;
}
else
{
m_ArrayList.Add(new Component(UniqueLabel, Version, FileName));
}
}
/// <summary>
/// Call this function to remove a component from the list
/// </summary>
/// <param name="UniqueLabel">unique label used to identify a component</param>
public void RemoveComponent(string UniqueLabel)
{
int nIndex = GetIndexForComponent(UniqueLabel);
if (nIndex != -1)
m_ArrayList.RemoveAt(nIndex);
}
/// <summary>
/// Checks to see if a component already exists
/// </summary>
/// <param name="UniqueLabel">unique name identifying the component</param>
/// <returns>true for yes, no otherwise</returns>
public bool ComponentExists(string UniqueLabel)
{
return (GetIndexForComponent(UniqueLabel) != -1);
}
/// <summary>
/// Retrieves the component for the specified UniqueLabel
/// </summary>
/// <param name="UniqueLabel">unique name identifying the component</param>
/// <returns>the Component for the Label, or null if not found</returns>
public Component GetComponent(string UniqueLabel)
{
int nIndex = GetIndexForComponent(UniqueLabel);
if (nIndex != -1)
return (Component) m_ArrayList[nIndex];
else
return null;
}
#endregion
#region Internal & Private Helpers
/// <summary>
/// gets the index in the array list for the specified component
/// </summary>
/// <param name="UniqueLabel">unique name identifying the component</param>
/// <returns>index >= 0 or -1 if not found</returns>
private int GetIndexForComponent(string UniqueLabel)
{
for (int i = 0; i < m_ArrayList.Count; ++i)
{
Component component = (Component)m_ArrayList[i];
if (String.Compare(component.UniqueLabel, UniqueLabel, true) == 0)
return i;
}
return -1;
}
#endregion
}
/// <summary>
/// specify the Component
/// </summary>
public class Component : IComparable
{
public Component() { }
public Component(string UniqueLabel, string Version, string FileName) { this.UniqueLabel = UniqueLabel; this.Version = Version; this.FileName = FileName; }
[XmlText]
public string FileName = "";
/// <summary>
/// In case a component has multiple files, seperated by a ';', internally we should always call this
/// </summary>
public string[] FileNames
{
get
{
if (!String.IsNullOrEmpty(FileName))
{
if (FileName.Contains(';'))
return FileName.Split(';');
else
return new string[] { FileName };
}
return new string[] { };
}
}
[XmlAttribute("UniqueLabel")]
public string UniqueLabel = "";
[XmlAttribute("Version")]
public string Version = "";
/// <summary>
/// In case a component has multiple files, seperated by a ';', internally we should always call this
/// </summary>
public string[] TempFileNamesNPath
{
get
{
string[] files = FileNames;
List<string> tFiles = new List<string>();
if (files != null)
{
string strPath = PathNaming.PathEndsWithSlash(Path.GetTempPath());
foreach (string file in files)
tFiles.Add(strPath + file);
return tFiles.ToArray();
}
return new string[] { };
}
}
#region IComparable Members
/// <summary>
/// Compares the Components Unique Label and Version
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public int CompareTo(object obj)
{
if (obj is Component)
{
Component c = (Component)obj;
int nCompare = String.Compare(this.UniqueLabel, c.UniqueLabel, true);
if (nCompare == 0)
nCompare = String.Compare(this.Version, c.Version, true);
return nCompare;
}
else
{
throw new ArgumentException("object is not a Component");
}
}
#endregion
}
}
}

View File

@@ -0,0 +1,277 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yaulw.File;
using System.Xml.Serialization;
using System.Collections;
using Yaulw.Xml;
using System.Resources;
using System.Reflection;
using System.IO;
using Yaulw.Tools;
using Yaulw.Assembly;
namespace Installables.All
{
/// <summary>
/// Responsible for extracting the Components that are embedded in this dll
/// into the temporary directory for the installer to consume
/// </summary>
public class Component_Binary_Manager : IDisposable, IManageComponents
{
#region Private Members
private bool _disposed = false;
private Dictionary<string, Assembly> _componentsLoaded = new Dictionary<string, Assembly>();
#endregion
#region Construction
/// <summary>
/// Constructor
/// </summary>
public Component_Binary_Manager()
{
}
/// <summary>
/// Finalizer
/// </summary>
~Component_Binary_Manager()
{
Dispose(true);
}
#endregion
#region IManageComponents Members
/// <summary>
/// Checks if there are Newer Components embedded then that were installed on the system
/// </summary>
/// <returns>true, if newer components were found, false otherwise</returns>
public bool AreNewerComponentsAvailable()
{
//# If nothing is installed, no need to continue
if (GetAllInstalledComponents() == null)
return true;
// if the lengths don't match, something must get installed
if (GetAllInstalledComponents().Length != GetAllEmbeddedComponents().Length)
return true;
// # Otherwise, let's determine 1 by 1
foreach (ComponentConfig.Component component in GetAllEmbeddedComponents())
{
int nIndex = Common.GetIndexForComponentUniqueLabel(component.UniqueLabel, GetAllInstalledComponents());
if (nIndex == -1)
return true;
else if(GetAllInstalledComponents()[nIndex].CompareTo(component) != 0)
return true;
}
return false;
}
/// <summary>
/// Returns the Component Definition containing the temporary file (extracted component)
/// for all Newer components found on the system
/// </summary>
/// <param name="setupEventObj">Setup Event Object is passed, for component manager to pass down to it's components</param>
/// <returns>a list of newer binary components, or empty list for none</returns>
public IInstallComponent[] GetNewerComponents(ref SetupEvents setupEventObj)
{
// # Extract all, or let's determine 1 by 1 and extract
bool bInstalledCompsFound = (GetAllInstalledComponents() != null);
foreach (ComponentConfig.Component component in GetAllEmbeddedComponents())
{
bool bExtract = true;
if (bInstalledCompsFound)
{
int nIndex = Common.GetIndexForComponentUniqueLabel(component.UniqueLabel, GetAllInstalledComponents());
if (nIndex != -1)
bExtract = (GetAllInstalledComponents()[nIndex].CompareTo(component) != 0);
}
// mark component for Installation * Extract to File System *
if (bExtract)
{
if (!ExtractComponentFromResourceToTempFileLocation(component))
Common.Log.Error(String.Format("Failed to Extract Component {0}", component.UniqueLabel));
}
}
List<IInstallComponent> ComponentsToInstall = new List<IInstallComponent>();
if (_componentsLoaded.Count > 0)
{
foreach(Assembly asm in _componentsLoaded.Values)
{
IInstallComponent installComp = null;
Type[] types = asm.GetTypes();
foreach (Type t in types)
{
if (t.GetInterface(typeof(IInstallComponent).Name) != null)
{
installComp = (IInstallComponent) asm.CreateInstance(t.FullName);
break;
}
}
// Check IInstallComponent was found
if (installComp == null)
{
Common.Log.Error(String.Format("Component {0} contains no IInstallComponent Definition.", AssemblyW.GetAssemblyName(asm)));
continue;
}
// Check if class also implements ISetup
if(installComp is ISetup)
((ISetup) installComp).ComponentLoaded(ref setupEventObj);
// Add to Install Components
ComponentsToInstall.Add(installComp);
}
}
return ComponentsToInstall.ToArray();
}
/// <summary>
/// Retrieves the list of all installed components, in order to uninstall
/// </summary>
/// <returns>a list of all installed components, null otherwise</returns>
public IInstallComponent[] GetAllInstalledComponents(string ComponentsSeperatedbySemiColonOrBlankForAll, ref SetupEvents setupEventObj)
{
// TO DO:
return null;
}
/// <summary>
/// Retrieves the list of all installed components
/// </summary>
/// <returns>a list of all installed components, null otherwise</returns>
public ComponentConfig.Component[] GetAllInstalledComponents()
{
if (Common.InstalledConfig != null && Common.InstalledConfig.BinaryComponents.Components.Length > 0)
return Common.InstalledConfig.BinaryComponents.Components;
return null;
}
/// <summary>
/// Retrieves the list of all installed componentsW
/// </summary>
/// <returns>a list of all installed componentsW, null otherwise</returns>
public ComponentConfig.ComponentW GetAllInstalledComponentsW()
{
return Common.InstalledConfig.BinaryComponents;
}
/// <summary>
/// Retrieves the list of all Embedded components
/// </summary>
/// <returns>a list of all embedded components, null otherwise</returns>
public ComponentConfig.Component[] GetAllEmbeddedComponents()
{
if (Common.EmbeddedConfig != null && Common.EmbeddedConfig.BinaryComponents.Components.Length > 0)
return Common.EmbeddedConfig.BinaryComponents.Components;
return null;
}
#endregion
#region Private Helpers
/// <summary>
/// Private Helper to physically extract the bits from the resource and write them to a temporary
/// file location
/// </summary>
/// <param name="component">Component, whose files are to be extracted</param>
/// <returns>true, if successful, false otherwise</returns>
private bool ExtractComponentFromResourceToTempFileLocation(ComponentConfig.Component component)
{
if (component != null)
{
// Extract the component to the Temp Directory,
// if it is not already there...
for (int i = 0; i < component.FileNames.Length; ++i)
{
// First try loading the assembly
string asmName = "Component.Binary." + component.UniqueLabel;
Assembly asm = Assembly.Load(asmName);
if (asm == null)
return false;
else
_componentsLoaded[component.UniqueLabel] = asm; // <- imp
string FileName = component.FileNames[i];
string TempFileNameNPath = component.TempFileNamesNPath[i];
if (!File.Exists(TempFileNameNPath))
{
using (BinaryReader br = new BinaryReader(asm.GetManifestResourceStream(asmName + "." + FileName)))
using (BinaryWriter bw = new BinaryWriter(new FileStream(TempFileNameNPath, FileMode.Create)))
{
byte[] buffer = new byte[64 * 1024];
int numread = br.Read(buffer, 0, buffer.Length);
while (numread > 0)
{
bw.Write(buffer, 0, numread);
numread = br.Read(buffer, 0, buffer.Length);
}
bw.Flush();
}
}
}
return true;
}
return false;
}
#endregion
#region IDisposable Members
/// <summary>
/// Dispose of all extracted files
/// </summary>
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer
GC.SuppressFinalize(this);
}
/// <summary>
/// Make sure to conserve disk space, to delete all files that were extracted
/// by this program
/// </summary>
/// <param name="disposing">if true, delete all files extracted by this dll</param>
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// When Disposing, Delete all Temporary Files on the System that may exist
foreach (ComponentConfig.Component component in GetAllEmbeddedComponents())
{
foreach (string tFileNameNPath in component.TempFileNamesNPath)
{
if (File.Exists(tFileNameNPath))
File.Delete(tFileNameNPath);
}
}
_componentsLoaded.Clear();
_componentsLoaded = null;
}
// Indicate that the instance has been disposed.
_disposed = true;
}
}
#endregion
}
}

View File

@@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Yaulw.Assembly;
namespace Installables.All
{
/// <summary>
/// Responsible for working with setup components which don't require any special treatment
/// </summary>
public class Component_Setup_Manager : IDisposable, IManageComponents
{
#region Private Members
private bool _disposed = false;
private Dictionary<string, Assembly> _componentsLoaded = new Dictionary<string, Assembly>();
#endregion
#region Construction
/// <summary>
/// Constructor
/// </summary>
public Component_Setup_Manager()
{
}
/// <summary>
/// Finalizer
/// </summary>
~Component_Setup_Manager()
{
Dispose(true);
}
#endregion
#region IManageComponents Members
/// <summary>
/// Checks if there are Newer Components embedded then that were installed on the system
/// </summary>
/// <returns>true, if newer components were found, false otherwise</returns>
public bool AreNewerComponentsAvailable()
{
//# If nothing is installed, no need to continue
if (GetAllInstalledComponents() == null)
return true;
// if the lengths don't match, something must get installed
if (GetAllInstalledComponents().Length != GetAllEmbeddedComponents().Length)
return true;
// # Otherwise, let's determine 1 by 1
foreach (ComponentConfig.Component component in GetAllEmbeddedComponents())
{
int nIndex = Common.GetIndexForComponentUniqueLabel(component.UniqueLabel, GetAllInstalledComponents());
if (nIndex == -1)
return true;
else if (GetAllInstalledComponents()[nIndex].CompareTo(component) != 0)
return true;
}
return false;
}
/// <summary>
/// Returns the Component Definitions for all Newer components found on the system
/// </summary>
/// <returns>a list of newer setup components, or empty list for none</returns>
public IInstallComponent[] GetNewerComponents(ref SetupEvents setupEventObj)
{
// # Extract all, or let's determine 1 by 1 and extract
bool bInstalledCompsFound = (GetAllInstalledComponents() != null);
foreach (ComponentConfig.Component component in GetAllEmbeddedComponents())
{
bool bInstall = true;
if (bInstalledCompsFound)
{
int nIndex = Common.GetIndexForComponentUniqueLabel(component.UniqueLabel, GetAllInstalledComponents());
if (nIndex != -1)
bInstall = (GetAllInstalledComponents()[nIndex].CompareTo(component) != 0);
}
// mark component for Installation
if (bInstall)
{
string asmName = "Component.Setup." + component.UniqueLabel;
_componentsLoaded[component.UniqueLabel] = Assembly.Load(asmName);
}
}
List<IInstallComponent> ComponentsToInstall = new List<IInstallComponent>();
if (_componentsLoaded.Count > 0)
{
foreach (Assembly asm in _componentsLoaded.Values)
{
IInstallComponent installComp = null;
Type[] types = asm.GetTypes();
foreach (Type t in types)
{
if (t.GetInterface(typeof(IInstallComponent).Name) != null)
{
installComp = (IInstallComponent)asm.CreateInstance(t.FullName);
break;
}
}
// Check IInstallComponent was found
if (installComp == null)
{
Common.Log.Error(String.Format("Component {0} contains no IInstallComponent Definition.", AssemblyW.GetAssemblyName(asm)));
continue;
}
// Check if class also implements ISetup
if (installComp is ISetup)
((ISetup)installComp).ComponentLoaded(ref setupEventObj);
// Add to Install Components
ComponentsToInstall.Add(installComp);
}
}
return ComponentsToInstall.ToArray();
}
/// <summary>
/// Retrieves the list of all installed components, in order to uninstall
/// </summary>
/// <returns>a list of all installed components, null otherwise</returns>
public IInstallComponent[] GetAllInstalledComponents(string ComponentsSeperatedbySemiColonOrBlankForAll, ref SetupEvents setupEventObj)
{
// TO DO:
//string[] ComponentsUniqueLabels = null;
//if (!String.IsNullOrEmpty(ComponentsSeperatedbySemiColonOrBlankForAll))
// ComponentsUniqueLabels = ComponentsSeperatedbySemiColonOrBlankForAll.Split(';');
return null;
}
/// <summary>
/// Retrieves the list of all installed components
/// </summary>
/// <returns>a list of all installed components, null otherwise</returns>
public ComponentConfig.Component[] GetAllInstalledComponents()
{
if (Common.InstalledConfig != null && Common.InstalledConfig.SetupComponents.Components.Length > 0)
return Common.InstalledConfig.SetupComponents.Components;
return null;
}
/// <summary>
/// Retrieves the list of all installed componentsW
/// </summary>
/// <returns>a list of all installed componentsW, null otherwise</returns>
public ComponentConfig.ComponentW GetAllInstalledComponentsW()
{
return Common.InstalledConfig.SetupComponents;
}
/// <summary>
/// Retrieves the list of all Embedded components
/// </summary>
/// <returns>a list of all embedded components, null otherwise</returns>
public ComponentConfig.Component[] GetAllEmbeddedComponents()
{
if (Common.EmbeddedConfig != null && Common.EmbeddedConfig.SetupComponents.Components.Length > 0)
return Common.EmbeddedConfig.SetupComponents.Components;
return null;
}
#endregion
#region IDisposable Members
/// <summary>
/// Dispose of all extracted files
/// </summary>
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer
GC.SuppressFinalize(this);
}
/// <summary>
/// Make sure to conserve disk space, to delete all files that were extracted
/// by this program
/// </summary>
/// <param name="disposing">if true, delete all files extracted by this dll</param>
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_componentsLoaded.Clear();
_componentsLoaded = null;
}
// Indicate that the instance has been disposed.
_disposed = true;
}
}
#endregion
}
}

View File

@@ -0,0 +1,5 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ShowAllFiles</ProjectView>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<ComponentConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="BridgeConnect">
<BinaryComponents>
</BinaryComponents>
<SetupComponents>
<Component UniqueLabel="BridgeService" Version="1.0.0.0">BridgeService.exe</Component>
</SetupComponents>
</ComponentConfig>

View File

@@ -0,0 +1,328 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yaulw.Thread;
namespace Installables.All
{
/// <summary>
/// Calls GenericInstaller in order to perform an install/uninstall
/// * Does so in a threaded fashion *
/// </summary>
public class GenericInstall
{
// Let the Caller know that a) the thread Completed b) it did so successfully
public static bool s_PerformInstallCompleted = false;
public static bool s_PerformInstallCompletedSuccessfully = false;
// Let the Caller know that a) the thread Completed b) it did so successfully
public static bool s_PerformUninstallCompleted = false;
public static bool s_PerformUninstallCompletedSuccessfully = false;
// Private ComponentMgmtObjects
private static GenericInstaller<Component_Binary_Manager> s_binaryInstaller = null;
private static GenericInstaller<Component_Setup_Manager> s_setupInstaller = null;
private static SetupEvents s_SetupEvents = new SetupEvents();
/// <summary>
/// Perform a Threaded Install
/// </summary>
public static void PerformInstall()
{
TStarter.ThreadMethod tMethod = delegate()
{
s_PerformInstallCompleted = false;
s_PerformInstallCompletedSuccessfully = false;
bool bBinaryInstallNeeded = false;
bool bSetupInstallNeeded = false;
// # Let's see if we need to update/install Binary Components
if(s_binaryInstaller == null)
s_binaryInstaller = new GenericInstaller<Component_Binary_Manager>();
bBinaryInstallNeeded = s_binaryInstaller.IsInstallNeeded(ref s_SetupEvents);
// # Let's see if we need to update/install Setup Components
if(s_setupInstaller == null)
s_setupInstaller = new GenericInstaller<Component_Setup_Manager>();
bSetupInstallNeeded = s_setupInstaller.IsInstallNeeded(ref s_SetupEvents);
// # Let's Install, Baby...
if (bBinaryInstallNeeded || bSetupInstallNeeded)
{
// # Trigger Start Install Event
s_SetupEvents.Raise_Before_Install_Event();
bool bBinarySuccess = true;
bool bSetupbSuccess = true;
// update/install Binary Components
if (bBinaryInstallNeeded)
bBinarySuccess = s_binaryInstaller.Install();
// update/install Setup Components
if (bSetupInstallNeeded)
bSetupbSuccess = s_setupInstaller.Install();
// # Trigger End Install Event
if (bBinaryInstallNeeded || bSetupInstallNeeded)
s_SetupEvents.Raise_After_Install_Event();
// # We fail if one of them fails
s_PerformInstallCompletedSuccessfully = bBinarySuccess && bSetupbSuccess;
}
// # Let External Callers know that this Thread Completed
s_PerformInstallCompleted = true;
};
TStarter.StartThread(tMethod, "PerformInstall", System.Threading.ApartmentState.MTA, false, System.Threading.ThreadPriority.Normal);
}
/// <summary>
/// Perform a Threaded Uninstall
/// </summary>
public static void PerformUninstall(string ComponentsSeperatedbySemiColonOrBlankForAll)
{
s_PerformUninstallCompleted = false;
s_PerformUninstallCompletedSuccessfully = false;
}
/// <summary>
/// Call this function to let every object know that either PerformInstall or PerformUninstall was called,
/// the Gui then may have made some other modifications, and we are now completed
/// </summary>
public static void SetupMainCompleted()
{
// Notify all components that Setup is now complete
s_SetupEvents.Raise_Ending_Setup_Event();
// # Imp! - We must call dispose on our Setup Objects
if (s_binaryInstaller != null)
{
s_binaryInstaller.Dispose();
s_binaryInstaller = null;
}
if (s_setupInstaller != null)
{
s_setupInstaller.Dispose();
s_setupInstaller = null;
}
}
}
/// <summary>
/// Generic Install Class used for IManageComponents
/// </summary>
/// <typeparam name="T">IManageComponents responsible for Installing</typeparam>
public class GenericInstaller<T> : IDisposable where T : IManageComponents, IDisposable, new()
{
#region Private Members
private T _ComponentMGR = default(T);
private IInstallComponent[] _ComponentsToPerformWorkOn = null;
private bool _disposed = false;
#endregion
#region Construction
/// <summary>
/// Construct the T Object
/// </summary>
public GenericInstaller()
{
_ComponentMGR = new T();
}
/// <summary>
/// Finalizer
/// </summary>
~GenericInstaller()
{
Dispose(true);
}
#endregion
#region Public Methods
/// <summary>
///
/// </summary>
/// <param name="setupEventObj"></param>
/// <returns></returns>
public bool IsInstallNeeded(ref SetupEvents setupEventObj)
{
if (_ComponentMGR.AreNewerComponentsAvailable())
{
Common.Log.Info(String.Format("Newer Components available for Type {0}.", _ComponentMGR.GetType().Name));
_ComponentsToPerformWorkOn = _ComponentMGR.GetNewerComponents(ref setupEventObj);
if (_ComponentsToPerformWorkOn != null && _ComponentsToPerformWorkOn.Length > 0)
{
Common.Log.Info(String.Format("Found {0} Newer Components.", _ComponentsToPerformWorkOn.Length));
return true;
}
}
Common.Log.Info(String.Format("No Newer Components available for Type {0}.", _ComponentMGR.GetType().Name));
return false;
}
/// <summary>
/// Perform Install on the IManageComponents specified when Constructing the GenericInstaller Object
/// </summary>
/// <returns>true if no error occurs, false otherwise</returns>
public bool Install()
{
bool bErrorsOccured = false;
List<ComponentConfig.Component> successfullyInstalledComponents = new List<ComponentConfig.Component>();
if (_ComponentsToPerformWorkOn != null && _ComponentsToPerformWorkOn.Length > 0)
{
// # Start Install
foreach (IInstallComponent installComp in _ComponentsToPerformWorkOn)
{
ComponentConfig.Component component = installComp.GetComponent();
if (installComp.BEFORE_INSTALLING_COMPONENT())
{
Common.Log.Info(String.Format("Installing Component {0} with Version {1}.", component.UniqueLabel, component.Version));
bool bInstallSuccess = installComp.INSTALL_COMPONENT();
bInstallSuccess = bInstallSuccess && installComp.AFTER_INSTALLING_COMPONENT();
if (bInstallSuccess)
{
Common.Log.Info(String.Format("Component {0} with version {1} was correctly installed.", component.UniqueLabel, component.Version));
successfullyInstalledComponents.Add(component);
}
else
{
bErrorsOccured = true;
string msg = String.Format("Component {0} with version {1} was not correctly installed.", component.UniqueLabel, component.Version);
Common.Log.Error(msg);
}
}
}
// # End Install
// Add any installed components to the Installed Configuration
foreach (ComponentConfig.Component component in successfullyInstalledComponents)
_ComponentMGR.GetAllInstalledComponentsW().AddUpdateComponent(component.UniqueLabel, component.Version, component.FileName);
// Write out the installed Configuration
Common.WriteOutChangesToInstalledConfig();
}
Common.Log.Info(String.Format("Exiting Install() for Type {0} with bErrorsOccured set to = {1}", _ComponentMGR.GetType().Name, bErrorsOccured));
return !bErrorsOccured;
}
/// <summary>
///
/// </summary>
/// <param name="setupEventObj"></param>
/// <returns></returns>
public bool IsUninstallNeeded(ref SetupEvents setupEventObj, string ComponentsSeperatedbySemiColonOrBlankForAll)
{
if(_ComponentMGR.GetAllInstalledComponents() != null)
{
Common.Log.Info(String.Format("Installed Components available for Type {0}.", _ComponentMGR.GetType().Name));
_ComponentsToPerformWorkOn = _ComponentMGR.GetAllInstalledComponents(ComponentsSeperatedbySemiColonOrBlankForAll, ref setupEventObj);
if (_ComponentsToPerformWorkOn != null && _ComponentsToPerformWorkOn.Length > 0)
{
Common.Log.Info(String.Format("Found {0} Components to Uninstall.", _ComponentsToPerformWorkOn.Length));
return true;
}
}
Common.Log.Info(String.Format("No Installed Components to Uninstall for Type {0}.", _ComponentMGR.GetType().Name));
return false;
}
/// <summary>
/// Perform Uninstall on the IManageComponents specified when Constructing the GenericInstaller Object
/// </summary>
/// <param name="ComponentsSeperatedbySemiColonOrBlankForAll">coma-seperated Unique Labels of components to uninstall, blank for all</param>
/// <returns>true if no error occurs, false otherwise</returns>
public bool Uninstall(ref SetupEvents setupEventObj, string ComponentsSeperatedbySemiColonOrBlankForAll)
{
bool bErrorsOccured = false;
List<ComponentConfig.Component> successfullyUninstalledComponents = new List<ComponentConfig.Component>();
if (_ComponentsToPerformWorkOn != null && _ComponentsToPerformWorkOn.Length > 0)
{
// # Start Uninstall
foreach (IInstallComponent uninstallComp in _ComponentsToPerformWorkOn)
{
if (!uninstallComp.SUPPORTS_UNINSTALL()) // Not all components support uninstall * although they should, we should allow for this contigency
continue;
ComponentConfig.Component component = uninstallComp.GetComponent();
if (uninstallComp.BEFORE_UNINSTALLING_COMPONENT())
{
Common.Log.Info(String.Format("About to Uninstall Component {0} with Version {1}.", component.UniqueLabel, component.Version));
bool bUninstallSuccess = uninstallComp.UNINSTALL_COMPONENT();
if (!bUninstallSuccess)
bErrorsOccured = true;
bUninstallSuccess = bUninstallSuccess && uninstallComp.AFTER_UNINSTALLING_COMPONENT();
if (bUninstallSuccess)
{
Common.Log.Info(String.Format("Component {0} with version {1} was uninstalled.", component.UniqueLabel, component.Version));
successfullyUninstalledComponents.Add(component);
}
else
{
string msg = String.Format("Component {0} with version {1} was not uninstalled.", component.UniqueLabel, component.Version);
Common.Log.Error(msg);
}
}
}
// # End Uninstall
// Remove any uninstalled components from the Installed Configuration
foreach (ComponentConfig.Component component in successfullyUninstalledComponents)
_ComponentMGR.GetAllInstalledComponentsW().RemoveComponent(component.UniqueLabel);
// Write out the installed Configuration
Common.WriteOutChangesToInstalledConfig();
}
Common.Log.Info(String.Format("Exiting Uninstall() for Type {0} with bErrorsOccured set to = {1}", _ComponentMGR.GetType().Name, bErrorsOccured));
return !bErrorsOccured;
}
#endregion
#region IDisposable Members
/// <summary>
/// Dispose of all extracted files
/// </summary>
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer
GC.SuppressFinalize(this);
}
/// <summary>
/// Make sure to call Dispose on the ComponentMGR for it to perform any cleanup
/// </summary>
/// <param name="disposing">if true, dispose ComponentMGR</param>
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_ComponentMGR.Dispose();
_ComponentMGR = default(T);
}
// Indicate that the instance has been disposed.
_disposed = true;
}
}
#endregion
}
}

View File

@@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Installables.All
{
/// <summary>
/// All Components that install themselves must support this interface
/// </summary>
public interface IInstallComponent
{
/// <summary>
/// Get the Corresponding Component for this IInstallComponent
/// </summary>
/// <returns>the component for this IInstallCompoent</returns>
ComponentConfig.Component GetComponent();
/// <summary>
/// Used to determine if the component is needed to install
/// </summary>
/// <returns>true to continue to Install, false otherwise</returns>
bool BEFORE_INSTALLING_COMPONENT();
/// <summary>
/// Used to install a component
/// </summary>
/// <returns>true, if install was successful, false otherwise</returns>
bool INSTALL_COMPONENT();
/// <summary>
/// Used to do any validation after install occured
/// </summary>
/// <returns>true, if validation was successful, false otherwise</returns>
bool AFTER_INSTALLING_COMPONENT();
/// <summary>
/// Used to determine if the component supports uninstalling
/// </summary>
/// <returns>true, if component supports uninstalling, false otherwise</returns>
bool SUPPORTS_UNINSTALL();
/// <summary>
/// Used to determine if the component is needed to uninstall
/// </summary>
/// <returns>true to continue to uninstall, false otherwise</returns>
bool BEFORE_UNINSTALLING_COMPONENT();
/// <summary>
/// Used to uninstall a component
/// </summary>
/// <returns>true, if uninstall was successful, false otherwise</returns>
bool UNINSTALL_COMPONENT();
/// <summary>
/// Used to do any validation after uninstall occured
/// </summary>
/// <returns>true, if validation was successful, false otherwise</returns>
bool AFTER_UNINSTALLING_COMPONENT();
}
}

View File

@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Installables.All
{
/// <summary>
/// Used by the Binary and Setup Component Manager,
/// could possible be reused later for a new Component Manager
/// </summary>
public interface IManageComponents
{
/// <summary>
/// Quick Check to see if newer Components are available
/// </summary>
/// <returns>true, if newer components are available, false otherwise</returns>
bool AreNewerComponentsAvailable();
/// <summary>
/// Retrieves the list of newer components that need to be installed
/// </summary>
/// <param name="setupEventObj">Setup Event Object is passed, for component manager to pass down to it's components</param>
/// <returns>a list of newer components to install, null otherwise</returns>
IInstallComponent[] GetNewerComponents(ref SetupEvents setupEventObj);
/// <summary>
/// Retrieves the list of all installed components, in order to uninstall
/// </summary>
/// <param name="ComponentsSeperatedbySemiColonOrBlankForAll">Specify Component Filter</param>
/// <param name="setupEventObj">Setup Event Object is passed, for component manager to pass down to it's components</param>
/// <returns>a list of all installed components, null otherwise</returns>
IInstallComponent[] GetAllInstalledComponents(string ComponentsSeperatedbySemiColonOrBlankForAll, ref SetupEvents setupEventObj);
/// <summary>
/// Retrieves the list of all installed components
/// </summary>
/// <returns>a list of all installed components, null otherwise</returns>
ComponentConfig.Component[] GetAllInstalledComponents();
/// <summary>
/// Retrieves the list of all installed componentsW
/// </summary>
/// <returns>a list of all installed componentsW, null otherwise</returns>
ComponentConfig.ComponentW GetAllInstalledComponentsW();
/// <summary>
/// Retrieves the list of all Embedded components
/// </summary>
/// <returns>a list of all embedded components, null otherwise</returns>
ComponentConfig.Component[] GetAllEmbeddedComponents();
}
}

View File

@@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Installables.All
{
/// <summary>
/// Class is passed into ISetup ComponentLoaded() giving each component
/// a chance to subscribe to it
/// </summary>
public class SetupEvents
{
#region Events
/// <summary>
/// Delegate used to handle Setup Events
/// </summary>
public delegate void SetupEvent();
/// <summary>
/// Called after the entire Setup Application ends
/// </summary>
public event SetupEvent Ending_Setup;
/// <summary>
/// Called before the entire Install Process Begins
/// </summary>
public event SetupEvent Before_Install;
/// <summary>
/// Called after the entire Install Process ends
/// </summary>
public event SetupEvent After_Install;
/// <summary>
/// Called before the entire Uninstall Process Begins
/// </summary>
public event SetupEvent Before_Uninstall;
/// <summary>
/// Called after the entire Uninstall Process ends
/// </summary>
public event SetupEvent After_Uninstall;
#endregion
# region Event Raisers
/// <summary>
/// Raise the Ending Setup Event
/// </summary>
public void Raise_Ending_Setup_Event()
{
if (Ending_Setup != null)
Ending_Setup();
}
/// <summary>
/// Raise the Before Install Event
/// </summary>
public void Raise_Before_Install_Event()
{
if (Before_Install != null)
Before_Install();
}
/// <summary>
/// Raise the After Install Event
/// </summary>
public void Raise_After_Install_Event()
{
if (After_Install != null)
After_Install();
}
/// <summary>
/// Raise the Before Uninstall Event
/// </summary>
public void Raise_Before_Uninstall_Event()
{
if (Before_Uninstall != null)
Before_Uninstall();
}
/// <summary>
/// Raise the After Uninstall Event
/// </summary>
public void Raise_After_Uninstall_Event()
{
if (After_Uninstall != null)
After_Uninstall();
}
#endregion
}
/// <summary>
/// All Components that install themselves will implement this interface, if they are interested to
/// listen to / Handle Setup Events
/// </summary>
public interface ISetup
{
/// <summary>
/// Called when the Component is loaded. Components are only loaded
/// when an Install on them is iminent. The component has a chance to
/// listen to/handle events in the setup process.
/// </summary>
void ComponentLoaded(ref SetupEvents subscribeToDesiredEvents);
}
}

View File

@@ -0,0 +1,115 @@
<?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>{94CB1BBA-5CF1-4155-827E-1527032D3921}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Installables.All</RootNamespace>
<AssemblyName>Installables.All</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<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>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\Target\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\Target\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Yaulw, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\MSLMobile\Components\Yaulw.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Common.cs" />
<Compile Include="Common_MediLytec.cs" />
<Compile Include="ComponentConfig.cs" />
<Compile Include="Component_Binary_Manager.cs" />
<Compile Include="Component_Setup_Manager.cs" />
<Compile Include="GenericInstaller.cs" />
<Compile Include="IInstallComponent.cs" />
<Compile Include="IManageComponents.cs" />
<Compile Include="ISetup.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="EmbeddedComponentConfig.xml" />
</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,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishUrlHistory />
<InstallUrlHistory />
<SupportUrlHistory />
<UpdateUrlHistory />
<BootstrapperUrlHistory />
<ErrorReportUrlHistory />
<FallbackCulture>en-US</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,36 @@
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("Components")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Components")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
[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("ae8a648a-90cf-48ce-9b71-6e6b4cc417aa")]
// 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:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,5 @@
C:\Users\Administrator\Projects\Pluto\Server\Target\Debug\Installables.All.dll
C:\Users\Administrator\Projects\Pluto\Server\Target\Debug\Installables.All.pdb
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.All\obj\Debug\ResolveAssemblyReference.cache
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.All\obj\Debug\Installables.All.dll
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.All\obj\Debug\Installables.All.pdb

View File

@@ -0,0 +1,5 @@
C:\Users\Administrator\Projects\Pluto\Server\Target\Release\Installables.All.dll
C:\Users\Administrator\Projects\Pluto\Server\Target\Release\Installables.All.pdb
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.All\obj\Release\ResolveAssemblyReference.cache
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.All\obj\Release\Installables.All.dll
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.All\obj\Release\Installables.All.pdb

View File

@@ -0,0 +1,254 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Installables.All;
using Microsoft.Win32;
using Yaulw.Assembly;
using System.IO;
using Yaulw.Xml;
namespace Installables.Setup.PlutoServerMSLService
{
public class InstallComponent : IInstallComponent , ISetup
{
#region Private Helpers
public const string BRIDGE_SERVICE_TITLE = Common_MediLytec.MediLytecPoundDef.BRIDGE_SERVICE_TITLE;
public const string BRIDGE_SERVICE_ASSEMBLY = Common_MediLytec.MediLytecPoundDef.BRIDGE_SERVICE_ASSEMBLY;
public const string BRIDGE_SERVICE_NAME = Common_MediLytec.MediLytecPoundDef.BRIDGE_SERVICE_NAME;
/// <summary>
/// Write Service Configuration to the ImagePath for the Service
/// </summary>
/// <returns></returns>
public static bool WriteServiceConfigurationToServiceInRegistry(InstallConfig config)
{
try
{
using (RegistryKey service = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\services\\" + BRIDGE_SERVICE_TITLE, true))
{
// # Determine Image Path Parameter
string ImagePathParameter = "";
switch (config)
{
case InstallConfig.LytecMD:
ImagePathParameter = " /Lytec";
break;
case InstallConfig.MedisoftClinical:
ImagePathParameter = " /Medisoft";
break;
}
// # Set Image Path Parameter
string serviceAssembly = "\"" + AssemblyW.SpecializedAssemblyInfo.GetAssemblyPath(AssemblyW.AssemblyST.Executing) + "\\" + BRIDGE_SERVICE_ASSEMBLY + "\"";
service.SetValue("ImagePath", serviceAssembly + ImagePathParameter);
return true;
}
}
catch (Exception) { /* ignore */ }
return false;
}
#endregion
#region IInstallComponent Members
public ComponentConfig.Component GetComponent()
{
return Common.EmbeddedConfig.SetupComponents.GetComponent("BridgeService");
}
public bool BEFORE_INSTALLING_COMPONENT()
{
// Stop Service BRIDGE_SERVICE_NAME
if (!Common.StopService(BRIDGE_SERVICE_NAME))
{
Common.Log.Error(String.Format("Couldn't stop the {0} Service.", BRIDGE_SERVICE_NAME));
return false;
}
// Read the Service Configuration from the Registry
InstallConfig config = Common_MediLytec.RetrieveInstallConfigFromRegistry();
if (config == InstallConfig.LytecMD)
{
bool bSuccess = false;
string result = Common.RunCmdLine("netsh firewall set portopening tcp 5000 BridgeService_LytecBridgeIn ENABLE ALL");
bSuccess = result.Contains("successfully") || result.Contains("Ok.") || result.Contains("The service has not been started");
if (bSuccess)
{
result = Common.RunCmdLine("netsh firewall set portopening tcp 5001 BridgeService_LytecMirthOut ENABLE ALL");
bSuccess = result.Contains("successfully") || result.Contains("Ok.") || result.Contains("The service has not been started");
}
if (bSuccess)
{
return true;
}
else
{
Common.Log.Error(String.Format("Opening up ports for Lytec '{0}' failed", BRIDGE_SERVICE_NAME));
return false;
}
}
else if (config == InstallConfig.MedisoftClinical)
{
bool bSuccess = false;
string result = Common.RunCmdLine("netsh firewall set portopening tcp 7000 BridgeService_MedisoftBridgeIn ENABLE ALL");
bSuccess = result.Contains("successfully") || result.Contains("Ok.") || result.Contains("The service has not been started");
if (bSuccess)
{
result = Common.RunCmdLine("netsh firewall set portopening tcp 7001 BridgeService_MedisoftMirthOut ENABLE ALL");
bSuccess = result.Contains("successfully") || result.Contains("Ok.") || result.Contains("The service has not been started");
}
if (bSuccess)
{
return true;
}
else
{
Common.Log.Error(String.Format("Opening up ports for Medisoft '{0}' failed", BRIDGE_SERVICE_NAME));
return false;
}
}
return true;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public bool INSTALL_COMPONENT()
{
// Uninstall Bridge Service, if it exists, and re-install
if (Common.ServiceExists(BRIDGE_SERVICE_NAME))
UNINSTALL_COMPONENT();
string installUtil = Common.GetNetFrameworkUtilFileNameNPathFile("installutil.exe");
string serviceAssembly = AssemblyW.SpecializedAssemblyInfo.GetAssemblyPath(AssemblyW.AssemblyST.Entry) + "\\" + BRIDGE_SERVICE_ASSEMBLY;
if (!String.IsNullOrEmpty(installUtil))
{
Common.StopService(BRIDGE_SERVICE_NAME);
string result = Common.RunCmdLine(installUtil + " \"" + serviceAssembly + "\"");
bool bSuccess = !result.Contains("failed");
if (bSuccess)
{
// Write the Service Configuration to the Registry
InstallConfig config = Common_MediLytec.RetrieveInstallConfigFromRegistry();
bSuccess = WriteServiceConfigurationToServiceInRegistry(config);
}
if (!bSuccess)
{
Common.Log.Error(String.Format("Errors Occured installing {0}.", BRIDGE_SERVICE_NAME));
}
return bSuccess;
}
return false;
}
public bool AFTER_INSTALLING_COMPONENT()
{
// Make sure service exists
if (!Common.ServiceExists(BRIDGE_SERVICE_NAME))
{
Common.Log.Error(String.Format("Service {0} does Not Exist. Install Failed", BRIDGE_SERVICE_NAME));
return false;
}
// Make sure Service is stopped
Common.StopService(BRIDGE_SERVICE_NAME);
return true;
}
public bool SUPPORTS_UNINSTALL()
{
return false;
}
public bool BEFORE_UNINSTALLING_COMPONENT()
{
// Stop Service BRIDGE_SERVICE_NAME
if (!Common.StopService(BRIDGE_SERVICE_NAME))
{
Common.Log.Error(String.Format("Couldn't stop the {0} Service.", BRIDGE_SERVICE_NAME));
return false;
}
return true;
}
public bool UNINSTALL_COMPONENT()
{
if (Common.ServiceExists(BRIDGE_SERVICE_NAME))
{
Common.StopService(BRIDGE_SERVICE_NAME);
string installUtil = Common.GetNetFrameworkUtilFileNameNPathFile("installutil.exe");
string serviceAssembly = AssemblyW.SpecializedAssemblyInfo.GetAssemblyPath(AssemblyW.AssemblyST.Entry) + "\\" + BRIDGE_SERVICE_ASSEMBLY;
if (!String.IsNullOrEmpty(installUtil))
{
string result = Common.RunCmdLine(installUtil + " /u \"" + serviceAssembly + "\"");
bool bSuccess = !result.Contains("failed");
if(!bSuccess)
Common.Log.Error(String.Format("Errors Occured uninstalling {0}.", BRIDGE_SERVICE_NAME));
return bSuccess;
}
}
return false;
}
public bool AFTER_UNINSTALLING_COMPONENT()
{
if (Common.ServiceExists(BRIDGE_SERVICE_NAME))
{
Common.Log.Error(String.Format("Service {0} Still Exists. Uninstall Failed", BRIDGE_SERVICE_NAME));
return false;
}
return true;
}
#endregion
#region ISetup Members
public void ComponentLoaded(ref SetupEvents subscribeToDesiredEvents)
{
subscribeToDesiredEvents.Before_Install += new SetupEvents.SetupEvent(subscribeToDesiredEvents_Before_Install);
subscribeToDesiredEvents.After_Install += new SetupEvents.SetupEvent(subscribeToDesiredEvents_After_Install);
subscribeToDesiredEvents.Ending_Setup += new SetupEvents.SetupEvent(subscribeToDesiredEvents_Ending_Setup);
}
void subscribeToDesiredEvents_Ending_Setup()
{
if (Common.ServiceExists(BRIDGE_SERVICE_NAME))
{
string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\McKesson\\Bridge\\BridgeConfig.xml";
if (File.Exists(path))
{
XSerializer serialize = new XSerializer();
// * Go over this *
//XMLConfig config = serialize.ReadFromFile<XMLConfig>(path);
//if (config != null)
//{
// // Read the Service Configuration from the Registry
// InstallConfig sconfig = Common_MediLytec.RetrieveInstallConfigFromRegistry();
// if (sconfig == InstallConfig.LytecMD && !String.IsNullOrEmpty(config.DefaultMapping.Lytec))
// Common.StartService(BRIDGE_SERVICE_NAME);
// else if(sconfig == InstallConfig.MedisoftClinical && !String.IsNullOrEmpty(config.DefaultMapping.Medisoft))
// Common.StartService(BRIDGE_SERVICE_NAME);
//}
}
}
}
void subscribeToDesiredEvents_Before_Install()
{
}
void subscribeToDesiredEvents_After_Install()
{
}
#endregion
}
}

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>{F1203E2C-B58B-49A6-9B6E-6F89949A06C5}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Installables.Setup.PlutoServerMSLService</RootNamespace>
<AssemblyName>Installables.Setup.PlutoServerMSLService</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<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>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\Target\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\Target\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Yaulw, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\MSLMobile\Components\Yaulw.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="InstallComponent.cs" />
<Compile Include="Properties\AssemblyInfo.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,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishUrlHistory />
<InstallUrlHistory />
<SupportUrlHistory />
<UpdateUrlHistory />
<BootstrapperUrlHistory />
<ErrorReportUrlHistory />
<FallbackCulture>en-US</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,36 @@
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("Component.Setup.BridgeService")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Component.Setup.BridgeService")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
[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("53b1ed79-4f04-4cf5-a80f-8d56da25dbfb")]
// 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:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,5 @@
C:\Users\Administrator\Projects\Pluto\Server\Target\Debug\Installables.Setup.PlutoServerMSLService.dll
C:\Users\Administrator\Projects\Pluto\Server\Target\Debug\Installables.Setup.PlutoServerMSLService.pdb
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.Setup.PlutoServerMSLService\obj\Debug\ResolveAssemblyReference.cache
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.Setup.PlutoServerMSLService\obj\Debug\Installables.Setup.PlutoServerMSLService.dll
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.Setup.PlutoServerMSLService\obj\Debug\Installables.Setup.PlutoServerMSLService.pdb

View File

@@ -0,0 +1,5 @@
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.Setup.PlutoServerMSLService\obj\Release\ResolveAssemblyReference.cache
C:\Users\Administrator\Projects\Pluto\Server\Target\Release\Installables.Setup.PlutoServerMSLService.dll
C:\Users\Administrator\Projects\Pluto\Server\Target\Release\Installables.Setup.PlutoServerMSLService.pdb
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.Setup.PlutoServerMSLService\obj\Release\Installables.Setup.PlutoServerMSLService.dll
C:\Users\Administrator\Projects\Pluto\Server\Installables\Installables.Setup.PlutoServerMSLService\obj\Release\Installables.Setup.PlutoServerMSLService.pdb

View File

@@ -0,0 +1,67 @@
<?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>{F82EFD0B-EB57-41E0-8E80-2BB0848FE84C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MSLConnect</RootNamespace>
<AssemblyName>MSLConnect</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Target\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Target\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Yaulw, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\3rdParty\Sdaleo\Yaulw.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="MSMobileConnect.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Pluto.MSL.Api\Pluto.MSL.Api.csproj">
<Project>{B794609D-A93E-41E3-9291-84FC73412347}</Project>
<Name>Pluto.MSL.Api</Name>
<Private>True</Private>
</ProjectReference>
</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,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ShowAllFiles</ProjectView>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,396 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.NetworkInformation;
using Pluto.MSL.Api;
using System.IO;
using Yaulw.Assembly;
namespace MSLConnect
{
[ComVisible(true), Guid("3F04286D-86CF-4C30-85E2-9FF7C0DA9DEB")]
public interface IMSLMobileConnect
{
bool MobileAboutDialog_GotCalled(string SharedConnectionDataSource, string RegisteredName, string PracticeName, string DataBaseNameOrDataSetName, out string UserApiKey, out string UserPin);
bool ProductSetupCompleted_PriorUserLogin(string SharedConnectionDataSource, string RegisteredName);
bool PracticeName_ChangeOccured(string SharedConnectionDataSource, string NewPracticeName, string DataBaseNameOrDataSetName);
bool IsServerReachableFromTheInternet(string SharedConnectionDataSource);
string CheckConnectivity(string SharedConnectionDataSource, string RegisteredName, string PracticeName, string DataBaseNameOrDataSetName);
}
[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
[Guid("803E5D8F-FD6D-4CC8-9DD7-0A2322C565AE")]
public class MSLMobileConnect : IMSLMobileConnect
{
// Hard-coded in * Internal channel always uses this port
internal const int INTERNAL_CHANNEL_PORT = 1945;
// Use this host to check, if we are on the McKesson Network
internal const string MCK_HOST_TO_CHECK_ON_MCK_NETWORK = "ndh1fs01.mckesson.com";
#region Logging
/// <summary>
/// FileWriter Object
/// </summary>
//private Yaulw.File.LoggerQuick _log = null;
/// <summary>
/// Is this DLL running on McKesson Network
/// </summary>
private bool IsRunningOnMcKessonNetwork = false;
private bool DidWeCheckForMcKessonNetwork = false;
/// <summary>
/// Setup the logger upon HasConnectivity Calls, this way it won't be done in the constructor
/// with Medisoft stuff, you just never know
/// </summary>
//private void SetupLoggingIfNotSetup()
//{
// if (!DidWeCheckForMcKessonNetwork)
// {
// IsRunningOnMcKessonNetwork = Yaulw.Net.IPHostHelper.CanResolveHost(MCK_HOST_TO_CHECK_ON_MCK_NETWORK,true);
// DidWeCheckForMcKessonNetwork = true;
// }
// if (_log == null)
// {
// string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\MSLConnect\\";
// _log = new Yaulw.File.LoggerQuick("MSLConnect", IsRunningOnMcKessonNetwork, path);
// }
//}
#endregion
#region Constructor
/// <summary>
/// Construct the beautiful
/// </summary>
public MSLMobileConnect()
{
}
#endregion
#region Connectivity
/// <summary>
/// Check to make sure we can communicate with the Mobile Service.
/// Check the Server's ip & port for connectivity as well as that this
/// computer has connectivity.
/// This way we won't throw any connectivity errors, which is good.
/// </summary>
/// <param name="SharedConnectionDataSource"></param>
/// <remarks>In order for this call to work port INTERNAL_CHANNEL_PORT outgoing must be open,
/// Medisoft, Lytec unified Installer will be responsible for making sure Lytec.exe and MAPA.exe
/// can open up port INTERNAL_CHANNEL_PORT by adding an exception to the windows firewall
/// netsh firewall add allowedprogram \"[Path]\[Program.exe]\" \"[Name]\" ENABLE ALL
/// </remarks>
/// <returns></returns>
private bool HasConnectivity(string SharedConnectionDataSource)
{
//SetupLoggingIfNotSetup();
//_log.Info("HasConnectivity called");
//_log.Debug("With the following SharedConnectionString {0}", SharedConnectionDataSource);
// Retrieve the IP from the DataSource and set it in the API
string host = Yaulw.Net.IPHostHelper.GetServerNameFromAConnectionString(SharedConnectionDataSource);
IPAddress ip = Yaulw.Net.IPHostHelper.GetIpForHost(host);
//_log.Info("Determined the following Host:{0} and IP:{1}", host, ip.ToString());
// Test if we can connect
bool bCanConnect = Yaulw.Net.IPHostHelper.HasConnectivity(SharedConnectionDataSource, INTERNAL_CHANNEL_PORT);
if (bCanConnect)
{
API.SetNetworkSettings(ip.ToString(), INTERNAL_CHANNEL_PORT);
//_log.Info("Network Connectivity to Pluto.MSL Service was established on IP:{0} and Internal Port:{1}", ip, INTERNAL_CHANNEL_PORT);
}
else
{
//_log.Error("Network Connectivity to Pluto.MSL Service could not be established to IP:{0} and Internal Port:{1} HasConnection={2}", ip, INTERNAL_CHANNEL_PORT, Yaulw.Net.IPHostHelper.HasConnection());
}
return bCanConnect;
}
#endregion
#region IMSLMobileConnect
/// <summary>
/// Called by Lytec/Medisoft when the mobile About Dialog is called to retrieve the UserApiKey and Pin
/// </summary>
/// <param name="SharedConnectionDataSource"></param>
/// <param name="PracticeName"></param>
/// <param name="UserApiKey"></param>
/// <param name="UserPin"></param>
/// <returns></returns>
public bool MobileAboutDialog_GotCalled(string SharedConnectionDataSource, string RegisteredName, string PracticeName,string DataBaseNameOrDataSetName, out string UserApiKey, out string UserPin)
{
/* Ensure no nulls */
if(SharedConnectionDataSource == null)
SharedConnectionDataSource = String.Empty;
if(RegisteredName == null)
RegisteredName = String.Empty;
if(PracticeName == null)
PracticeName = String.Empty;
if (DataBaseNameOrDataSetName == null)
DataBaseNameOrDataSetName = String.Empty;
//SetupLoggingIfNotSetup();
//_log.Info("MobileAboutDialog_GotCalled Called");
//_log.Debug("With the following SharedConnectionDataSource:{0},RegisteredName:{1},PracticeName:{2},DataBaseOrDataSetName:{3}", SharedConnectionDataSource, RegisteredName, PracticeName, DataBaseNameOrDataSetName);
UserApiKey = String.Empty;
UserPin = String.Empty;
try
{
if (HasConnectivity(SharedConnectionDataSource))
{
bool bSuccess = API.MobileAboutDialog_GotCalled(SharedConnectionDataSource, RegisteredName, PracticeName, DataBaseNameOrDataSetName, out UserApiKey, out UserPin);
//if(bSuccess)
//_log.Info("MobileAboutDialog_GotCalled returns true");
//else
//_log.Info("MobileAboutDialog_GotCalled returns false");
return bSuccess;
}
}
catch (Exception e)
{
//_log.Error("Exception Thrown {0}", e.Message);
}
//_log.Info("MobileAboutDialog_GotCalled returns false");
return false;
}
/// <summary>
/// Called by Lytec/Medisoft once product setup is complete (product is registered and
/// connected to a database), but before the user logs in. This will setup the Mobile service
/// on the server.
/// </summary>
/// <param name="SharedConnectionDataSource"></param>
/// <param name="RegisteredName"></param>
/// <returns></returns>
public bool ProductSetupCompleted_PriorUserLogin(string SharedConnectionDataSource, string RegisteredName)
{
/* Ensure no nulls */
if (SharedConnectionDataSource == null)
SharedConnectionDataSource = String.Empty;
if (RegisteredName == null)
RegisteredName = String.Empty;
//SetupLoggingIfNotSetup();
//_log.Info("ProductSetupCompleted_PriorUserLogin Called");
//_log.Debug("With the following SharedConnectionDataSource:{0},RegisteredName:{1}", SharedConnectionDataSource, RegisteredName);
try
{
if (HasConnectivity(SharedConnectionDataSource))
{
bool bSuccess = API.ProductSetupCompleted_PriorUserLogin(SharedConnectionDataSource, RegisteredName);
if (bSuccess)
// _log.Info("ProductSetupCompleted_PriorUserLogin returns true");
//else
// _log.Info("ProductSetupCompleted_PriorUserLogin returns false");
return bSuccess;
}
}
catch (Exception e)
{
//_log.Error("Exception Thrown {0}", e.Message);
}
// _log.Info("ProductSetupCompleted_PriorUserLogin returns false");
return false;
}
/// <summary>
/// Called by Lytec/Medisoft after a Practice Name Change occurred on their end to let
/// the Mobile solution know and update it's information
/// </summary>
/// <param name="SharedConnectionDataSource"></param>
/// <param name="NewPracticeName"></param>
/// <returns></returns>
public bool PracticeName_ChangeOccured(string SharedConnectionDataSource, string NewPracticeName, string DataBaseNameOrDataSetName)
{
/* Ensure no nulls */
if (SharedConnectionDataSource == null)
SharedConnectionDataSource = String.Empty;
if (NewPracticeName == null)
NewPracticeName = String.Empty;
if (DataBaseNameOrDataSetName == null)
DataBaseNameOrDataSetName = String.Empty;
//SetupLoggingIfNotSetup();
//_log.Info("PracticeName_ChangeOccured Called");
//_log.Debug("With the following SharedConnectionDataSource:{0},NewPracticeName:{1},DataBaseOrDataSetName:{2}", SharedConnectionDataSource, NewPracticeName, DataBaseNameOrDataSetName);
try
{
if (HasConnectivity(SharedConnectionDataSource))
{
bool bSuccess = API.PracticeName_ChangeOccured(SharedConnectionDataSource, NewPracticeName, DataBaseNameOrDataSetName);
//if (bSuccess)
// _log.Info("PracticeName_ChangeOccured returns true");
//else
// _log.Info("PracticeName_ChangeOccured returns false");
return bSuccess;
}
}
catch (Exception e)
{
// _log.Error("Exception Thrown {0}", e.Message);
}
//_log.Info("PracticeName_ChangeOccured returns false");
return false;
}
/// <summary>
/// Is the Server Reachable from the internet? if not, show error icon or give message
/// </summary>
/// <param name="SharedConnectionDataSource"></param>
/// <returns></returns>
public bool IsServerReachableFromTheInternet(string SharedConnectionDataSource)
{
/* Ensure no nulls */
if (SharedConnectionDataSource == null)
SharedConnectionDataSource = String.Empty;
//SetupLoggingIfNotSetup();
//_log.Info("IsServerReachableFromTheInternet Called");
//_log.Debug("With the following SharedConnectionDataSource:{0}", SharedConnectionDataSource);
try
{
if (HasConnectivity(SharedConnectionDataSource))
{
bool bSuccess = API.IsServerReachableFromTheInternet(SharedConnectionDataSource);
if (bSuccess)
// _log.Info("IsServerReachableFromTheInternet returns true");
//else
// _log.Info("IsServerReachableFromTheInternet returns false");
return bSuccess;
}
}
catch (Exception e)
{
//_log.Error("Exception Thrown {0}", e.Message);
}
//_log.Info("IsServerReachableFromTheInternet returns false");
return false;
}
/// <summary>
/// Checks for CheckConnectivity
/// </summary>
private enum Checks
{
Skipped,
Passed,
Failed
}
/// <summary>
/// Check Connectivity Function simplifies the above calls by summarizing issues that occur when
/// connecting the Mobile Device
/// </summary>
/// <param name="SharedConnectionDataSource"></param>
/// <param name="RegisteredName"></param>
/// <param name="PracticeName"></param>
/// <returns></returns>
public string CheckConnectivity(string SharedConnectionDataSource, string RegisteredName, string PracticeName, string DataBaseNameOrDataSetName)
{
/* Ensure no nulls */
if (SharedConnectionDataSource == null)
SharedConnectionDataSource = String.Empty;
if (RegisteredName == null)
RegisteredName = String.Empty;
if (PracticeName == null)
PracticeName = String.Empty;
if (DataBaseNameOrDataSetName == null)
DataBaseNameOrDataSetName = String.Empty;
// SetupLoggingIfNotSetup();
// _log.Info("CheckConnectivity Called");
//_log.Debug("With the following SharedConnectionDataSource:{0},RegisteredName:{1},PracticeName:{2},DataBaseOrDataSetName:{3}", SharedConnectionDataSource, RegisteredName, PracticeName, DataBaseNameOrDataSetName);
StringBuilder sb = new StringBuilder();
sb.Append("Checking connectivity to 'Mobile Service': {0}\n");
sb.Append("Checking outgoing connectivity: {1}\n");
sb.Append("Checking incoming connectivity: {2}\n");
// 3 Checks
Checks check1 = Checks.Skipped;
Checks check2 = Checks.Skipped;
Checks check3 = Checks.Skipped;
// Check 1
if (ProductSetupCompleted_PriorUserLogin(SharedConnectionDataSource, RegisteredName))
{
check1 = Checks.Passed;
// Check 2
string strUserApiKey;
string strApiPin;
if (MobileAboutDialog_GotCalled(SharedConnectionDataSource, RegisteredName, PracticeName, DataBaseNameOrDataSetName, out strUserApiKey, out strApiPin))
{
check2 = Checks.Passed;
// Check 3
if (IsServerReachableFromTheInternet(SharedConnectionDataSource))
{
check3 = Checks.Passed;
}
else
{
check3 = Checks.Failed;
}
}
else
{
check2 = Checks.Failed;
}
// * Newly Added * Once Check 1 passes we know we can connect to the service,
// so might as well try to update the service, if needed, to make sure they are running the latest
// however let's do it here, at the end, after performing all of our checks
// ~Let's not do this, let them try to connect with their device (this was/is either too clever or
// too silly) after re-consideration, i think it is best to skip
//UpdateServiceIfNeeded(SharedConnectionDataSource);
}
else
{
check1 = Checks.Failed;
}
string retVal = String.Format(sb.ToString(), check1.ToString(), check2.ToString(), check3.ToString());
//_log.Info("CheckConnectivity returns string:{0}", retVal);
return retVal;
}
#endregion
#region Pluto AddOns
/// <summary>
/// Try to Update the Service, if needed
/// </summary>
/// <param name="SharedConnectionDataSource"></param>
/// <returns></returns>
public void UpdateServiceIfNeeded(string SharedConnectionDataSource)
{
//SetupLoggingIfNotSetup();
//_log.Info("UpdateServiceIfNeeded");
//_log.Debug("With the following SharedConnectionDataSource:{0}", SharedConnectionDataSource);
try
{
if (HasConnectivity(SharedConnectionDataSource))
API.UpdateServiceIfNeeded();
}
catch (Exception e)
{
//_log.Error("Exception Thrown {0}", e.Message);
}
}
#endregion
}
}

View File

@@ -0,0 +1,36 @@
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("MSLConnect")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MSLConnect")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[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("43b6c998-0d09-4808-b203-c3ddcd43dfce")]
// 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:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,8 @@
<Application x:Class="MSLMobile.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="HiddenMainWindow.xaml" Startup="Application_Startup" Exit="Application_Exit">
<Application.Resources>
</Application.Resources>
</Application>

View File

@@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
//using Installables.All;
//using Yaulw.Other;
using System.IO;
using System.Reflection;
namespace MSLMobile
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
/// <summary>
/// Main Application Object
/// </summary>
public App()
{
// Make sure all embedded Assemblies get loaded
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
#region Application Startup N' Exit
/// <summary>
/// Application_Startup
/// </summary>
private void Application_Startup(object sender, StartupEventArgs e)
{
}
/// <summary>
/// Application_Exit
/// </summary>
private void Application_Exit(object sender, ExitEventArgs e)
{
}
#endregion
#region Unhandled Expections! IMP - Show WinForm and Log
/// <summary>
/// * Generic Unhandled Exception Handler *
/// Handles all unhandled Exceptions for the Entire AppDomain.
/// First Show a Window Message Box, so that we can for sure capture the message
/// Second Log it
/// </summary>
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Exception ex = (Exception)e.ExceptionObject;
// Exeption to capture error information
string exceptionMessage = "Setup will exit.\n";
exceptionMessage += ex.Message + "\n\n";
if (!String.IsNullOrEmpty(ex.StackTrace))
exceptionMessage += ex.StackTrace.Substring(0, 880) + "\n\n";
if (!String.IsNullOrEmpty(ex.InnerException.Message))
exceptionMessage += ex.InnerException.Message + "\n\n";
if (!String.IsNullOrEmpty(ex.Source))
exceptionMessage += ex.Source + "\n\n";
// Show Message Box First - Guaranteed to work (Polite Exception Message)
MessageBox.Show(exceptionMessage, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
#endregion
#region Application Multi-File Assembly Handling
/// <summary>
/// A way to embed multiple dlls into one exe:
/// http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx
/// </summary>
/// <returns>a loaded assembly if found, null otherwise</returns>
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
String AssemblyToLookFor = (new AssemblyName(args.Name).Name + ".dll").ToLower();
// Note: due to the nature of click once, we must always
// load the signed assembly not the unsigned
//string[] parts = AssemblyToLookFor.Split('.');
//AssemblyToLookFor = parts[0] + ".signed.dll";
string[] resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();
foreach (string s in resources)
{
if (s.ToLower().EndsWith(AssemblyToLookFor))
{
var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(s);
if (stream != null)
{
using (stream)
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
}
}
}
return null;
}
#endregion
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
<appSettings>
<add key="REGISTRATION_HOST_N_PORT_URL" value="http://ppsmobile.mckesson.com/mobile1/REGURL.htm" />
<add key="REGISTRATION_HOST_URL" value="ppsmobile.mckesson.com" />
<add key="REGISTRATION_CHANNEL_PORT" value="443" />
<add key="CHECK_VERSION_URL" value="http://ppsmobile.mckesson.com/mobile1/PUBLISH.htm" />
<add key="DOWNLOAD_SETUP_URL" value="http://ppsmobile.mckesson.com/mobile1/Setup.exe" />
<add key="DOWNLOAD_MINISETUP_URL" value="http://ppsmobile.mckesson.com/mobile1/SetupMini.exe" />
<add key="DETERMINE_EXTERNAL_IP_ADDRESS_URL" value="http://ppsmobile.mckesson.com/GetIP/default.aspx" />
</appSettings>
</configuration>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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