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,122 @@
namespace RegistrationAPI_Tester
{
partial class ChangeRegServerModalForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.textHost = new System.Windows.Forms.TextBox();
this.lblPort = new System.Windows.Forms.Label();
this.textPort = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// btnOK
//
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(255, 105);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(75, 23);
this.btnOK.TabIndex = 2;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
//
// btnCancel
//
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(58, 105);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 3;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(24, 37);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(27, 13);
this.label1.TabIndex = 2;
this.label1.Text = "host";
//
// textHost
//
this.textHost.Location = new System.Drawing.Point(58, 33);
this.textHost.Name = "textHost";
this.textHost.Size = new System.Drawing.Size(272, 20);
this.textHost.TabIndex = 0;
//
// lblPort
//
this.lblPort.AutoSize = true;
this.lblPort.Location = new System.Drawing.Point(26, 71);
this.lblPort.Name = "lblPort";
this.lblPort.Size = new System.Drawing.Size(25, 13);
this.lblPort.TabIndex = 4;
this.lblPort.Text = "port";
//
// textPort
//
this.textPort.Location = new System.Drawing.Point(58, 68);
this.textPort.Name = "textPort";
this.textPort.Size = new System.Drawing.Size(75, 20);
this.textPort.TabIndex = 1;
this.textPort.Text = "1949";
//
// ChangeRegServerModalForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(361, 150);
this.Controls.Add(this.textPort);
this.Controls.Add(this.lblPort);
this.Controls.Add(this.textHost);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.btnOK);
this.Name = "ChangeRegServerModalForm";
this.Text = "Reg Server Settings";
this.Load += new System.EventHandler(this.ChangeRegServerModalForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textHost;
private System.Windows.Forms.Label lblPort;
private System.Windows.Forms.TextBox textPort;
}
}

View File

@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace RegistrationAPI_Tester
{
public partial class ChangeRegServerModalForm : Form
{
private static string s_url = "services.ndchealthvar.com";
public ChangeRegServerModalForm()
{
InitializeComponent();
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
private void btnOK_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(textHost.Text) ||
String.IsNullOrEmpty(textPort.Text))
{
MessageBox.Show("Host and Port can not be empty");
return;
}
uint nPort = 0;
if (!uint.TryParse(textPort.Text, out nPort) && nPort > 0)
{
MessageBox.Show("Port is invalid");
return;
}
s_url = textHost.Text;
RegistrationAPI.API.SetNetworkSettings(textHost.Text, nPort);
this.DialogResult = DialogResult.OK;
this.Close();
}
private void ChangeRegServerModalForm_Load(object sender, EventArgs e)
{
textHost.Text = s_url;
}
}
}

View File

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

View File

@@ -0,0 +1,489 @@
namespace RegistrationAPI_Tester
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.lblReinstall = new System.Windows.Forms.Label();
this.btnReinstall = new System.Windows.Forms.Button();
this.lblIsOnMckessonNetwork = new System.Windows.Forms.Label();
this.lblUpdate = new System.Windows.Forms.Label();
this.btnUpdateService = new System.Windows.Forms.Button();
this.lblLatestVersion = new System.Windows.Forms.Label();
this.lblServiceVersion = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.label15 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.lblServiceStatus = new System.Windows.Forms.Label();
this.lable3 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.textExternalPort = new System.Windows.Forms.TextBox();
this.label13 = new System.Windows.Forms.Label();
this.textExternalIP = new System.Windows.Forms.TextBox();
this.label12 = new System.Windows.Forms.Label();
this.textInternalIP = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.textHostGUID = new System.Windows.Forms.TextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.textDetectedInternalIP = new System.Windows.Forms.TextBox();
this.label6 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.textDetectedExternalIP = new System.Windows.Forms.TextBox();
this.btnUpdateHost = new System.Windows.Forms.Button();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label();
this.btnIsServerReachable = new System.Windows.Forms.Button();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.btnServiceStartStop = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.lblReinstall);
this.groupBox1.Controls.Add(this.btnReinstall);
this.groupBox1.Controls.Add(this.lblIsOnMckessonNetwork);
this.groupBox1.Controls.Add(this.lblUpdate);
this.groupBox1.Controls.Add(this.btnUpdateService);
this.groupBox1.Controls.Add(this.lblLatestVersion);
this.groupBox1.Controls.Add(this.lblServiceVersion);
this.groupBox1.Controls.Add(this.label9);
this.groupBox1.Controls.Add(this.label8);
this.groupBox1.Controls.Add(this.label15);
this.groupBox1.Controls.Add(this.label11);
this.groupBox1.Controls.Add(this.lblServiceStatus);
this.groupBox1.Controls.Add(this.lable3);
this.groupBox1.Controls.Add(this.label14);
this.groupBox1.Controls.Add(this.textExternalPort);
this.groupBox1.Controls.Add(this.label13);
this.groupBox1.Controls.Add(this.textExternalIP);
this.groupBox1.Controls.Add(this.label12);
this.groupBox1.Controls.Add(this.textInternalIP);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.textHostGUID);
this.groupBox1.Location = new System.Drawing.Point(8, 57);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(524, 288);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Mobile Api Service Status";
//
// lblReinstall
//
this.lblReinstall.Location = new System.Drawing.Point(240, 258);
this.lblReinstall.Name = "lblReinstall";
this.lblReinstall.Size = new System.Drawing.Size(278, 16);
this.lblReinstall.TabIndex = 28;
this.lblReinstall.Text = "Reinstall the service completely";
//
// btnReinstall
//
this.btnReinstall.Location = new System.Drawing.Point(102, 254);
this.btnReinstall.Name = "btnReinstall";
this.btnReinstall.Size = new System.Drawing.Size(122, 23);
this.btnReinstall.TabIndex = 27;
this.btnReinstall.Text = "Reinstall Service";
this.btnReinstall.UseVisualStyleBackColor = true;
this.btnReinstall.Click += new System.EventHandler(this.btnReinstall_Click);
//
// lblIsOnMckessonNetwork
//
this.lblIsOnMckessonNetwork.AutoSize = true;
this.lblIsOnMckessonNetwork.ForeColor = System.Drawing.Color.Red;
this.lblIsOnMckessonNetwork.Location = new System.Drawing.Point(293, 190);
this.lblIsOnMckessonNetwork.Name = "lblIsOnMckessonNetwork";
this.lblIsOnMckessonNetwork.Size = new System.Drawing.Size(187, 13);
this.lblIsOnMckessonNetwork.TabIndex = 26;
this.lblIsOnMckessonNetwork.Text = "Machine is on the McKesson Network";
//
// lblUpdate
//
this.lblUpdate.Location = new System.Drawing.Point(239, 229);
this.lblUpdate.Name = "lblUpdate";
this.lblUpdate.Size = new System.Drawing.Size(237, 16);
this.lblUpdate.TabIndex = 25;
this.lblUpdate.Text = "Updating the service will close this Application";
this.lblUpdate.Visible = false;
//
// btnUpdateService
//
this.btnUpdateService.Enabled = false;
this.btnUpdateService.Location = new System.Drawing.Point(102, 225);
this.btnUpdateService.Name = "btnUpdateService";
this.btnUpdateService.Size = new System.Drawing.Size(122, 23);
this.btnUpdateService.TabIndex = 24;
this.btnUpdateService.Text = "Update Service Now";
this.btnUpdateService.UseVisualStyleBackColor = true;
this.btnUpdateService.Click += new System.EventHandler(this.btnUpdateService_Click);
//
// lblLatestVersion
//
this.lblLatestVersion.AutoSize = true;
this.lblLatestVersion.Location = new System.Drawing.Point(103, 201);
this.lblLatestVersion.Name = "lblLatestVersion";
this.lblLatestVersion.Size = new System.Drawing.Size(53, 13);
this.lblLatestVersion.TabIndex = 23;
this.lblLatestVersion.Text = "Unknown";
//
// lblServiceVersion
//
this.lblServiceVersion.AutoSize = true;
this.lblServiceVersion.Location = new System.Drawing.Point(103, 176);
this.lblServiceVersion.Name = "lblServiceVersion";
this.lblServiceVersion.Size = new System.Drawing.Size(53, 13);
this.lblServiceVersion.TabIndex = 22;
this.lblServiceVersion.Text = "Unknown";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(19, 201);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(77, 13);
this.label9.TabIndex = 21;
this.label9.Text = "Latest Version:";
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(12, 176);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(84, 13);
this.label8.TabIndex = 20;
this.label8.Text = "Service Version:";
//
// label15
//
this.label15.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.label15.ForeColor = System.Drawing.Color.Green;
this.label15.Location = new System.Drawing.Point(291, 160);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(208, 19);
this.label15.TabIndex = 19;
this.label15.Text = "This screen refreshes every 15 seconds";
//
// label11
//
this.label11.Location = new System.Drawing.Point(291, 90);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(211, 71);
this.label11.TabIndex = 18;
this.label11.Text = "The \'Mobile Api Service\' detects a local IP change every 10 seconds and an extern" +
"al IP change every 5 minutes. It then notifies McKesson\'s Mobile Gateway";
//
// lblServiceStatus
//
this.lblServiceStatus.ForeColor = System.Drawing.Color.Red;
this.lblServiceStatus.Location = new System.Drawing.Point(98, 31);
this.lblServiceStatus.Name = "lblServiceStatus";
this.lblServiceStatus.Size = new System.Drawing.Size(401, 13);
this.lblServiceStatus.TabIndex = 17;
this.lblServiceStatus.Text = "Unknown";
//
// lable3
//
this.lable3.AutoSize = true;
this.lable3.Location = new System.Drawing.Point(13, 31);
this.lable3.Name = "lable3";
this.lable3.Size = new System.Drawing.Size(79, 13);
this.lable3.TabIndex = 16;
this.lable3.Text = "Service Status:";
//
// label14
//
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(25, 148);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(70, 13);
this.label14.TabIndex = 15;
this.label14.Text = "External Port:";
//
// textExternalPort
//
this.textExternalPort.Location = new System.Drawing.Point(102, 144);
this.textExternalPort.Name = "textExternalPort";
this.textExternalPort.ReadOnly = true;
this.textExternalPort.Size = new System.Drawing.Size(70, 20);
this.textExternalPort.TabIndex = 3;
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(33, 119);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(61, 13);
this.label13.TabIndex = 13;
this.label13.Text = "External IP:";
//
// textExternalIP
//
this.textExternalIP.Location = new System.Drawing.Point(102, 116);
this.textExternalIP.Name = "textExternalIP";
this.textExternalIP.ReadOnly = true;
this.textExternalIP.Size = new System.Drawing.Size(167, 20);
this.textExternalIP.TabIndex = 2;
//
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(43, 89);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(49, 13);
this.label12.TabIndex = 11;
this.label12.Text = "Local IP:";
//
// textInternalIP
//
this.textInternalIP.Location = new System.Drawing.Point(102, 86);
this.textInternalIP.Name = "textInternalIP";
this.textInternalIP.ReadOnly = true;
this.textInternalIP.Size = new System.Drawing.Size(167, 20);
this.textInternalIP.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(31, 61);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(62, 13);
this.label1.TabIndex = 1;
this.label1.Text = "Host GUID:";
//
// textHostGUID
//
this.textHostGUID.Location = new System.Drawing.Point(102, 58);
this.textHostGUID.Name = "textHostGUID";
this.textHostGUID.ReadOnly = true;
this.textHostGUID.Size = new System.Drawing.Size(299, 20);
this.textHostGUID.TabIndex = 0;
//
// groupBox2
//
this.groupBox2.Controls.Add(this.textDetectedInternalIP);
this.groupBox2.Controls.Add(this.label6);
this.groupBox2.Controls.Add(this.label5);
this.groupBox2.Controls.Add(this.textDetectedExternalIP);
this.groupBox2.Controls.Add(this.btnUpdateHost);
this.groupBox2.Location = new System.Drawing.Point(8, 350);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(524, 103);
this.groupBox2.TabIndex = 1;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "McKesson\'s Mobile Gateway";
//
// textDetectedInternalIP
//
this.textDetectedInternalIP.Location = new System.Drawing.Point(154, 68);
this.textDetectedInternalIP.Name = "textDetectedInternalIP";
this.textDetectedInternalIP.ReadOnly = true;
this.textDetectedInternalIP.Size = new System.Drawing.Size(167, 20);
this.textDetectedInternalIP.TabIndex = 17;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(42, 71);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(96, 13);
this.label6.TabIndex = 16;
this.label6.Text = "Detected Local IP:";
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(31, 35);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(108, 13);
this.label5.TabIndex = 15;
this.label5.Text = "Detected External IP:";
//
// textDetectedExternalIP
//
this.textDetectedExternalIP.Location = new System.Drawing.Point(154, 33);
this.textDetectedExternalIP.Name = "textDetectedExternalIP";
this.textDetectedExternalIP.ReadOnly = true;
this.textDetectedExternalIP.Size = new System.Drawing.Size(167, 20);
this.textDetectedExternalIP.TabIndex = 14;
//
// btnUpdateHost
//
this.btnUpdateHost.BackColor = System.Drawing.Color.ForestGreen;
this.btnUpdateHost.Enabled = false;
this.btnUpdateHost.ForeColor = System.Drawing.Color.White;
this.btnUpdateHost.Location = new System.Drawing.Point(352, 30);
this.btnUpdateHost.Name = "btnUpdateHost";
this.btnUpdateHost.Size = new System.Drawing.Size(150, 58);
this.btnUpdateHost.TabIndex = 11;
this.btnUpdateHost.Text = "Update IPs Now";
this.btnUpdateHost.UseVisualStyleBackColor = false;
this.btnUpdateHost.Click += new System.EventHandler(this.btnUpdateHost_Click);
//
// groupBox3
//
this.groupBox3.Controls.Add(this.label2);
this.groupBox3.Controls.Add(this.btnIsServerReachable);
this.groupBox3.Location = new System.Drawing.Point(8, 456);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(524, 75);
this.groupBox3.TabIndex = 2;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Port Configuration";
//
// label2
//
this.label2.Location = new System.Drawing.Point(80, 22);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(374, 18);
this.label2.TabIndex = 1;
this.label2.Text = "Make a call from the McKesson Mobile Gateway into this Server\'s IP and Port";
//
// btnIsServerReachable
//
this.btnIsServerReachable.Enabled = false;
this.btnIsServerReachable.Location = new System.Drawing.Point(194, 44);
this.btnIsServerReachable.Name = "btnIsServerReachable";
this.btnIsServerReachable.Size = new System.Drawing.Size(127, 23);
this.btnIsServerReachable.TabIndex = 0;
this.btnIsServerReachable.Text = "Is Server Reachable";
this.btnIsServerReachable.UseVisualStyleBackColor = true;
this.btnIsServerReachable.Click += new System.EventHandler(this.btnIsServerReachable_Click);
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 0);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(555, 565);
this.tabControl1.TabIndex = 3;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.btnServiceStartStop);
this.tabPage1.Controls.Add(this.label3);
this.tabPage1.Controls.Add(this.groupBox1);
this.tabPage1.Controls.Add(this.groupBox3);
this.tabPage1.Controls.Add(this.groupBox2);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(547, 539);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Network Status";
this.tabPage1.UseVisualStyleBackColor = true;
//
// btnServiceStartStop
//
this.btnServiceStartStop.Location = new System.Drawing.Point(417, 17);
this.btnServiceStartStop.Name = "btnServiceStartStop";
this.btnServiceStartStop.Size = new System.Drawing.Size(114, 23);
this.btnServiceStartStop.TabIndex = 26;
this.btnServiceStartStop.Text = "Start Service";
this.btnServiceStartStop.UseVisualStyleBackColor = true;
this.btnServiceStartStop.Click += new System.EventHandler(this.btnServiceStartStop_Click);
//
// label3
//
this.label3.Location = new System.Drawing.Point(13, 9);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(396, 46);
this.label3.TabIndex = 27;
this.label3.Text = resources.GetString("label3.Text");
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(555, 565);
this.Controls.Add(this.tabControl1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "MainForm";
this.Text = "Diagnose Mobile";
this.Load += new System.EventHandler(this.MainForm_Load);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textHostGUID;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button btnUpdateHost;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.TextBox textExternalPort;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox textExternalIP;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.TextBox textInternalIP;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.Label lblServiceStatus;
private System.Windows.Forms.Label lable3;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox textDetectedExternalIP;
private System.Windows.Forms.TextBox textDetectedInternalIP;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label15;
private System.Windows.Forms.Button btnUpdateService;
private System.Windows.Forms.Label lblLatestVersion;
private System.Windows.Forms.Label lblServiceVersion;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label lblUpdate;
private System.Windows.Forms.Button btnIsServerReachable;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button btnServiceStartStop;
private System.Windows.Forms.Label lblIsOnMckessonNetwork;
private System.Windows.Forms.Label lblReinstall;
private System.Windows.Forms.Button btnReinstall;
}
}

View File

@@ -0,0 +1,635 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;
using System.Net;
using System.IO;
using PlutoServer.MSL;
using Yaulw.Net;
using Yaulw.Thread;
using Yaulw.Assembly;
using Yaulw.Tools;
using System.Diagnostics;
namespace RegistrationAPI_Tester
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
// Use this internal Channel
internal const uint INTERNAL_CHANNEL_PORT = 1945;
// The Mobile Service Name
internal const string MOBILE_API_SERVICE_NAME = "McKesson MSL Mobile Api Server";
// The Mobile Service Exe
internal const string MOBILE_API_SERVICE_EXE = "PlutoServer.MSL.exe";
// 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";
// Used to display non-available fields
internal const string NOT_AVAILABLE = "N/A";
// Did the service statup on the McKesson Network? Initialized upon Service Start
internal static bool IsOnMcKessonNetwork = false;
// To keep track when we last time started the service
private DateTime LastTimeServiceWasStarted = DateTime.MinValue;
// The current Directory the exe is running from
internal static string curRunningDirectory = "";
/// <summary>
/// Retrieve the LocalFileNameNPath for SetupMini File (TEMP FOLDER)
/// </summary>
/// <returns></returns>
private static string MiniSetupFileNameNPath
{
get
{
string LocalFileNameNPath = Yaulw.Tools.PathNaming.PathEndsWithSlash(Path.GetTempPath()) + "SetupMini.exe";
return LocalFileNameNPath;
}
}
/// <summary>
/// Retrieve the LocalFileNameNPath for Setup File (TEMP FOLDER)
/// </summary>
/// <returns></returns>
private static string SetupFileNameNPath
{
get
{
string LocalFileNameNPath = Yaulw.Tools.PathNaming.PathEndsWithSlash(Path.GetTempPath()) + "Setup.exe";
return LocalFileNameNPath;
}
}
#region Dispatcher
/// <summary>
/// Dispatcher Timer
/// </summary>
private TTimerDisp dispTimer = null;
/// <summary>
/// Dispatch Event Handler
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ElapsedEventHandler(object sender, ElapsedEventArgs e)
{
System.Timers.Timer timer = (System.Timers.Timer) sender;
timer.Enabled = false;
CheckServiceStatus();
timer.Enabled = true;
}
#endregion
#region Set Service Status
/// <summary>
/// Set the Service Status
/// </summary>
/// <param name="strStatus"></param>
private void SetServiceStatus(string strStatus, System.Drawing.Color color)
{
this.lblServiceStatus.Text = strStatus;
this.lblServiceStatus.ForeColor = color;
}
/// <summary>
/// Set the Service Status
/// </summary>
/// <param name="strStatus"></param>
private void SetServiceStatusGood(string strStatus)
{
SetServiceStatus(strStatus, System.Drawing.Color.Green);
}
/// <summary>
/// Set the Service Status (Bad) Disables all readonly text fields and buttons)
/// </summary>
/// <param name="strStatus"></param>
private void SetServiceStatusBad(string strStatus)
{
SetServiceStatus(strStatus, System.Drawing.Color.Red);
ClearAllReadOnlyTextFields();
DisableAllButtons();
}
/// <summary>
/// Clear all ReadOnly Text Fields (we are in a bad state)
/// </summary>
private void ClearAllReadOnlyTextFields()
{
textHostGUID.Text = "";
textExternalIP.Text = "";
textInternalIP.Text = "";
textExternalPort.Text = "";
lblServiceVersion.Text = "";
lblLatestVersion.Text = "";
textDetectedInternalIP.Text = "";
textDetectedExternalIP.Text = "";
}
/// <summary>
/// Disable all buttons (we are in a bad state)
/// </summary>
private void DisableAllButtons()
{
btnServiceStartStop.Enabled = false;
btnUpdateService.Enabled = false;
btnUpdateHost.Enabled = false;
btnIsServerReachable.Enabled = false;
}
#endregion
#region Versioning
/// <summary>
/// Fetch the Latest Version that is Online
/// </summary>
/// <returns>valid version object or null if error occured</returns>
internal static Version FetchOnlineVerion()
{
string fetchVersion = Yaulw.Net.WCHelper.ScreenScrapeFromURL(Configuration.CHECK_VERSION_URL);
if (!String.IsNullOrEmpty(fetchVersion))
{
fetchVersion = fetchVersion.Replace("\n", "");
fetchVersion = fetchVersion.Replace("\r", "");
fetchVersion = fetchVersion.Trim();
try
{
Version version = new Version(fetchVersion);
return version;
}
catch (Exception) { /* ignore */ }
}
return null;
}
/// <summary>
/// Quick Check to see if the Local Service is out of date
/// </summary>
/// <returns></returns>
internal static bool IsLocalServiceVersionOutOfDate(string LocalVersion, string OnlineVersion)
{
if (!String.IsNullOrEmpty(LocalVersion) && !String.IsNullOrEmpty(OnlineVersion))
{
Version local = new Version(LocalVersion);
Version online = new Version(OnlineVersion);
if (online.Major == local.Major && online > local)
return true;
}
return false;
}
#endregion
/// <summary>
/// Main Status Logic
/// </summary>
private void CheckServiceStatus()
{
try
{
// Disable Reinstall by default, enable only in certain states
EnableReinstallServiceButton(false);
bool bHasConnection = Yaulw.Net.IPHostHelper.HasConnection();
if (!bHasConnection)
{
SetServiceStatusBad("Network Disconnected");
return;
}
// Enable the stop button, but only if Last Started has been longer than 2 minutes
TimeSpan ts = DateTime.Now - LastTimeServiceWasStarted;
bool bEnableStopButton = (ts.TotalMinutes >= 2.0);
bool bIsServiceRunning = Yaulw.Process.ServiceW.IsServiceRunning(MOBILE_API_SERVICE_NAME);
if (!bIsServiceRunning)
{
SetServiceStatusBad("Service not running");
btnServiceStartStop.Text = "Start Service";
btnServiceStartStop.Enabled = true;
// Enable Update button, if we can access fileVersion of Pluto Service
if (File.Exists(curRunningDirectory + MOBILE_API_SERVICE_EXE))
{
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(curRunningDirectory + MOBILE_API_SERVICE_EXE);
if (fvi != null)
{
lblServiceVersion.Text = fvi.FileVersion;
EnableButtonIfServiceIsOutOfDate();
}
// Enable Reinstall
EnableReinstallServiceButton(true);
}
return;
}
bool bCanConnectViaPort = Yaulw.Net.IPHostHelper.IsPortOpen(IPAddress.Loopback, (int) INTERNAL_CHANNEL_PORT);
if (!bCanConnectViaPort)
{
SetServiceStatusBad("DiagnoseMobile can't open the port to the Service");
// Service is running so enable the stop button
btnServiceStartStop.Text = "Stop Service";
btnServiceStartStop.Enabled = bEnableStopButton;
return;
}
// Service is running so enable the stop button
btnServiceStartStop.Text = "Stop Service";
btnServiceStartStop.Enabled = bEnableStopButton;
// Now let's start gathering Pluto Data
textHostGUID.Text = Pluto.MSL.Api.API.GetHostGUID();
// if we got here, then the above call didn't throw an exception,
// so we are doing good
SetServiceStatusGood("Running");
textInternalIP.Text = Pluto.MSL.Api.API.GetLocalIP();
// External IP could not be set, so don't confuse the customer,
// use N/A instead of the default values
IPAddress externalIP = IPAddress.None;
if(IPAddress.TryParse(Pluto.MSL.Api.API.GetExternalIP(), out externalIP))
{
if (IsOnMcKessonNetwork || externalIP == IPAddress.None)
textExternalIP.Text = NOT_AVAILABLE;
else
textExternalIP.Text = externalIP.ToString();
}
// External Port could not be set, so don't confuse the customer,
// use N/A instead of the default values
int nPort = Pluto.MSL.Api.API.GetExternalPort();
if(nPort == -1)
textExternalPort.Text = NOT_AVAILABLE;
else
textExternalPort.Text = nPort.ToString();
// Check the Versions
lblServiceVersion.Text = Pluto.MSL.Api.API.GetAPIVersion();
EnableButtonIfServiceIsOutOfDate();
// Detect thee IP stuff
textDetectedInternalIP.Text = Yaulw.Net.IPHostHelper.GetFirstLocalIPAddress().ToString();
externalIP = Yaulw.Net.IPHostHelper.GetExternalIP();
if (IsOnMcKessonNetwork || externalIP == IPAddress.None)
textDetectedExternalIP.Text = NOT_AVAILABLE;
else
textDetectedExternalIP.Text = externalIP.ToString();
// Enable buttons
btnUpdateHost.Enabled = true;
btnIsServerReachable.Enabled = true;
// Enable Reinstall
EnableReinstallServiceButton(true);
}
catch (Exception e)
{
SetServiceStatusBad(e.Message);
}
}
/// <summary>
/// Responsible for fetching the online version and enabling the Update Button if
/// service is out of date. The lblServiceVersion.Text needs to be set prior to calling
/// this function. Will be used to compare.
/// </summary>
private void EnableButtonIfServiceIsOutOfDate()
{
if (!String.IsNullOrEmpty(lblServiceVersion.Text))
{
Version OnlineVersion = FetchOnlineVerion();
if(OnlineVersion != null)
{
lblLatestVersion.Text = OnlineVersion.ToString();
bool bIsOutOfDate = IsLocalServiceVersionOutOfDate(lblServiceVersion.Text, lblLatestVersion.Text);
btnUpdateService.Enabled = bIsOutOfDate;
lblUpdate.Visible = bIsOutOfDate;
}
}
}
/// <summary>
/// Responsible for enabling the reinstall Service Button (should only
/// be enabled in certain states)
/// </summary>
/// <param name="bEnable"></param>
private void EnableReinstallServiceButton(bool bEnable)
{
lblReinstall.Visible = bEnable;
btnReinstall.Enabled = bEnable;
}
/// <summary>
/// Main Form OnLoad()
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MainForm_Load(object sender, EventArgs e)
{
try
{
// Load the PlutoServer.MSL.config File * Helps us to better test *
Configuration.Load(false);
// IMP! Set the Determine External IP Address URL
Yaulw.Net.IPHostHelper.WHAT_IS_MY_IP_AUTOMATION_URL = Configuration.DETERMINE_EXTERNAL_IP_ADDRESS_URL;
// Set the Current Run-time directory
curRunningDirectory = PathNaming.PathEndsWithSlash(Path.GetDirectoryName(AssemblyW.SpecializedAssemblyInfo.GetAssemblyFileNameNPath(AssemblyW.AssemblyST.Entry)));
// Are we on the McKesson Network?
IsOnMcKessonNetwork = Yaulw.Net.IPHostHelper.CanResolveHost(MCK_HOST_TO_CHECK_ON_MCK_NETWORK, true);
//IsOnMcKessonNetwork = false; // For Debugging
lblIsOnMckessonNetwork.Visible = IsOnMcKessonNetwork;
// Set the Pluto API
Pluto.MSL.Api.API.SetNetworkSettings(IPAddress.Loopback.ToString(), INTERNAL_CHANNEL_PORT);
// Set the Registration API
RegistrationAPI.API.SetNetworkSettings(Configuration.REGISTRATION_HOST_URL, (uint)Configuration.REGISTRATION_CHANNEL_PORT);
// By Default check the status
CheckServiceStatus();
// then start the Status Dispatcher, every 15 seconds
dispTimer = new TTimerDisp(ElapsedEventHandler, (int)TimeSpan.FromSeconds(15).TotalMilliseconds, true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
}
/// <summary>
/// Check if the IP is a valid IP and also check that the Port is valid
/// </summary>
/// <param name="IP">IP Address as a string</param>
/// <param name="Port">Port as a string</param>
/// <returns>true, if IP and Port is valid</returns>
private bool ValidIPandPort(string IP, string Port)
{
if (!String.IsNullOrEmpty(IP) && !String.IsNullOrEmpty(Port))
{
IPAddress ip = IPAddress.Any;
uint nPort = 0;
bool bValidConfig = IPAddress.TryParse(IP, out ip) && uint.TryParse(Port, out nPort) &&
(nPort > 0) && IPHostHelper.IsValidIPv4Address(ip, false);
return bValidConfig;
}
return false;
}
/// <summary>
/// Update The Service if Needed (auto-closes the app)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUpdateService_Click(object sender, EventArgs e)
{
try
{
// Important Sanity Clean-up, this way we know that the service or DiagnoseMobile
// always downloads the latest setup and runs the latest setup
try
{
if (File.Exists(MiniSetupFileNameNPath))
File.Delete(MiniSetupFileNameNPath);
}
catch (Exception)
{
Yaulw.WinForms.MsgBox.ShowError(this, "Updating the Service failed", String.Format("Failed to delete temporary setup file '{0}'. Please delete the file Manually.", MiniSetupFileNameNPath), MessageBoxButtons.OK);
return;
}
if (Yaulw.Net.WCHelper.DownloadFileFromURL(Configuration.DOWNLOAD_MINISETUP_URL, MiniSetupFileNameNPath, true))
{
// * Important * sanity check. Kumar/Jeff found this. State can happen that we can reach the
// version url but don't actually download the file which then causes the service to crash when
// calling PSetupSpwan (might as well also make sure that the new file is equal to the file we expect)
if (File.Exists(MiniSetupFileNameNPath))
{
// Stop the service if it exists
Yaulw.Installer.Common.StopService(MOBILE_API_SERVICE_NAME, 30);
// The auto-update is also forcing a close (however we will also try to committ suicide)
Yaulw.Installer.Common.PSetupSpwan(MiniSetupFileNameNPath, "", false);
// * Double Knock-out * Force the Service to close here a kill itself here as well, don't know if this even get's called
// but might as well make sure and double punch
dispTimer.Stop();
Application.Exit();
}
}
}
catch (Exception) { /* ignore */}
Yaulw.WinForms.MsgBox.ShowError(this, "Updating the Service failed", String.Format("Failed to download the file to update the service, please download and install manually: '{0}'", Configuration.DOWNLOAD_MINISETUP_URL), MessageBoxButtons.OK);
}
/// <summary>
/// Update the IPs
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUpdateHost_Click(object sender, EventArgs e)
{
try
{
// Always make sure that the HOST_GUID Exists online on the Gateway Server
// ~otherwise the update server will always fails and we don't know why, this way the user now knows
bool bHostExists = RegistrationAPI.API.DoesServerHostGUIDExist(new Guid(textHostGUID.Text));
if (!bHostExists)
{
Yaulw.WinForms.MsgBox.ShowInfo(this, "No Practices associated with the Server Host Guid", "No Practices have been associated with the McKesson Mobile Gateway. Use Help->Mobile About to retrieve an Api Key and Api Code for a practice to register a practice with the McKesson Mobile Gateway", MessageBoxButtons.OK);
return;
}
if (IsOnMcKessonNetwork)
{
bool bIsValidInternalConfig = ValidIPandPort(textDetectedInternalIP.Text, INTERNAL_CHANNEL_PORT.ToString());
if (bIsValidInternalConfig)
{
if (RegistrationAPI.API.UpdateServer(new Guid(textHostGUID.Text), textDetectedInternalIP.Text, String.Empty, (uint)INTERNAL_CHANNEL_PORT))
Yaulw.WinForms.MsgBox.ShowInfo(this, "Update IP Successful", "Updating the local IP succeeded with the McKesson Mobile Gateway. You are located on the McKesson Network.", MessageBoxButtons.OK);
else
Yaulw.WinForms.MsgBox.ShowError(this, "Update IP Failed", "Updating the local IP failed with the McKesson Mobile Gateway. You are located on the McKesson Network.", MessageBoxButtons.OK);
}
else
{
Yaulw.WinForms.MsgBox.ShowError(this, "Internal IP or Port not valid", String.Format("The internal IP or the Port are invalid internal IP:{0} on Port:{1}", textDetectedInternalIP.Text, INTERNAL_CHANNEL_PORT.ToString()), MessageBoxButtons.OK);
}
}
else
{
// Check to make sure external IP and Port are valid
bool bIsValidExternalConfig = ValidIPandPort(textDetectedExternalIP.Text, textExternalPort.Text);
bool bIsValidInternalConfig = ValidIPandPort(textDetectedInternalIP.Text, INTERNAL_CHANNEL_PORT.ToString());
if (bIsValidExternalConfig && bIsValidInternalConfig)
{
if (RegistrationAPI.API.UpdateServer(new Guid(textHostGUID.Text), textDetectedInternalIP.Text, textDetectedExternalIP.Text, uint.Parse(textExternalPort.Text)))
Yaulw.WinForms.MsgBox.ShowInfo(this, "Update IPs Successful", "Updating the local IP and external IP succeeded with the McKesson Mobile Gateway.", MessageBoxButtons.OK);
else
Yaulw.WinForms.MsgBox.ShowError(this, "Update IPs Failed", "Updating the local IP and external IP failed with the McKesson Mobile Gateway.", MessageBoxButtons.OK);
}
else if (bIsValidInternalConfig)
{
if (RegistrationAPI.API.UpdateServer(new Guid(textHostGUID.Text), textDetectedInternalIP.Text, String.Empty, (uint)INTERNAL_CHANNEL_PORT))
Yaulw.WinForms.MsgBox.ShowInfo(this, "Update IP Successful", "Updating the local IP succeeded with the McKesson Mobile Gateway.", MessageBoxButtons.OK);
else
Yaulw.WinForms.MsgBox.ShowError(this, "Update IP Failed", "Updating the local IP failed with the McKesson Mobile Gateway.", MessageBoxButtons.OK);
}
else
{
Yaulw.WinForms.MsgBox.ShowError(this, "External IP/Internal IP/ or Port not valid", String.Format("The external IP / internal IP or the Port are invalid external IP:{0} internal IP:{1} on Port:{2}", textExternalIP.Text, textDetectedInternalIP.Text, textExternalPort.Text), MessageBoxButtons.OK);
}
}
}
catch (Exception ex)
{
Yaulw.WinForms.MsgBox.ShowError(this, "Update IP Exception Thrown", ex.Message, MessageBoxButtons.OK);
}
}
/// <summary>
/// Is this Server reachable?
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnIsServerReachable_Click(object sender, EventArgs e)
{
try
{
if (IsOnMcKessonNetwork)
{
Yaulw.WinForms.MsgBox.ShowInfo(this, "McKesson Network", "Server won't be accessible from the Internet. You are located on the McKesson Network.", MessageBoxButtons.OK);
}
else
{
bool bValidConfig = ValidIPandPort(textDetectedExternalIP.Text, textExternalPort.Text);
if (bValidConfig)
{
if (RegistrationAPI.API.IsServerReachable(textExternalIP.Text, uint.Parse(textExternalPort.Text)))
Yaulw.WinForms.MsgBox.ShowInfo(this, "Communication Success", String.Format("McKesson's Mobile Gateway successfully communicated with IP:{0} on Port:{1}", textExternalIP.Text, textExternalPort.Text), MessageBoxButtons.OK);
else
Yaulw.WinForms.MsgBox.ShowError(this, "Communication Failed", String.Format("McKesson's Mobile Gateway was unsuccessful in communicating with IP:{0} on Port:{1}", textExternalIP.Text, textExternalPort.Text), MessageBoxButtons.OK);
}
else
{
Yaulw.WinForms.MsgBox.ShowError(this, "External IP or Port not valid", String.Format("The external IP or the external Port are invalid IP:{0} on Port:{1}", textExternalIP.Text, textExternalPort.Text), MessageBoxButtons.OK);
}
}
}
catch (Exception ex)
{
Yaulw.WinForms.MsgBox.ShowError(this, "ServerReachable Exception Thrown", ex.Message, MessageBoxButtons.OK);
}
}
/// <summary>
/// Allows the User to Start/Stop the Service (easily without having to go to SCM to do it)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnServiceStartStop_Click(object sender, EventArgs e)
{
bool bStart = btnServiceStartStop.Text.StartsWith("Start");
if (bStart)
{
LastTimeServiceWasStarted = DateTime.Now;
bool bSuccess = Yaulw.Process.ServiceW.StartService(MOBILE_API_SERVICE_NAME);
if (bSuccess)
Yaulw.WinForms.MsgBox.ShowInfo(this, MOBILE_API_SERVICE_NAME, "The service successfully started.", MessageBoxButtons.OK);
else
Yaulw.WinForms.MsgBox.ShowError(this, MOBILE_API_SERVICE_NAME, "The service start was unsuccessful.", MessageBoxButtons.OK);
}
else
{
bool bSuccess = Yaulw.Process.ServiceW.StopService(MOBILE_API_SERVICE_NAME);
if(bSuccess)
Yaulw.WinForms.MsgBox.ShowInfo(this, MOBILE_API_SERVICE_NAME, "The service successfully stopped.", MessageBoxButtons.OK);
else
Yaulw.WinForms.MsgBox.ShowError(this, MOBILE_API_SERVICE_NAME, "The service stop was unsuccessful.", MessageBoxButtons.OK);
}
// Refresh the form right aways, since the service start/stop occured may as well,
// otherwise it looks a little clumsy
CheckServiceStatus();
}
/// <summary>
/// Force a Re-install of the service on this machine (Trouble shooting step)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnReinstall_Click(object sender, EventArgs e)
{
try
{
DialogResult result = Yaulw.WinForms.MsgBox.ShowInfo(this, "Do you want to continue?", String.Format("You are about to delete the '{0}' and download the complete setup.exe online from:'{1}' and then re-install it. The download may take some time, depending on the speed of your internet connection.", MOBILE_API_SERVICE_NAME, Configuration.DOWNLOAD_SETUP_URL), MessageBoxButtons.YesNo);
if (result != System.Windows.Forms.DialogResult.Yes)
return;
// Important Sanity Clean-up, this way we know that the service or DiagnoseMobile
// always downloads the latest setup and runs the latest setup
try
{
if (File.Exists(SetupFileNameNPath))
File.Delete(SetupFileNameNPath);
}
catch(Exception)
{
Yaulw.WinForms.MsgBox.ShowError(this, "Reinstalling the Service failed", String.Format("Failed to delete temporary setup file '{0}'. Please delete the file Manually.", SetupFileNameNPath), MessageBoxButtons.OK);
return;
}
if (Yaulw.Net.WCHelper.DownloadFileFromURL(Configuration.DOWNLOAD_SETUP_URL, SetupFileNameNPath, true))
{
// * Important * sanity check. Kumar/Jeff found this. State can happen that we can reach the
// version url but don't actually download the file which then causes the service to crash when
// calling PSetupSpwan (might as well also make sure that the new file is equal to the file we expect)
if (File.Exists(SetupFileNameNPath))
{
// Stop the service if it exists
Yaulw.Installer.Common.StopService(MOBILE_API_SERVICE_NAME, 30);
// The auto-update is also forcing a close (however we will also try to committ suicide)
Yaulw.Installer.Common.PSetupSpwan(SetupFileNameNPath, "", false);
// * Double Knock-out * Force the Service to close here a kill itself here as well, don't know if this even get's called
// but might as well make sure and double punch
dispTimer.Stop();
Application.Exit();
}
}
}
catch (Exception) { /* ignore */}
Yaulw.WinForms.MsgBox.ShowError(this, "Reinstalling the Service failed", String.Format("Failed to download the file to update the service, please download and install manually: '{0}'", Configuration.DOWNLOAD_SETUP_URL), MessageBoxButtons.OK);
}
}
}

View File

@@ -0,0 +1,383 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label3.Text" xml:space="preserve">
<value>When the service is running you can 'Stop' the service. If it is not running you can 'Start' the service. There is a two minute delay after starting the service before you can stop it, to make sure it had time to initialize.</value>
</data>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAAIABoBAAANgAAACAgAAAAACAAqBAAAJ4EAAAwMAAAAAAgAKglAABGFQAAKAAAABAA
AAAgAAAAAQAgAAAAAABABAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wGUWjBZiEUO7Xw7C+97SDFr////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wHGmHYFu3Ai3eefNP/Ogh7/fj0R6ayOeA////8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B0qyKBdWTPc/9ymP/6KM7/41KFN+oh28L////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wHWn18z2ppDxbx2Kc2eaUJB////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////AdDS0gO7czRvvn4vUayFWgW6k3AFzptDQdObLn3NvrMF////Af///wH///8B////Af//
/wH///8B////Af///wHBjFotym0N+d2EEfvilBzH6aMkw/a0I/n4vR3/58JyPf///wH///8B////Af//
/wH///8B////Af///wGOXkRFn5CDB9KFLmfaghXp5ZEU//CiF//2siHt+8I6eefQmQWpgUpFsJ+bA///
/wH///8B////Af///wGZWTFjrlQK/alfHaeJXjIZ1ZtZE9mVQEPfnURF6LRoF5RyWRPInUCX8884/dez
THf///8B////Af///wGQgHwLsnA7M7FcEee/ZQ7/xnAT7dGFHKfemyh34qc5dd2pRaHqtDrn/cwx//7X
QO3+210/iV1CCf///wGESi5rgz8W0XpNNiXBilcft2YarcVrEfnZfhH/6JQX//KmHP/5sh3/+roh+/bA
NLf1y1snpX5SG9WyQcfRq02FgD0TkYpAB/+USg7rik8lYXFURAm1dkYlw3gua9OCJJHekCaT4JgzcdWS
Ry2adV8HrIA0VeHBReH+4Fn//NxgucGfhguRTx2bmkwJ/axaDP+qXBfXtm8hh7+DLEvFiysxwoonMcOT
QUXLmjl/2Kgxz/bSPv3+3lD//t1dp/7hiA////8Bx6mOA6dmL0urXRTRuGEO/8hsEf/ZgRT/55UX+/Cl
Hfv2sSH//bwj//7JK//91kPX/dxgVf3giwX///8B////Af///wH///8BvY9nBbFvNzu9biOLzXohx9mG
HefjlB/n66Qqy/CvMpPvtkdB9stlB////wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAP//AAD//wAA//8AAP//AAD//wAA
//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//KAAAACAAAABAAAAAAQAgAAAA
AACAEAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wGzj3QJkmA9S31CH8V3OQztcDMI8XE3HM+JXEZfsJWDD///
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Aax/XkWMShnPkEYG/5pSC/+RSwj/ejUD/2gs
FN+Ua1Zf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wHJoocHrGszr7FfDf3UiCT/3Y8l/82A
G/+uZBD/djAC/3hBKMe7o5IV////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcWVcA+6cizJ0YMj//Ku
Qf/6t0T/8KYx/86AHf+ORgf/eT0a3aOBaSX///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B0amGDciG
Pr/dmDX//Mlh///NZP/5uUn/3pMr/5lOCf+ARBvVpYNqH////wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wHhx6wD0JdYidmUNvf6x2H//s1m//O0S//WjSv/jkIF/Y5XM6e0lH8L////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wHftYsf1JlSl96cPvPko0L904su/65kFPeTVimtuJaBL////wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////AerHpQPXqHUZ0phUecyMQq2+fjuzpWcuh6uBXyXSvbAD////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////AcGmkBGodEdVpHdENZ6McAX///8ByJRgCcWYcQv///8Bqo1rA8KW
VSW8hjVbvphnHf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wHQ0tIJuYJVdcNmFOHKfB69s4ZKS452VQn///8B////AZeA
aQW1jlg32qA3p+OmGunLmD6Tzb6zEf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8Bv5+BBbiKX1m6XQ311HYO/92BDv/dhhDvz4woq9WZ
N4Hanzl91Jo3n+qoJeX6uSH9/cco/+uuEP3asmlx3sakCf///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wHJm20FyY5SV8hqDPXRdQ3/2YIV/+GI
Ev/qkhD77ZkT9fGiGPX3qxn5+bUg//m5Jv/7wCb//cAY//XRcm/o060J////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wGJdXELgm1oEf///wHmx6MH05JMcc93
E9fYewr/3YUS/+KOF//nlRj/7p4a//KnHP/2sB3/+bYd//u+JuX8wz6P/+efD////wGXdGMNknBcDf//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bkm1dA5FhSG2NWTqLh3x5E///
/wHbrnkN1ZJDSdiIKrnagxXp440U/+mTDf/umw3/86cZ//SrH/H1tjHH+chZXfzLaBf///8BnYeHBayD
Sn2qgkV/sJ+bC////wH///8B////Af///wH///8B////Af///wH///8B////AaWQgw+PVzZ1pE0Q9bFT
B/2cXCqnh2BFN4ttUgP///8B26BeEdSZWDfUjTZv3ptDh+KjSonclTR35a9jQfDEdRf///8B////AY9n
SyexiEaN6ME09+jCL/u9lUqPvKKBG////wH///8B////Af///wH///8B////Af///wH///8BtIxuMZhK
GdOuUwf/t14L/7lfDPepYB3JjF4vUXZcRQ////8B2aFoA9GNPwndrIAN37aYDdePPgnosG0D////AYJk
UgmXdVo/vpJFtea7N/P92Dz//d5B/+nDOuPev3FN////Af///wH///8B////Af///wH///8B////Af//
/wHOpoQXq2MplatSCPm1XQz/vmUO/8NoDP/AaxHzvXYfw7t8In+4hjdJvY07K82dSCPUn0UjvpROKbqP
TT+8jkxzy59Wt9+tQev6xzH//9I0///XPf/+2T///tpNrf3lkSX///8B////Af///wH///8B////Aaqa
kgOQgHwhkoJ8CdW1mQO7h1odtW0uq7BZCfe6Ygz/wGcR/8hqEP/PdBD92IMU892NGOPfmB7N5qMowemq
McHkqjvL569D3+21Q/H4vTL9/cEn///ILP//0DL//dQ5+/3YTr392m0p/uenA4xiPwWJXUIhxrGlA///
/wGokYgPkGRRc3s3HNuIV0GBcltVDf///wHSrIcRvoRPX7FdD927YQz7xWkO/8xvEv/UexT/3IQV/+aR
Fv/rmBf/8KIc//SpIP/3sCH/+rQf//26H//+wCL//cYm/fjGM+X1ylV3+NFqG////wGli4MFp3s1Z8Ob
NNO8lEuNtpRxGYdUOUF7NxXnhjoE/4Y+Du16SC11fmpjE////wHBj2AHuHxDRbhwLZW8aBjnx2sM/9V4
C//dgw//5pAV/+qYGf/wohr/9Kka//iwGf/8thn/+7ke//OzJO/utT6n67RLVfDGdQ3///8BnH1yDaZ9
TF3Ysj/j9txR/ePAQ+/KpFqDezcLU3oyBf2JQQj/kUQI/5FECfeITia5f1dCM3VjYQn///8Bt35MB7N1
RCu2dkZjwHUvpcp6I8nVgh7b24gZ4eKRG+HlmSLd5ZwpzeOaMa/Zkz5z0JJYN9qjcgv///8BhGFUB5Bl
OyWziTqh3bxA7/3iWP/+31v//t9U//XWZ7udb08vgkIbx4E2A/+PRQr/mEsJ/5tLCPuUTRjLgU0qe2FK
Qxv///8B////AbV9Wwe3fFQVtnhQKblqLkHIh1FJ0YtKScp4LkPLgU0vy4lhGc6GRQnKi2UD////AXdc
VhOSZjRpwJUyv+jKQvf74VP//uBb//7fWP/+3F7Z/uB4U////wHAnoQljU8huYk+BveXSwr/oFIN/6tY
C/+pVgr7nFUb1ZZdLJOebz1DmGw3K49wUBGJgH0D////Af///wH///8B////AZeGewOWc0wNm288JamC
TTmsgkCDuowyyeK6L/n52UP//+BR///fVP/+3lP5/t1cyf7hiDX/3IAF////Af///wGmdEwrnWExk5JD
BfueTgr/qloO/7BeDv+0Xg7/t2EQ97xsGeG+dRvJwYElm8OJLnvLkTJlv4UjXbV+GlvNlTNjxZVCdcaV
PpHNmzfB2aY13eq1LPX1xSz9/dc8///dSP//3U7//txM//3dYqX+4IA3/uOWA////wH///8B////Af//
/wHHqY4JrnlLU6FXGremVgz3r1wM/7VgD/+6YhD/xWgR/81xEv/YfhL/3okT/eiVFvvsnBf376Qb9/Gq
IfnzsCT997Qk//y6JP/+vyT//8Un///NMP//1z3//tlD+/3aUMP83m5n/uCKDf///wH///8B////Af//
/wH///8B////Af///wG9lW8Fu4xiHapmKnurYh3Ts14L/7tiDf/DaBD/y3AT/9V6Ff/aghb/440X/+eV
Gf/unxv/8qUc//WtHv/5syD//boh//69Iv/+xSb//swu//vSRd/81U6H/d9/J/zlngf///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8Bt4ZaA76PaA+3gVNNrmQmlbxqHc3Ebhbn0HcV9diB
FfnijBf96JQZ/+2eG//wpRz986se+/WuIPf0siXr9bUs1fCzN53uulxb9spkE/nSbgP///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AbV/UAO6imYJtH5YK7Ju
O0+9djqFw3gxqct7KMnMeB3V0Xwb1dmOK8vdlDWv3phAj96fUFnfpFoz4rF9C+m4bQP///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA
IAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////AZxyVDeMXkOTfUYn0XA0Cu9rMAXzcDgb24ZWQKWohXBNwqubB///
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8Bs490QYhPKMVyKgD/dzAA/4E9A/9+PAL/bisA/1sV
AP9tNR3fqYt4X9PDtwn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wHKrJctnmhAvYY5AP+ZTQb/qV8R/6lf
EP+hWA3/llAK/387A/9bFwD/dD8l4byjkknZzMED////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AcyslgW4imV7m04N+a1Z
Bv/Hex3/0YMf/9SFHv/JfBn/tGcR/59YC/96NQL/WxYA/5NpUp3JtqkZ////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Acie
gBG0d0SlsV4K/89/Hv/lmjH/76U1//OoNP/rnir/1IYc/7ZpFP+UTAf/ZyAA/4FPM8WukHwv////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////AcSSaxm7eD2xw3MZ/+GYMv/1s0f//b5P///ATP/9tz7/658r/8t8HP+jWg3/dCwA/39J
J8+gfGI7////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Ac+lgRfEh0uryn0f/+imQP/7xFv//8xk///MYP//wlD/8qo3/9WI
I/+rYBD/eTAA/4JOKcuigGY1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////AeHHrAfRoG2Ly38m/eelP//9y2X//9Nt///P
aP/8wlb/76k8/9aKKP+mWQz/eC8A/4xaN62vjngh////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wHatpNFzY1E2dyV
MP/2v1r//s5p//7KYv/2u1L/56A7/8l+Iv+QQAD/fTsP87KQeWm+oY4J////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wHpzLIJ3bKFb9KRP+ffnDj/7rBK/+6wSv/koDz/z4Qn/6hbCf+HPwn3qoFokdrJvBv///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B68elC9amcmPQkUbN0ow09dKKMf/HfSf/sWYa+5hVF9+meFOB0r2wG///
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////AeCzhQPZsIM10Jxma8WKSpPAh0+ZuYVbeaJt
QUe5l30L////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8Bxb+5C5R6YDWLdFcd////Af///wH///8B////AciU
YBPFl28XyqSHBf///wH///8B////Ab+abg+neEE1uJh3Ff///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wHY3+MJvpt+daxjJs+udzmfnoxwJf//
/wH///8B////Af///wH///8B////Af///wH///8Bqo1rDcWWT3/GhyDRwJJSl8CrmB3///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AdDS0hG6nIhvt2EX6dNl
AP/Yegn7wIc8raeFV0eOdlUR////Af///wH///8B////AZeAaQmnh2AzwJRSjeioKe31uhT/46AU+72S
VZvNvrMj////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BxLWnCbiY
fWusWR3nxl8A/9x/Ef/egQ7/4IIH/9OHHNu5hTiZrYxZYcigXknPoVNFtpRgV7iMTIXVmC/J8K0h9/69
If//yyv//ccd/9aUCPnOqXOL3carFf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8BvI1hE7l2NqW/WgD/0nAK/9WAGv/XgBX/4YYP/+qLCf/skgv76JYV6eWdIt3noSfd66Ig4/Op
HfX8sxz//rsg//u8Jf/6viz//84x//m5A//svFHB4MaeJ////wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B3rGAB9ehZ2fLdRrpymUA/9R5Dv/YgRf/24YY/+CKFv/okBL/8JYP//Gb
D//0oRP/+qgV//uwGf/5tCD/97Ym//i5Kv/7vib//cAd///CGv//4IKF8eK+E////wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////AebHow/aqHRxy3Ya49BuAP/XeAX/3IQT/9+L
Gv/gjhv/45Eb/+iWGf/tnBr/76Id//GoH//0sCP/+bYl//q5Hv/8uhP//MAq+f3ERJf/558h////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wGhioILgm9sQYJsZiX///8B////Af///wHkyqwN2adrV9OH
Lr3WexD/2XsG/+CCB//ljA//55MU/+qYGP/unRr/8qUZ//isF//5rRH/+K0N//i2Hf/5wj3V/M1pe/3G
Wxv///8B////Af///wG1n5YXhFlCRayYihX///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////AZJtXQWbdWVzikkj3ZNgQamHfXkp////Af//
/wH///8B3LKAA9miXS3bnFJ/2IswxdqDF+vgixf/55MU/+qRA//tlQH/8qIT//OoHf/yqSP18rAz1fbA
UZX60X5B/NKHDf///wH///8B////AZ2HhwuxjWSNrHsk3a2LW5OwoJwX////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bo5iSD41gS3GbUiTpq0UA/65U
DPuSXzutemhiNf///wH///8B////Af///wHdpWMN2p5cL9OYV2HSjTqT2I4ur+KfRb3lpku935g0tdyV
M5/jql1v7sJ7P/XIbhX///8B////Af///wH///8BelZNGZx3VovUqTXv8c8u/9SnKPWsh1mVs56WI///
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wHBu7cFpIt7Y4xC
EO2mSAL/uFsJ/7pdB/+xVwn7nV8sx3leUF2LbVIH////Af///wH///8B////AdmhaAfRjkET0409HeG5
myXjxLQn1ZRSH9qNMhfosG0J////Af///wH///8B////Af///wGBXVA/oXVHqdSnNfP50TX//+ZC//ra
Nv/SoyL1waN0icCpjRP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wHHvbcJt4Zhl5U3AP+tUgX/tF4Q/7hhDf/BYwr/v2EI/6piHeORXiqTdl1FP////wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BgmRSKZt4XHe3jEzR47Q3/fzU
Nv//2jz//9hB///iR//61Cz/6cpqxeXGfSH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wHjzboDzaSBXaJPDummSQD/tF0N/7dhEP+9ZQ7/w2gM/8ZpCv+/aQ35sXAk0654
MZOncipflHBAMYF8ewn///8B////Af///wH///8B////Af///wH///8BkGQwI6BwQVOohWV/uZJbwdmo
Re/0wTb//9Ax///VNv//1z3//9lD///aPP//2Df//uSLe/3sqA////8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B1bWZDbmCU2mtXxznq04A/7dfC/+7ZRH/vmYQ/8Jo
EP/Kaw7/0HMO/9J8EfnPghfpyIcjx7+NOqO9iziHwJJDcdWkTGXbo0NjyJlKbbqSUYG9lFKZxplSu9Sn
WOPntVL19r49//3FK///yin//80w///RNv//1j3//9o4//7aSf392WeD/+eoFf///wH///8B////Af//
/wH///8B////Af///wH///8B////AaqakgWQgH03koJ8Jf///wH///8B////AcOZdQnJmXBftGkm2a1T
AP+4Xgf/v2YR/8FoEv/EaBH/ymwR/9J1Ef/bgBL/44kQ/+mSEPvomRX36p8c8e2nJO3vrCrt7a4y7++y
OPXztz379rtB//u/OP//wCn//8Eg///BJP//xSz//8sx///TMv/+0jH//NVI6/3aaHf923cT////Af//
/wH///8BjGI/D4ldQ0PGsaUH////Af///wH///8BtaiiB6WMgG9zMyDZh1VHrZ2QiTH///8B////Af//
/wHUspMH0quFPbt9RKmsVQT/tlcA/8BjCf/FahH/ym4V/8xwFf/RdxP/2X8T/+CHFf/nkhb/7ZgW//Cc
F//yoxv/9aog//ivJf/5siT/+rMh//u0Hf/8tx7//bwj///BJv//xyX//80p//vKLv/2ykzD+NBpWfvZ
cA3///8B////Af///wGCWkITmWsvlbOCKdOuh1mTyLWqD////wH///8Bp4+GbXc0F+19KQD/hjgM+4JS
O7VyW1Uz////Af///wH///8B////AcGPYB+1eEB5uXY117hhD//BYgb/yWoJ/9FzD//XfBb/2IEZ/9uF
GP/gihj/448Z/+eVGv/rmxv/7qAb//GkHP/zqh7/97Ah//y4Iv//vSD//8Aa///EHv/9xCP/8rgu7e26
W5PwxnYz9s9yB////wH///8B////AaWLhBWZbTmZ1aw39e/aSP/SpzL3roVYl9K+txH///8BgEco73Yo
AP+IQAb/i0AE/4Y5Bft7Px7HfmpjT////wH///8B////Af///wG7iFkNwI9fObh3Pn+3bizJu2YT+8hr
CP/ScgT/2nwJ/+GIDf/nkBL/7JcW/+6eG//xoxr/9qoa//iuGf/5sRj//LQU//+4F//8uh7/9bMi/+in
Ld3krVmV4qdQT+m1ZxP///8B////Af///wH///8BnH1yNah9Q6vbsjv1++BS///oXP/74VL/1agy98io
fXv///8Bdi4A/382A/+JQgn/jEMI/5RFB/+SQQX/hUUb3YBnXHmJeG8P////Af///wH///8B////Abd+
TA+0d0Uvs3REX7h3RZ++czDRyHgg7dJ9GP/bhxv/4YwX/+GIBP/ljgj/7J8d/+6kIP/soyD/6qEm8+Wb
LdvdlTWz0ZNbc9CTVj3ao3QV5KlXA////wH///8B////Af///wGNZk5Zrn82xd69Ovn841X//+Rc//7d
Wf//5F7//NtF/+vMeLP///8Bh0wm528jAP+GPwX/jUQK/5JGCv+ZTAj/mUYC/4xCDe+AUDWjdmRiQ3Rd
UQP///8B////Af///wH///8BtnlQB7V+XRu2ek8xuYBZUbd2S3O6ai6Pv3Eunc+RV6XVk1GnzXopoc19
MJXNgkN/yohnW86MWznPhkEjyoxlC////wH///8B////Af///wH///8BhGFUL5NmN4+5iyzf5sk+/fzm
Vv//41r//t9b///fX//+3FL//91W+f7nmmX///8BvJ+FWYI/FNt4KgD/iUEG/5FIDf+WSgv/nlAL/6JP
B/+eSwj5kU8e23dJLZdhSkM7////Af///wH///8B////Af///wH///8BuYJoBbNzWA2xXi4VtWg2Gcya
fx3SmnMdwnAuG8JvMRfFdUwPx4NyB////wH///8B////Af///wH///8B////AXdcVimCWDl9qXkrydqx
MvX02EX//udT///iV///31r//+Fe//7eUf/+3WLx/9t0c//qpBH///8B0sGuBcCdg0+QVinVfTEA/41B
Bf+XTg7/nE8M/6NUDf+rWAv/rFcJ/6NRCveTUBzVg1g6l3pfTlN5d34T////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AZd+bweDZVU/jGVHg6R0
NMfKnCfx7Mk0//zfR///41L//+BS///fV///4Fr//t1N//7dWuv+4ohn/9yAEf///wH///8B////Ac6z
nQW2jm09l1sss4k+BP+RQQH/nVAO/6JUDv+pWQ3/rl4N/7NfDf+zXA3/rloP96thGt+nbTK7nXE9l5Zp
NG+Qbkk/ioF+F////wH///8B////Af///wH///8B////Af///wH///8Bl4Z8C5ZySDGZazdfoHVEi6+I
T6/Dkz7V1aIr8eq8Kv361DT//95C///eS///3k7//99W///eUv/+20X//t5pyf7hh1P+45YN////Af//
/wH///8B////Af///wG5lHUDsYdiI7CAV4uRRQn1kz8A/6JUDP+pWg//rl0O/7FfD/+1YA//umEO/79j
Dv/EaA79x3IS98l6Fu3IgR3XxogpwcSLL6/JjzKd0JY0j7Z9GoerdBGFyZEtjdCYN5nGlkOpx5ZBucyZ
O83Wojnl4Kwz9e21LPv3wCj//Mgp///RMP//1zz//9pE///eS///3lH//9tF//7bSv/+3m+l/uWeNf7i
lwf///8B////Af///wH///8B////Af///wH///8B////AcepjhG6j2lRpGUvw5pGAf+kUQX/r14P/7Jf
D/+0YA//t2ER/7xjEf/EZxD/ym0R/9B0Ev/YfRH/3ocR/eKPE/3plxX57Z4X9e6iF/PupRrz8ash9fGu
JvfxsCf79LIn/fe2J//7uib//r4l///BJP//xCX//8or///PM///1j3//9tF///bRP/+2T3//dxe1/3f
eWv+4Iob/uajA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wG+mXYFvZVuH7uK
YGulXSDfo08A/7FdCf+3Yg//uWIP/7xkEf/BZxL/x2wT/85yFP/TeBX/2H8W/92GFv/jjRb/55IY/+uY
Gv/wnxr/8qMa//SpHP/2rh//+LEf//q1IP/8uSL//bsk//6+JP//wib//8gs///QNP//1jj//9c4//7W
R+/+3nmB/eelK/3jjQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////AcGWcAW2gVMntH9OfaljJN+uWwr/uWEK/75iDP/DZg7/x20S/85zFP/VeRX/134W/9uE
F//hixj/5ZEZ/+iXGf/tnRv/8KId//KnHv/0rB7/97Af//q0Iv/9uiH//rwh//+/Iv//xCX//sop//7O
L//5z0Xr+NJpk/zXWS/+4IQL////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8Bt4ZaB7+Rah3Dl29VrW04qa5eG+e6ZBL7xWwP/85y
Df/Vdw//2H4S/92GFP/jjRb/6JIX/+yaGv/voBz/8aQb//OpG//2rhz/+bEc//u2Hv/8ux3//Lse//u6
I/3ztCvt7bREufDBcWn2ymMl+dJvC////wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wHDl28Dr3NBCbyO
bB+8kHJZrGo6m7RoKcfBbyLfy3gd6dSAGvPbhxr54I0b/eSRG//olxv/6p0e/eyiIPntpCLz7aQl6+qh
KuPjnjjR4J5IqeCoYW/isYEr57VoDe2/dgX///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wG9j24FsHpVDbaGciG1gGZJtXhRcblzQpG/cjapwXIsu71lGcO/YxTDyXcpvdCH
Oq/Rh0GZ0YpSe86PY1fUoogt3qqBEeKpZwf///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
/wEAAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8=
</value>
</data>
</root>

View File

@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Reflection;
namespace RegistrationAPI_Tester
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// Make sure all embedded Assemblies get loaded
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
#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 curAssemblyName = Assembly.GetExecutingAssembly().FullName.Split(',')[0];
String resourceName = curAssemblyName + ".Components." + new AssemblyName(args.Name).Name + ".dll";
//string[] resources = AssemblyW.SpecializedAssemblyInfo.GetAssemblyResourceNames(AssemblyW.AssemblyST.Entry);
var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
if (stream != null)
{
using (stream)
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
}
return null;
}
#endregion
#region Global Error Handlers
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Exception ex = (Exception)e.ExceptionObject;
String msg = "UnhandledException Occured: " + ex.Message + "\n\n" + ex.InnerException.Message;
MessageBox.Show(msg,
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error,
MessageBoxDefaultButton.Button1);
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Exception ex = e.Exception;
String msg = "Thread Exception Occured: " + ex.Message + "\n\n" + ex.InnerException.Message;
MessageBox.Show(msg,
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error,
MessageBoxDefaultButton.Button1);
}
#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("RegistrationAPI_Tester")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RegistrationAPI_Tester")]
[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("b59aa1c6-c350-4ed9-a9f4-4bc74e4448ab")]
// 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,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.269
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace RegistrationAPI_Tester.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RegistrationAPI_Tester.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

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

View File

@@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.269
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace RegistrationAPI_Tester.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@@ -0,0 +1,120 @@
<?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>{9C4B41FD-6889-4561-8236-C7F5F39529A1}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>RegistrationAPI_Tester</RootNamespace>
<AssemblyName>RegistrationAPI_Tester</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<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>
<PropertyGroup>
<ApplicationIcon>WiFi.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Configuration.Install" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
<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="..\PlutoServer.MSL\Configuration.cs">
<Link>Configuration.cs</Link>
</Compile>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</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>
<ItemGroup>
<Content Include="WiFi.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>copy /y "$(TargetPath)" "$(TargetDir)DiagnoseMobile.exe"</PostBuildEvent>
</PropertyGroup>
<!-- 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,11 @@
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\bin\Debug\RegistrationAPI_Tester.exe
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\bin\Debug\RegistrationAPI_Tester.pdb
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Debug\ResolveAssemblyReference.cache
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Debug\RegistrationAPI_Tester.MainForm.resources
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Debug\RegistrationAPI_Tester.Properties.Resources.resources
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Debug\ResGen.read.1.tlog
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Debug\ResGen.write.1.tlog
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Debug\RegistrationAPI_Tester.exe
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Debug\RegistrationAPI_Tester.pdb
C:\Users\Administrator\Projects\Pluto\Server\Target\Debug\RegistrationAPI_Tester.exe
C:\Users\Administrator\Projects\Pluto\Server\Target\Debug\RegistrationAPI_Tester.pdb

View File

@@ -0,0 +1,9 @@
C:\Users\Administrator\Projects\Pluto\Server\Target\Release\RegistrationAPI_Tester.exe
C:\Users\Administrator\Projects\Pluto\Server\Target\Release\RegistrationAPI_Tester.pdb
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Release\ResolveAssemblyReference.cache
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Release\RegistrationAPI_Tester.MainForm.resources
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Release\RegistrationAPI_Tester.Properties.Resources.resources
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Release\ResGen.read.1.tlog
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Release\ResGen.write.1.tlog
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Release\RegistrationAPI_Tester.exe
C:\Users\Administrator\Projects\Pluto\Server\RegistrationAPI_Tester\obj\x86\Release\RegistrationAPI_Tester.pdb