Initial revision

osa3 [2003-05-13 14:40:14]
Initial revision
Filename
discus2/csharpsrc/WindowsApplication1/App.ico
discus2/csharpsrc/WindowsApplication1/AssemblyInfo.cs
discus2/csharpsrc/WindowsApplication1/Form1.cs
discus2/csharpsrc/WindowsApplication1/Form1.resx
discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj
discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj.user
discus2/csharpsrc/WindowsApplication1/WindowsApplication1.sln
discus2/csharpsrc/WindowsApplication1/WindowsApplication1.suo
discus2/csharpsrc/WindowsApplication1/app.config
discus2/csharpsrc/WindowsApplication2/App.ico
discus2/csharpsrc/WindowsApplication2/AssemblyInfo.cs
discus2/csharpsrc/WindowsApplication2/Form1.cs
discus2/csharpsrc/WindowsApplication2/Form1.resx
discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj
discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj.user
discus2/csharpsrc/WindowsApplication2/WindowsApplication2.sln
discus2/csharpsrc/WindowsApplication2/WindowsApplication2.suo
discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.cs
discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.dll
discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1372724103.cs
discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.cs
discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.dll
discus2/csharpsrc/WindowsApplication2/bin/Debug/Interop.CAPICOM.dll
discus2/csharpsrc/WindowsApplication2/bin/Debug/Microsoft.Web.Services.dll
discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.dll
discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.pdb
discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.dll
discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.pdb
discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.exe
discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.pdb
discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.Form1.resources
discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe
discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe.incr
discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.pdb
discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.projdata
diff --git a/discus2/csharpsrc/WindowsApplication1/App.ico b/discus2/csharpsrc/WindowsApplication1/App.ico
new file mode 100644
index 0000000..3a5525f
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication1/App.ico differ
diff --git a/discus2/csharpsrc/WindowsApplication1/AssemblyInfo.cs b/discus2/csharpsrc/WindowsApplication1/AssemblyInfo.cs
new file mode 100644
index 0000000..177a4f0
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication1/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/discus2/csharpsrc/WindowsApplication1/Form1.cs b/discus2/csharpsrc/WindowsApplication1/Form1.cs
new file mode 100644
index 0000000..ad44874
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication1/Form1.cs
@@ -0,0 +1,731 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using System.IO;
+using System.Text;
+using PSL.TotalRecall;
+using PSL.Web.Services.DynamicProxy;
+using PSL.Web.Services.DynamicInvoke;
+using Microsoft.Web.Services;
+using Microsoft.Web.Services.Security;
+using Microsoft.Web.Services.Security.X509;
+using System.Net;
+using System.Xml;
+using PSL.TotalRecall.Util;
+
+namespace WindowsApplication1
+{
+	/// <summary>
+	/// Summary description for Form1.
+	/// </summary>
+	public class Form1 : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.GroupBox groupBox2;
+		private System.Windows.Forms.GroupBox groupBox3;
+		private System.Windows.Forms.GroupBox groupBox4;
+		private System.Windows.Forms.GroupBox groupBox5;
+		private System.Windows.Forms.GroupBox groupBox6;
+		private System.Windows.Forms.Button m_btnCreate;
+		private System.Windows.Forms.TextBox m_boxCreate;
+		private System.Windows.Forms.Button m_btnSelect;
+		private System.Windows.Forms.Button m_btnEnd;
+		private System.Windows.Forms.Button m_btnRefresh;
+		private System.Windows.Forms.Button m_btnReq;
+		private System.Windows.Forms.Button m_btnRef;
+		private System.Windows.Forms.Button m_btnTopic;
+		private System.Windows.Forms.Button m_btnInvite;
+		private System.Windows.Forms.ComboBox m_boxMtgs;
+		private System.Windows.Forms.ListBox m_boxParticipants;
+		private System.Windows.Forms.ListBox m_boxResources;
+		private System.Windows.Forms.TextBox m_boxTopic;
+		private System.Windows.Forms.TextBox m_boxInvite;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		/**
+		 * this constructor does the following:
+		 * 1.  read in the X.509 certificate from the machine store
+		 * 2.  get the localhost IP address
+		 * 3.  create an executor / executor context for the local InfoAgent
+		 * 4.  create the DAO objects to access contents in the database
+		 * 5.  update the existing meetings with all meetings in the database
+		 * */
+		public Form1()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			store = X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
+			store.OpenRead();
+
+			strMyId = "CN=Omar";
+			certCol = store.FindCertificateBySubjectName( strMyId );
+
+			cert = (X509Certificate) certCol[0];
+			certToken = new X509SecurityToken(cert);
+
+			me = new MeetingParticipant();
+			me.Name = cert.GetName();
+			me.Role = enuMeetingParticipantRole.Organizer;
+
+			strFileLocation = "TotalRecall/InfoAgent.asmx?wsdl";
+			string strHost = Dns.GetHostName();
+			IPHostEntry entry = Dns.Resolve(strHost);
+			string strIP = "";
+			if (entry.AddressList.Length > 0)
+			{
+				IPAddress addr = new IPAddress(entry.AddressList[0].Address);
+				strIP = addr.ToString();
+			}
+			else
+			{
+				m_boxInvite.Text = "ERROR getting host IP";
+				return;
+			}
+			StringBuilder strbldUrl = new StringBuilder(strIP);
+			strbldUrl.Append(strFileLocation);
+			me.Location = strbldUrl.ToString();
+
+
+			//create my infoagent
+			strMyUrl = "http://localhost/TotalRecall/InfoAgent.asmx?wsdl";
+
+			ProxyGenRequest pxyreq = new ProxyGenRequest();
+			pxyreq.ProxyPath = "";
+			pxyreq.ServiceName = "InfoAgent";
+			pxyreq.WsdlUrl = strMyUrl;
+
+			ProxyPolicyMutator mymutator = new ProxyPolicyMutator();
+			mymutator.ProxyName = pxyreq.ServiceName;
+
+			// Ensure the name of the file generated is unique
+			string strMySuffix = "";
+			int nMyCode = Guid.NewGuid().GetHashCode();
+			if( nMyCode < 0 )
+				nMyCode = nMyCode * -1;
+			strMySuffix = nMyCode.ToString();
+			pxyreq.ServiceName = pxyreq.ServiceName + "_" + strMySuffix;
+
+			ProxyGen myPxyGen = new ProxyGen();
+			myPxyGen.Mutator = mymutator;
+
+			string strMyAssembly = "";
+			try
+			{
+				strMyAssembly = myPxyGen.GenerateAssembly(pxyreq);
+			}
+			catch (Exception excep)
+			{
+				string strString = excep.Message;
+			}
+
+			myctx = new ExecContext();
+			myctx.ServiceName = pxyreq.Namespace + "." + mymutator.ProxyName;
+			myctx.Assembly = strMyAssembly;
+
+
+			myexec = new Executor();
+			myexec.Settings.ExpectSignedResponse = true;
+			myexec.Settings.SigningCertificate = cert;
+
+			dbConnect = "DSN=TotalRecall;UID=TotalRecallUser;PWD=totalrecall;DATABASE=TotalRecall";
+
+			mDAO = new MeetingDAO(dbConnect);
+			pDAO = new ParticipantDAO(dbConnect);
+			rDAO = new ResourceDAO(dbConnect);
+			cDAO = new ContactDAO(dbConnect);
+
+			strSelectedMtg = "";
+			ArrayList lstMtgs = mDAO.GetMeetingIDs(enuMeetingState.Active);
+				foreach (string s in lstMtgs)
+				{
+					m_boxMtgs.Items.Add(s);
+				}
+
+		}
+
+
+		private Executor myexec;
+		private ExecContext myctx;
+		private MeetingParticipant me;
+
+		private X509CertificateStore store;
+		private X509CertificateCollection certCol;
+		private X509Certificate cert;
+		private X509SecurityToken certToken;
+
+		private string strMyUrl;
+		private string strFileLocation;
+		private string dbConnect;
+		private MeetingDAO mDAO;
+		private ParticipantDAO pDAO;
+		private ResourceDAO rDAO;
+		private ContactDAO cDAO;
+		private string strMyId;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region 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.m_btnRefresh = new System.Windows.Forms.Button();
+			this.m_btnInvite = new System.Windows.Forms.Button();
+			this.m_btnRef = new System.Windows.Forms.Button();
+			this.m_boxInvite = new System.Windows.Forms.TextBox();
+			this.m_boxResources = new System.Windows.Forms.ListBox();
+			this.m_boxTopic = new System.Windows.Forms.TextBox();
+			this.m_boxParticipants = new System.Windows.Forms.ListBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.groupBox1 = new System.Windows.Forms.GroupBox();
+			this.groupBox2 = new System.Windows.Forms.GroupBox();
+			this.groupBox3 = new System.Windows.Forms.GroupBox();
+			this.m_btnReq = new System.Windows.Forms.Button();
+			this.groupBox4 = new System.Windows.Forms.GroupBox();
+			this.m_btnTopic = new System.Windows.Forms.Button();
+			this.m_boxMtgs = new System.Windows.Forms.ComboBox();
+			this.m_btnCreate = new System.Windows.Forms.Button();
+			this.m_boxCreate = new System.Windows.Forms.TextBox();
+			this.groupBox5 = new System.Windows.Forms.GroupBox();
+			this.groupBox6 = new System.Windows.Forms.GroupBox();
+			this.m_btnEnd = new System.Windows.Forms.Button();
+			this.m_btnSelect = new System.Windows.Forms.Button();
+			this.groupBox1.SuspendLayout();
+			this.groupBox2.SuspendLayout();
+			this.groupBox3.SuspendLayout();
+			this.groupBox4.SuspendLayout();
+			this.groupBox5.SuspendLayout();
+			this.groupBox6.SuspendLayout();
+			this.SuspendLayout();
+			//
+			// m_btnRefresh
+			//
+			this.m_btnRefresh.Location = new System.Drawing.Point(96, 200);
+			this.m_btnRefresh.Name = "m_btnRefresh";
+			this.m_btnRefresh.TabIndex = 0;
+			this.m_btnRefresh.Text = "REFRESH";
+			this.m_btnRefresh.Click += new System.EventHandler(this.m_btnRefresh_Click);
+			//
+			// m_btnInvite
+			//
+			this.m_btnInvite.Location = new System.Drawing.Point(480, 32);
+			this.m_btnInvite.Name = "m_btnInvite";
+			this.m_btnInvite.TabIndex = 1;
+			this.m_btnInvite.Text = "INVITE";
+			this.m_btnInvite.Click += new System.EventHandler(this.m_btnInvite_Click);
+			//
+			// m_btnRef
+			//
+			this.m_btnRef.Location = new System.Drawing.Point(152, 208);
+			this.m_btnRef.Name = "m_btnRef";
+			this.m_btnRef.Size = new System.Drawing.Size(112, 23);
+			this.m_btnRef.TabIndex = 2;
+			this.m_btnRef.Text = "REFRESH";
+			this.m_btnRef.Click += new System.EventHandler(this.m_btnRef_Click);
+			//
+			// m_boxInvite
+			//
+			this.m_boxInvite.Location = new System.Drawing.Point(40, 32);
+			this.m_boxInvite.Name = "m_boxInvite";
+			this.m_boxInvite.Size = new System.Drawing.Size(376, 20);
+			this.m_boxInvite.TabIndex = 3;
+			this.m_boxInvite.Text = "ENTER PARTICIPANT URL HERE";
+			//
+			// m_boxResources
+			//
+			this.m_boxResources.HorizontalScrollbar = true;
+			this.m_boxResources.Location = new System.Drawing.Point(72, 24);
+			this.m_boxResources.Name = "m_boxResources";
+			this.m_boxResources.ScrollAlwaysVisible = true;
+			this.m_boxResources.Size = new System.Drawing.Size(120, 160);
+			this.m_boxResources.TabIndex = 4;
+			//
+			// m_boxTopic
+			//
+			this.m_boxTopic.Location = new System.Drawing.Point(32, 32);
+			this.m_boxTopic.Name = "m_boxTopic";
+			this.m_boxTopic.Size = new System.Drawing.Size(232, 20);
+			this.m_boxTopic.TabIndex = 6;
+			this.m_boxTopic.Text = "m_boxTopic";
+			//
+			// m_boxParticipants
+			//
+			this.m_boxParticipants.HorizontalScrollbar = true;
+			this.m_boxParticipants.Location = new System.Drawing.Point(72, 24);
+			this.m_boxParticipants.Name = "m_boxParticipants";
+			this.m_boxParticipants.ScrollAlwaysVisible = true;
+			this.m_boxParticipants.Size = new System.Drawing.Size(120, 147);
+			this.m_boxParticipants.TabIndex = 7;
+			//
+			// label1
+			//
+			this.label1.Font = new System.Drawing.Font("Century Gothic", 26.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(960, 72);
+			this.label1.TabIndex = 9;
+			this.label1.Text = "CONTEXT MANAGER";
+			this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+			//
+			// groupBox1
+			//
+			this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_btnInvite,
+																					this.m_boxInvite});
+			this.groupBox1.Location = new System.Drawing.Point(40, 440);
+			this.groupBox1.Name = "groupBox1";
+			this.groupBox1.Size = new System.Drawing.Size(592, 100);
+			this.groupBox1.TabIndex = 10;
+			this.groupBox1.TabStop = false;
+			this.groupBox1.Text = "INVITE PARTICIPANT";
+			//
+			// groupBox2
+			//
+			this.groupBox2.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_btnRefresh,
+																					this.m_boxParticipants});
+			this.groupBox2.Location = new System.Drawing.Point(368, 160);
+			this.groupBox2.Name = "groupBox2";
+			this.groupBox2.Size = new System.Drawing.Size(256, 256);
+			this.groupBox2.TabIndex = 11;
+			this.groupBox2.TabStop = false;
+			this.groupBox2.Text = "CURRENT PARTICIPANTS";
+			//
+			// groupBox3
+			//
+			this.groupBox3.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_btnRef,
+																					this.m_boxResources,
+																					this.m_btnReq});
+			this.groupBox3.Location = new System.Drawing.Point(672, 80);
+			this.groupBox3.Name = "groupBox3";
+			this.groupBox3.Size = new System.Drawing.Size(280, 256);
+			this.groupBox3.TabIndex = 12;
+			this.groupBox3.TabStop = false;
+			this.groupBox3.Text = "MEETING RESOURCES";
+			//
+			// m_btnReq
+			//
+			this.m_btnReq.Location = new System.Drawing.Point(16, 208);
+			this.m_btnReq.Name = "m_btnReq";
+			this.m_btnReq.Size = new System.Drawing.Size(112, 23);
+			this.m_btnReq.TabIndex = 19;
+			this.m_btnReq.Text = "REQUEST";
+			this.m_btnReq.Click += new System.EventHandler(this.m_btnReq_Click);
+			//
+			// groupBox4
+			//
+			this.groupBox4.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_btnTopic,
+																					this.m_boxTopic});
+			this.groupBox4.Location = new System.Drawing.Point(640, 384);
+			this.groupBox4.Name = "groupBox4";
+			this.groupBox4.Size = new System.Drawing.Size(304, 160);
+			this.groupBox4.TabIndex = 13;
+			this.groupBox4.TabStop = false;
+			this.groupBox4.Text = "CURRENT TOPIC";
+			//
+			// m_btnTopic
+			//
+			this.m_btnTopic.Location = new System.Drawing.Point(104, 88);
+			this.m_btnTopic.Name = "m_btnTopic";
+			this.m_btnTopic.Size = new System.Drawing.Size(104, 23);
+			this.m_btnTopic.TabIndex = 7;
+			this.m_btnTopic.Text = "CHANGE TOPIC";
+			this.m_btnTopic.Click += new System.EventHandler(this.m_btnTopic_Click);
+			//
+			// m_boxMtgs
+			//
+			this.m_boxMtgs.Location = new System.Drawing.Point(32, 32);
+			this.m_boxMtgs.Name = "m_boxMtgs";
+			this.m_boxMtgs.Size = new System.Drawing.Size(121, 21);
+			this.m_boxMtgs.TabIndex = 14;
+			this.m_boxMtgs.Text = "m_boxMtgs";
+			//
+			// m_btnCreate
+			//
+			this.m_btnCreate.Location = new System.Drawing.Point(240, 64);
+			this.m_btnCreate.Name = "m_btnCreate";
+			this.m_btnCreate.TabIndex = 15;
+			this.m_btnCreate.Text = "CREATE";
+			this.m_btnCreate.Click += new System.EventHandler(this.m_btnCreate_Click);
+			//
+			// m_boxCreate
+			//
+			this.m_boxCreate.Location = new System.Drawing.Point(24, 24);
+			this.m_boxCreate.Name = "m_boxCreate";
+			this.m_boxCreate.Size = new System.Drawing.Size(272, 20);
+			this.m_boxCreate.TabIndex = 16;
+			this.m_boxCreate.Text = "Enter text here";
+			//
+			// groupBox5
+			//
+			this.groupBox5.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_boxCreate,
+																					this.m_btnCreate});
+			this.groupBox5.Location = new System.Drawing.Point(24, 88);
+			this.groupBox5.Name = "groupBox5";
+			this.groupBox5.Size = new System.Drawing.Size(328, 100);
+			this.groupBox5.TabIndex = 17;
+			this.groupBox5.TabStop = false;
+			this.groupBox5.Text = "CREATE MEETING";
+			//
+			// groupBox6
+			//
+			this.groupBox6.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_btnEnd,
+																					this.m_btnSelect,
+																					this.m_boxMtgs});
+			this.groupBox6.Location = new System.Drawing.Point(88, 256);
+			this.groupBox6.Name = "groupBox6";
+			this.groupBox6.Size = new System.Drawing.Size(200, 168);
+			this.groupBox6.TabIndex = 18;
+			this.groupBox6.TabStop = false;
+			this.groupBox6.Text = "SELECT MEETING";
+			//
+			// m_btnEnd
+			//
+			this.m_btnEnd.Location = new System.Drawing.Point(56, 128);
+			this.m_btnEnd.Name = "m_btnEnd";
+			this.m_btnEnd.TabIndex = 16;
+			this.m_btnEnd.Text = "END MTG";
+			this.m_btnEnd.Click += new System.EventHandler(this.m_btnEnd_Click);
+			//
+			// m_btnSelect
+			//
+			this.m_btnSelect.Location = new System.Drawing.Point(56, 88);
+			this.m_btnSelect.Name = "m_btnSelect";
+			this.m_btnSelect.TabIndex = 15;
+			this.m_btnSelect.Text = "SELECT";
+			this.m_btnSelect.Click += new System.EventHandler(this.m_btnSelect_Click);
+			//
+			// Form1
+			//
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.ClientSize = new System.Drawing.Size(960, 573);
+			this.Controls.AddRange(new System.Windows.Forms.Control[] {
+																		  this.groupBox6,
+																		  this.groupBox5,
+																		  this.groupBox4,
+																		  this.groupBox3,
+																		  this.groupBox2,
+																		  this.groupBox1,
+																		  this.label1});
+			this.Name = "Form1";
+			this.Text = "ContextManager";
+			this.groupBox1.ResumeLayout(false);
+			this.groupBox2.ResumeLayout(false);
+			this.groupBox3.ResumeLayout(false);
+			this.groupBox4.ResumeLayout(false);
+			this.groupBox5.ResumeLayout(false);
+			this.groupBox6.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static void Main()
+		{
+			Application.Run(new Form1());
+		}
+
+		private void vScrollBar2_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
+		{
+
+		}
+
+		/**
+		 *
+		 * this method occurs when the "update topic" button is pressed....the topic is updated
+		 * in the Database using the MeetingDAO, and if that is successful, the new topic is
+		 * displayed in the topic field
+		 *
+		 * */
+		private void m_btnTopic_Click(object sender, System.EventArgs e)
+		{
+			string strNewTopic = m_boxTopic.Text;
+
+			if (mDAO.UpdateMeetingTopic(strSelectedMtg, strNewTopic))
+			{
+				//let us know if the update worked...
+				StringBuilder strTopic = new StringBuilder();
+				strTopic.Append("the new topic is: ");
+				strTopic.Append(strNewTopic);
+				UpdateTopic(strTopic.ToString());
+			}
+		}
+
+
+		private void UpdateTopic(string strT)
+		{
+			m_boxTopic.Text = strT.ToString();
+		}
+
+		/**
+		 * this method checks the ResourceDAO for all resources that are currently
+		 * listed for the current meeting, and refreshes the resource field in the GUI
+		 * */
+		private void m_btnRef_Click(object sender, System.EventArgs e)
+		{
+			UpdateResourcesList();
+		}
+
+		/**
+		 * this method checks the ParticipantDAO for all current participants in the
+		 * selected meeting, and refreshes the participant field
+		 * */
+		private void m_btnRefresh_Click(object sender, System.EventArgs e)
+		{
+			UpdateParticipantsList();
+		}
+
+		/**
+		 * this method invites a new participant into the selected meeting.  First, the participant
+		 * URL is grabbed from the Invite field and serialized.  Then the serialized URL is passed to
+		 * the InviteAgent method in the local InfoAgent.  The InviteAgent method first gets the signatures
+		 * of all of the existing participants, and then signs the message and sends it to the invitee
+		 * */
+		private void m_btnInvite_Click(object sender, System.EventArgs e)
+		{
+			//invite new participant to meeting:  strSelectedMtg
+			string strNewUrl = m_boxInvite.Text;
+			StringBuilder strTest = new StringBuilder();
+			strTest.Append("we are inviting: ");
+			strTest.Append(strNewUrl);
+			string strNewUrlSerialized = Serializer.Serialize(strNewUrl);
+			m_boxInvite.Text = strTest.ToString();
+
+
+			myctx.ClearParameters();
+			myctx.MethodName = "InviteAgent";
+
+			MeetingRequestMsg newMsg = new MeetingRequestMsg();
+			newMsg.Sender = cert.GetName();
+
+			newMsg.SenderUrl = strMyUrl;
+
+			ArrayList lstParticipants = pDAO.GetParticipants(strSelectedMtg);
+			foreach (MeetingParticipant mp in lstParticipants)
+			{
+				newMsg.m_lstParticipants.Add(mp);
+			}
+
+			newMsg.MeetingID = strSelectedMtg;
+			newMsg.MeetingTopic = mDAO.GetMeetingTopic(strSelectedMtg);
+
+			string strNewMsgSerialized = Serializer.Serialize(newMsg.ToXml());
+
+			myctx.AddParameter(strNewMsgSerialized);
+			myctx.AddParameter(strNewUrlSerialized);
+
+			object objectRes = null;
+
+			try
+			{
+				objectRes = myexec.Execute(myctx);
+			}
+			catch( Exception exc )
+			{
+				string strBsg = exc.Message;
+				return;
+			}
+
+			StringBuilder sbResult = new StringBuilder("Added ");
+			sbResult.Append(strNewUrl).Append(" to meeting list");
+			m_boxInvite.Text = sbResult.ToString();
+			UpdateParticipantsList();
+
+		}
+
+		/**
+		 * this button creates a new meeting
+		 * first it gets the meeting name from the appropriate field, and the
+		 * topic from the appropriate field.  Then, it calls the CreateMeeting method
+		 * on the local InfoAgent to create the meeting.  Upon success, it updates
+		 * the text fields with the new meeting.
+		* */
+		private void m_btnCreate_Click(object sender, System.EventArgs e)
+		{
+			string strMtgName = m_boxCreate.Text;
+			string strMtgTopic = m_boxTopic.Text;
+
+			string strMtgNameSerialized = Serializer.Serialize(strMtgName);
+			string strMtgTopicSerialized = Serializer.Serialize(strMtgTopic);
+
+			myctx.MethodName = "CreateMeeting";
+			myctx.AddParameter(strMtgNameSerialized);
+			myctx.AddParameter(strMtgTopicSerialized);
+
+			object objectResult = null;
+
+			try
+				{
+					objectResult = myexec.Execute(myctx);
+				}
+				catch( Exception except )
+				{
+					string strExcMsg = except.Message;
+					m_boxCreate.Text = strExcMsg;
+					return;
+				}
+
+
+			StringBuilder strBuild = new StringBuilder("Created meeting, name = ");
+			strBuild.Append(strMtgName);
+			strBuild.Append(", topic = ");
+			strBuild.Append(m_boxTopic.Text);
+			m_boxCreate.Text = strBuild.ToString();
+
+			m_boxMtgs.Items.Add(strMtgName);
+		}
+
+		private string strSelectedMtg;
+
+		/**
+		 * this button selects between available meetings.  First, if I am not
+		 * in the meeting that I have selected, I add myself to the meeting.  If that
+		 * does not work the GUI displays an error.  Otherwise, the new meeting is
+		 * selected and the participants list, resources list, and meeting topic are
+		 * updated
+		 * */
+		private void m_btnSelect_Click(object sender, System.EventArgs e)
+		{
+			strSelectedMtg = (string)m_boxMtgs.SelectedItem;
+
+			//make sure i'm in the meeting
+			if (!pDAO.IsInMeeting(strSelectedMtg, me))
+			{
+				if (!pDAO.AddMeetingParticipant(strSelectedMtg, me))
+				{
+					m_boxCreate.Text = "ERROR";
+					return;
+				}
+			}
+			StringBuilder strbuild = new StringBuilder ("selected ");
+			strbuild.Append(strSelectedMtg);
+			m_boxCreate.Text = strbuild.ToString();
+
+			UpdateParticipantsList();
+			UpdateResourcesList();
+
+			string strFoundTopic = mDAO.GetMeetingTopic(strSelectedMtg);
+			UpdateTopic(strFoundTopic);
+		}
+
+		private void UpdateParticipantsList()
+		{
+			m_boxParticipants.Items.Clear();
+
+			ArrayList lstParticipants = pDAO.GetParticipants(strSelectedMtg);
+			foreach (MeetingParticipant mp in lstParticipants)
+			{
+				StringBuilder strB = new StringBuilder(mp.Name);
+				strB.Append(" @ ");
+				strB.Append(mp.Location);
+
+				m_boxParticipants.Items.Add(strB.ToString());
+			}
+		}
+
+		private void UpdateResourcesList()
+		{
+			m_boxResources.Items.Clear();
+
+			Hashtable lstResources = rDAO.GetMeetingResources( strSelectedMtg );// rDAO.GetSharedResources(strSelectedMtg);
+			IDictionaryEnumerator it = lstResources.GetEnumerator();
+			while (it.MoveNext())
+			{
+				MeetingResource mr = (MeetingResource)it.Value;
+				StringBuilder strB2 = new StringBuilder(mr.Name);
+				strB2.Append(", ID = ");
+				strB2.Append(mr.ID);
+				strB2.Append(", URL = ");
+				strB2.Append(mr.Url);
+				strB2.Append(", owned by ");
+				strB2.Append(mr.Owner);
+				strB2.Append(", state = ");
+				strB2.Append(mr.State.ToString());
+				m_boxResources.Items.Add(strB2.ToString());
+			}
+
+		}
+
+		/**
+		 * this button, at this time, simply ends the selected meeting in the MeetingDAO
+		 * it does not, however, inform the meeting participants that the meeting
+		 * has ended (that would have been my next task)
+		 * */
+		private void m_btnEnd_Click(object sender, System.EventArgs e)
+		{
+			string strMtgtoEnd = (string)m_boxMtgs.SelectedItem;
+
+			if (mDAO.EndMeeting(strMtgtoEnd))
+			{
+				m_boxMtgs.Items.Remove(strMtgtoEnd);
+			}
+		}
+
+		/**
+		 * this method requests a resource to be added to the meeting, by sending
+		 * out a RecommendationRequest Context Message to the local InfoAgent
+		 * */
+		private void m_btnReq_Click(object sender, System.EventArgs e)
+		{
+			MeetingRequestMsg mtgReq = new MeetingRequestMsg();
+			mtgReq.MeetingID = strSelectedMtg;
+			mtgReq.MeetingTopic = mDAO.GetMeetingTopic(strSelectedMtg);
+			mtgReq.Sender = me.Name;
+			mtgReq.SenderUrl = strMyUrl;
+			mtgReq.m_lstParticipants = pDAO.GetParticipants(strSelectedMtg);
+			RecommendationRequestCtxMsg recReqCtxMsg = new RecommendationRequestCtxMsg(mtgReq);
+			recReqCtxMsg.Type = enuContextMsgType.RecommendationRequest;
+
+			string strS = recReqCtxMsg.ToXml();
+			myctx.ClearParameters();
+			myctx.MethodName = "RequestRecommendation";
+			myctx.AddParameter(Serializer.Serialize(strS));
+
+			Object objRes = null;
+			try
+			{
+				objRes = myexec.Execute(myctx);
+			}
+			catch (Exception ex)
+			{
+				string strExceptionMsg = ex.Message;
+			}
+		}
+
+	}
+}
diff --git a/discus2/csharpsrc/WindowsApplication1/Form1.resx b/discus2/csharpsrc/WindowsApplication1/Form1.resx
new file mode 100644
index 0000000..e5b5a11
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication1/Form1.resx
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+            Microsoft ResX Schema
+
+            Version 1.3
+
+            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">1.3</resheader>
+                <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+                <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+                <data name="Name1">this is my long string</data>
+                <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+                <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+                    [base64 mime encoded serialized .NET Framework object]
+                </data>
+                <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+                    [base64 mime encoded string representing a byte array form of the .NET Framework object]
+                </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="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>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="$this.Name">
+    <value>Form1</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj
new file mode 100644
index 0000000..7370f52
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj
@@ -0,0 +1,130 @@
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.0.9466"
+        SchemaVersion = "1.0"
+        ProjectGuid = "{3860201B-6D5C-4D7A-8E3C-8B7D4BAC5C52}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = "App.ico"
+                AssemblyKeyContainerName = ""
+                AssemblyName = "WindowsApplication1"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "WinExe"
+                RootNamespace = "WindowsApplication1"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "true"
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
+                />
+                <Reference
+                    Name = "System.Drawing"
+                    AssemblyName = "System.Drawing"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll"
+                />
+                <Reference
+                    Name = "System.Windows.Forms"
+                    AssemblyName = "System.Windows.Forms"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
+                />
+                <Reference
+                    Name = "PSL.TotalRecall"
+                    AssemblyName = "PSL.TotalRecall"
+                    HintPath = "U:\pslroot\psl\totalrecall\discus2\bin\PSL.TotalRecall.dll"
+                />
+                <Reference
+                    Name = "PSL.Web.Services"
+                    AssemblyName = "PSL.Web.Services"
+                    HintPath = "..\..\..\..\..\TotalRecall\pslroot\psl\totalrecall\discus2\bin\PSL.Web.Services.dll"
+                />
+                <Reference
+                    Name = "Microsoft.Web.Services"
+                    AssemblyName = "Microsoft.Web.Services"
+                    HintPath = "..\..\..\..\..\Program Files\Microsoft WSE\v1.0.2312\Microsoft.Web.Services.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "app.config"
+                    BuildAction = "None"
+                />
+                <File
+                    RelPath = "App.ico"
+                    BuildAction = "Content"
+                />
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Form1.cs"
+                    SubType = "Form"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Form1.resx"
+                    DependentUpon = "Form1.cs"
+                    BuildAction = "EmbeddedResource"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj.user b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj.user
new file mode 100644
index 0000000..d71802e
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.csproj.user
@@ -0,0 +1,48 @@
+<VisualStudioProject>
+    <CSHARP>
+        <Build>
+            <Settings ReferencePath = "C:\Program Files\Microsoft WSE\v1.0.2312\;C:\TotalRecall\pslroot\psl\totalrecall\discus2\bin\;U:\pslroot\psl\totalrecall\discus2\bin\" >
+                <Config
+                    Name = "Debug"
+                    EnableASPDebugging = "false"
+                    EnableASPXDebugging = "false"
+                    EnableUnmanagedDebugging = "false"
+                    EnableSQLServerDebugging = "false"
+                    RemoteDebugEnabled = "false"
+                    RemoteDebugMachine = ""
+                    StartAction = "Project"
+                    StartArguments = ""
+                    StartPage = ""
+                    StartProgram = ""
+                    StartURL = ""
+                    StartWorkingDirectory = ""
+                    StartWithIE = "false"
+                />
+                <Config
+                    Name = "Release"
+                    EnableASPDebugging = "false"
+                    EnableASPXDebugging = "false"
+                    EnableUnmanagedDebugging = "false"
+                    EnableSQLServerDebugging = "false"
+                    RemoteDebugEnabled = "false"
+                    RemoteDebugMachine = ""
+                    StartAction = "Project"
+                    StartArguments = ""
+                    StartPage = ""
+                    StartProgram = ""
+                    StartURL = ""
+                    StartWorkingDirectory = ""
+                    StartWithIE = "false"
+                />
+            </Settings>
+        </Build>
+        <OtherProjectSettings
+            CopyProjectDestinationFolder = ""
+            CopyProjectUncPath = ""
+            CopyProjectOption = "0"
+            ProjectView = "ProjectFiles"
+            ProjectTrust = "0"
+        />
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.sln b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.sln
new file mode 100644
index 0000000..bbd4b46
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsApplication1", "WindowsApplication1.csproj", "{3860201B-6D5C-4D7A-8E3C-8B7D4BAC5C52}"
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		ConfigName.0 = Debug
+		ConfigName.1 = Release
+	EndGlobalSection
+	GlobalSection(ProjectDependencies) = postSolution
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{3860201B-6D5C-4D7A-8E3C-8B7D4BAC5C52}.Debug.ActiveCfg = Debug|.NET
+		{3860201B-6D5C-4D7A-8E3C-8B7D4BAC5C52}.Debug.Build.0 = Debug|.NET
+		{3860201B-6D5C-4D7A-8E3C-8B7D4BAC5C52}.Release.ActiveCfg = Release|.NET
+		{3860201B-6D5C-4D7A-8E3C-8B7D4BAC5C52}.Release.Build.0 = Release|.NET
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.suo b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.suo
new file mode 100644
index 0000000..e1c3ddb
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication1/WindowsApplication1.suo differ
diff --git a/discus2/csharpsrc/WindowsApplication1/app.config b/discus2/csharpsrc/WindowsApplication1/app.config
new file mode 100644
index 0000000..e744075
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication1/app.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <configSections>
+    <section name="microsoft.web.services" type="Microsoft.Web.Services.Configuration.WebServicesConfiguration, Microsoft.Web.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
+  </configSections>
+  <microsoft.web.services>
+    <security>
+      <x509 allowTestRoot="true" verifyTrust="false" />
+    </security>
+  </microsoft.web.services>
+</configuration>
\ No newline at end of file
diff --git a/discus2/csharpsrc/WindowsApplication2/App.ico b/discus2/csharpsrc/WindowsApplication2/App.ico
new file mode 100644
index 0000000..3a5525f
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/App.ico differ
diff --git a/discus2/csharpsrc/WindowsApplication2/AssemblyInfo.cs b/discus2/csharpsrc/WindowsApplication2/AssemblyInfo.cs
new file mode 100644
index 0000000..177a4f0
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/discus2/csharpsrc/WindowsApplication2/Form1.cs b/discus2/csharpsrc/WindowsApplication2/Form1.cs
new file mode 100644
index 0000000..782b601
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/Form1.cs
@@ -0,0 +1,516 @@
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using System.IO;
+using System.Text;
+using PSL.TotalRecall;
+using PSL.Web.Services.DynamicProxy;
+using PSL.Web.Services.DynamicInvoke;
+using Microsoft.Web.Services;
+using Microsoft.Web.Services.Security;
+using Microsoft.Web.Services.Security.X509;
+using System.Net;
+using System.Xml;
+using PSL.TotalRecall.Util;
+
+namespace WindowsApplication2
+{
+	/// <summary>
+	/// Summary description for Form1.
+	/// </summary>
+	public class Form1 : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.GroupBox groupBox2;
+		private System.Windows.Forms.GroupBox groupBox3;
+		private System.Windows.Forms.Button m_btnRecall;
+		private System.Windows.Forms.Button m_btnSend;
+		private System.Windows.Forms.Button m_btnList;
+		private System.Windows.Forms.Button m_btnSelectMtg;
+		private System.Windows.Forms.Button m_btnRefMtg;
+		private System.Windows.Forms.ComboBox m_boxMtgs;
+		private System.Windows.Forms.ComboBox m_boxParticipants;
+		private System.Windows.Forms.ListBox m_boxResources;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+		/**
+		 * this is the constructor for the GUI, it does the following:
+		 * 1.  set up the DAO objects to access the local database
+		 * 2.  add any active meetings in the database to the field in the GUI
+		 * 3.  extract my X.509 certificate from the local store
+		 * 4.  instantiate 5 "dummy" resources, add them to resource list
+		* */
+		public Form1()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+
+			dbConnect = "DSN=TotalRecall;UID=TotalRecallUser;PWD=totalrecall;DATABASE=TotalRecall";
+
+			mDAO = new MeetingDAO(dbConnect);
+			pDAO = new ParticipantDAO(dbConnect);
+			rDAO = new ResourceDAO(dbConnect);
+			cDAO = new ContactDAO(dbConnect);
+			cmDAO = new ContextMsgDAO(dbConnect);
+
+			strSelectedMtg = "";
+			ArrayList lstMtgs = mDAO.GetMeetingIDs(enuMeetingState.Active);
+			foreach (string s in lstMtgs)
+			{
+				m_boxMtgs.Items.Add(s);
+			}
+
+			strMyUrl = "http://localhost/TotalRecall/InfoAgent.asmx?wsdl";
+
+			store = X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
+			store.OpenRead();
+
+			strMyName = "CN=Omar";
+			certCol = store.FindCertificateBySubjectName( strMyName );
+
+			cert = (X509Certificate) certCol[0];
+			certToken = new X509SecurityToken(cert);
+
+			lstResources = new ArrayList();
+			for (int i=0; i<5; i++)
+			{
+				Resource res = new Resource();
+				res.ID="res"+(i+1);
+				res.Name = "Foo" + (i+1)+ ".txt";
+				res.Url = "file:///c:\\"+res.Name;
+				rDAO.AddNewResource(res);
+				lstResources.Add(res);
+			}
+
+			foreach (Resource r in lstResources)
+			{
+				m_boxResources.Items.Add(r.ID);
+			}
+		}
+
+		private ArrayList lstResources;
+		private ContextMsgDAO cmDAO;
+		private MeetingDAO mDAO;
+		private ParticipantDAO pDAO;
+		private ResourceDAO rDAO;
+		private ContactDAO cDAO;
+
+		private string strSelectedMtg;
+		private string dbConnect;
+		private string strMyName;
+		private string strMyUrl;
+
+		private X509CertificateStore store;
+		private X509CertificateCollection certCol;
+		private X509Certificate cert;
+		private X509SecurityToken certToken;
+
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region 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.m_boxResources = new System.Windows.Forms.ListBox();
+			this.groupBox1 = new System.Windows.Forms.GroupBox();
+			this.m_btnRecall = new System.Windows.Forms.Button();
+			this.m_boxParticipants = new System.Windows.Forms.ComboBox();
+			this.m_btnSend = new System.Windows.Forms.Button();
+			this.m_btnList = new System.Windows.Forms.Button();
+			this.groupBox2 = new System.Windows.Forms.GroupBox();
+			this.groupBox3 = new System.Windows.Forms.GroupBox();
+			this.m_btnRefMtg = new System.Windows.Forms.Button();
+			this.m_btnSelectMtg = new System.Windows.Forms.Button();
+			this.m_boxMtgs = new System.Windows.Forms.ComboBox();
+			this.groupBox1.SuspendLayout();
+			this.groupBox2.SuspendLayout();
+			this.groupBox3.SuspendLayout();
+			this.SuspendLayout();
+			//
+			// m_boxResources
+			//
+			this.m_boxResources.Location = new System.Drawing.Point(32, 24);
+			this.m_boxResources.Name = "m_boxResources";
+			this.m_boxResources.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
+			this.m_boxResources.Size = new System.Drawing.Size(240, 251);
+			this.m_boxResources.TabIndex = 0;
+			//
+			// groupBox1
+			//
+			this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_boxResources});
+			this.groupBox1.Location = new System.Drawing.Point(352, 0);
+			this.groupBox1.Name = "groupBox1";
+			this.groupBox1.Size = new System.Drawing.Size(312, 280);
+			this.groupBox1.TabIndex = 1;
+			this.groupBox1.TabStop = false;
+			this.groupBox1.Text = "AVAILABLE RESOURCES";
+			//
+			// m_btnRecall
+			//
+			this.m_btnRecall.Location = new System.Drawing.Point(376, 288);
+			this.m_btnRecall.Name = "m_btnRecall";
+			this.m_btnRecall.Size = new System.Drawing.Size(256, 56);
+			this.m_btnRecall.TabIndex = 5;
+			this.m_btnRecall.Text = "recall selected resource(s)";
+			this.m_btnRecall.Click += new System.EventHandler(this.m_btnRecall_Click);
+			//
+			// m_boxParticipants
+			//
+			this.m_boxParticipants.Location = new System.Drawing.Point(16, 24);
+			this.m_boxParticipants.Name = "m_boxParticipants";
+			this.m_boxParticipants.Size = new System.Drawing.Size(304, 21);
+			this.m_boxParticipants.TabIndex = 2;
+			this.m_boxParticipants.Text = "Current Participants";
+			//
+			// m_btnSend
+			//
+			this.m_btnSend.Location = new System.Drawing.Point(8, 288);
+			this.m_btnSend.Name = "m_btnSend";
+			this.m_btnSend.Size = new System.Drawing.Size(336, 56);
+			this.m_btnSend.TabIndex = 3;
+			this.m_btnSend.Text = "check for resource requests and send selected resource(s)";
+			this.m_btnSend.Click += new System.EventHandler(this.m_btnSend_Click);
+			//
+			// m_btnList
+			//
+			this.m_btnList.Location = new System.Drawing.Point(24, 72);
+			this.m_btnList.Name = "m_btnList";
+			this.m_btnList.Size = new System.Drawing.Size(144, 23);
+			this.m_btnList.TabIndex = 4;
+			this.m_btnList.Text = "REFRESH LIST";
+			this.m_btnList.Click += new System.EventHandler(this.m_btnList_Click);
+			//
+			// groupBox2
+			//
+			this.groupBox2.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_boxParticipants,
+																					this.m_btnList});
+			this.groupBox2.Location = new System.Drawing.Point(16, 160);
+			this.groupBox2.Name = "groupBox2";
+			this.groupBox2.Size = new System.Drawing.Size(328, 120);
+			this.groupBox2.TabIndex = 5;
+			this.groupBox2.TabStop = false;
+			this.groupBox2.Text = "CURRENT PARTICIPANTS";
+			//
+			// groupBox3
+			//
+			this.groupBox3.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					this.m_btnRefMtg,
+																					this.m_btnSelectMtg,
+																					this.m_boxMtgs});
+			this.groupBox3.Location = new System.Drawing.Point(8, 8);
+			this.groupBox3.Name = "groupBox3";
+			this.groupBox3.Size = new System.Drawing.Size(336, 144);
+			this.groupBox3.TabIndex = 6;
+			this.groupBox3.TabStop = false;
+			this.groupBox3.Text = "MEETINGS";
+			//
+			// m_btnRefMtg
+			//
+			this.m_btnRefMtg.Location = new System.Drawing.Point(32, 88);
+			this.m_btnRefMtg.Name = "m_btnRefMtg";
+			this.m_btnRefMtg.Size = new System.Drawing.Size(128, 23);
+			this.m_btnRefMtg.TabIndex = 2;
+			this.m_btnRefMtg.Text = "refresh meetings";
+			this.m_btnRefMtg.Click += new System.EventHandler(this.m_btnRefMtg_Click);
+			//
+			// m_btnSelectMtg
+			//
+			this.m_btnSelectMtg.Location = new System.Drawing.Point(200, 88);
+			this.m_btnSelectMtg.Name = "m_btnSelectMtg";
+			this.m_btnSelectMtg.Size = new System.Drawing.Size(128, 23);
+			this.m_btnSelectMtg.TabIndex = 1;
+			this.m_btnSelectMtg.Text = "SELECT MEETING";
+			this.m_btnSelectMtg.Click += new System.EventHandler(this.m_btnSelectMtg_Click);
+			//
+			// m_boxMtgs
+			//
+			this.m_boxMtgs.Location = new System.Drawing.Point(16, 24);
+			this.m_boxMtgs.Name = "m_boxMtgs";
+			this.m_boxMtgs.Size = new System.Drawing.Size(312, 21);
+			this.m_boxMtgs.TabIndex = 0;
+			this.m_boxMtgs.Text = "m_boxMtgs";
+			//
+			// Form1
+			//
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.ClientSize = new System.Drawing.Size(672, 357);
+			this.Controls.AddRange(new System.Windows.Forms.Control[] {
+																		  this.groupBox3,
+																		  this.groupBox2,
+																		  this.m_btnSend,
+																		  this.groupBox1,
+																		  this.m_btnRecall});
+			this.Name = "Form1";
+			this.Text = "Form1";
+			this.groupBox1.ResumeLayout(false);
+			this.groupBox2.ResumeLayout(false);
+			this.groupBox3.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static void Main()
+		{
+			Application.Run(new Form1());
+		}
+
+		/**
+		 * this method sends a resource
+		 * first, it checks to see if any new resource request messages have arrived
+		 * into the ContextMessageDAO.  If so, then for each resource request, it
+		 * sends a resource response to the sender.  For each selected resource in the GUI,
+		 * it adds the resource to the resource response.  Next, it creates an Executor / Executor
+		 * Context to communicate with the InfoAgent that sent the message.  It then calls the Recommend
+		 * method on that InfoAgent that requested the resource, passing the selected resources (serialized)
+		 * in the parameter
+		 * */
+		private void m_btnSend_Click(object sender, System.EventArgs e)
+		{
+
+			//first i check for resource request messages
+			ArrayList lstNew = cmDAO.GetNewReceivedContextMessages();
+			IEnumerator it = lstNew.GetEnumerator();
+			while (it.MoveNext())
+			{
+				if (it.Current is RecommendationRequestCtxMsg)
+				{
+					RecommendationRequestCtxMsg recReq = (RecommendationRequestCtxMsg)it.Current;
+					RecommendationResponseCtxMsg respctxmsg = new RecommendationResponseCtxMsg(recReq);
+
+					ResourceMsg msg = new ResourceMsg();
+					msg.MeetingID = recReq.MeetingID;
+					msg.Sender = respctxmsg.Sender;
+					msg.SenderUrl = respctxmsg.SenderUrl;
+
+					foreach (string strSel in m_boxResources.SelectedItems)
+					{
+						foreach (Resource r in lstResources)
+						{
+							if (r.ID == strSel)
+							{
+								msg.m_lstResources.Add(r);
+							}
+						}
+
+					}
+
+						respctxmsg.ResourceMessage = msg;
+
+						string strResponse = Serializer.Serialize(respctxmsg.ToXml());
+						string strInfoagenturl = recReq.SenderUrl;
+
+						ProxyGenRequest pxyreq = new ProxyGenRequest();
+						pxyreq.ProxyPath = "";
+						pxyreq.ServiceName = "InfoAgent";
+						pxyreq.WsdlUrl = strInfoagenturl;
+
+						ProxyPolicyMutator mymutator = new ProxyPolicyMutator();
+						mymutator.ProxyName = pxyreq.ServiceName;
+
+						// Ensure the name of the file generated is unique
+						string strMySuffix = "";
+						int nMyCode = Guid.NewGuid().GetHashCode();
+						if( nMyCode < 0 )
+							nMyCode = nMyCode * -1;
+						strMySuffix = nMyCode.ToString();
+						pxyreq.ServiceName = pxyreq.ServiceName + "_" + strMySuffix;
+
+						ProxyGen myPxyGen = new ProxyGen();
+						myPxyGen.Mutator = mymutator;
+
+						string strMyAssembly = "";
+						try
+						{
+							strMyAssembly = myPxyGen.GenerateAssembly(pxyreq);
+						}
+						catch (Exception excep)
+						{
+							string strString = excep.Message;
+						}
+
+						ExecContext myctx = new ExecContext();
+						myctx.ServiceName = pxyreq.Namespace + "." + mymutator.ProxyName;
+						myctx.Assembly = strMyAssembly;
+
+						Executor myexec = new Executor();
+						myexec.Settings.ExpectSignedResponse = false;
+						myexec.Settings.SigningCertificate = cert;
+
+						myctx.MethodName = "Recommend";
+						myctx.AddParameter(strResponse);
+
+						object objectRes = null;
+
+						try
+						{
+							objectRes = myexec.Execute(myctx);
+						}
+						catch( Exception exc )
+						{
+							string strBsg = exc.Message;
+							return;
+						}
+					}
+			}
+		}
+		/**
+		 * this method simply refreshes the participant list by
+		 * checking the ParticipantDAO for the selected MeetingID
+		* */
+		private void m_btnList_Click(object sender, System.EventArgs e)
+		{
+			UpdateParticipantsList();
+		}
+
+		/**
+		 * this method selects between existing meetings.  When a meeting is
+		 * selected, the GUI updates itself with the newly selected meeting's
+		 * participant list
+		 * */
+		private void m_btnSelectMtg_Click(object sender, System.EventArgs e)
+		{
+			strSelectedMtg = (string)m_boxMtgs.SelectedItem;
+			UpdateParticipantsList();
+		}
+
+		/**
+		 * much like the method to send resources, this method is used to recall resources
+		 * that are being shared.  The resources to be recalled are the resources that are
+		 * selected in the GUI.  First, it creates a ResourceContextMsg and an Executor to
+		 * the local InfoAgent.  It then calls the RecallMyResources method on the local InfoAgent.
+		 * */
+		private void m_btnRecall_Click(object sender, System.EventArgs e)
+		{
+			ResourceCtxMsg rctx = new ResourceCtxMsg();
+			rctx.MeetingID = strSelectedMtg;
+			rctx.Sender = strMyName;
+			rctx.Type = enuContextMsgType.ResourceRecalled;
+			rctx.SenderUrl = strMyUrl;
+
+			foreach (string strSel in m_boxResources.SelectedItems)
+			{
+				rctx.AddResourceID(strSel);
+			}
+
+			string strResponse = Serializer.Serialize(rctx.ToXml());
+
+			ProxyGenRequest pxyreq = new ProxyGenRequest();
+			pxyreq.ProxyPath = "";
+			pxyreq.ServiceName = "InfoAgent";
+			pxyreq.WsdlUrl = strMyUrl;
+
+			ProxyPolicyMutator mymutator = new ProxyPolicyMutator();
+			mymutator.ProxyName = pxyreq.ServiceName;
+
+			// Ensure the name of the file generated is unique
+			string strMySuffix = "";
+			int nMyCode = Guid.NewGuid().GetHashCode();
+			if( nMyCode < 0 )
+				nMyCode = nMyCode * -1;
+			strMySuffix = nMyCode.ToString();
+			pxyreq.ServiceName = pxyreq.ServiceName + "_" + strMySuffix;
+
+			ProxyGen myPxyGen = new ProxyGen();
+			myPxyGen.Mutator = mymutator;
+
+			string strMyAssembly = "";
+			try
+			{
+				strMyAssembly = myPxyGen.GenerateAssembly(pxyreq);
+			}
+			catch (Exception excep)
+			{
+				string strString = excep.Message;
+			}
+
+			ExecContext myctx = new ExecContext();
+			myctx.ServiceName = pxyreq.Namespace + "." + mymutator.ProxyName;
+			myctx.Assembly = strMyAssembly;
+
+			Executor myexec = new Executor();
+			myexec.Settings.ExpectSignedResponse = false;
+			myexec.Settings.SigningCertificate = cert;
+
+			myctx.MethodName = "RecallMyResources";
+			myctx.AddParameter(strResponse);
+
+			object objectRes = null;
+
+			try
+			{
+				objectRes = myexec.Execute(myctx);
+			}
+			catch( Exception exc )
+			{
+				string strBsg = exc.Message;
+				return;
+			}
+		}
+
+		/**
+		 * this method checks the MeetingDAO and refreshes the list of active meetings
+		 * */
+		private void m_btnRefMtg_Click(object sender, System.EventArgs e)
+		{
+			ArrayList lstMtgs = mDAO.GetMeetingIDs(enuMeetingState.Active);
+			foreach (string s in lstMtgs)
+			{
+				if (m_boxMtgs.Items.Contains(s))
+					continue;
+
+				m_boxMtgs.Items.Add(s);
+			}
+		}
+
+		private void UpdateParticipantsList()
+		{
+			m_boxParticipants.Items.Clear();
+
+			ArrayList lstParticipants = pDAO.GetParticipants(strSelectedMtg);
+			foreach (MeetingParticipant mp in lstParticipants)
+			{
+				StringBuilder strB = new StringBuilder(mp.Name);
+				strB.Append(" @ ");
+				strB.Append(mp.Location);
+
+				m_boxParticipants.Items.Add(strB.ToString());
+			}
+		}
+	}
+}
diff --git a/discus2/csharpsrc/WindowsApplication2/Form1.resx b/discus2/csharpsrc/WindowsApplication2/Form1.resx
new file mode 100644
index 0000000..e5b5a11
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/Form1.resx
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+            Microsoft ResX Schema
+
+            Version 1.3
+
+            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">1.3</resheader>
+                <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+                <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+                <data name="Name1">this is my long string</data>
+                <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+                <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+                    [base64 mime encoded serialized .NET Framework object]
+                </data>
+                <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+                    [base64 mime encoded string representing a byte array form of the .NET Framework object]
+                </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="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>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="$this.Name">
+    <value>Form1</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj
new file mode 100644
index 0000000..f522050
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj
@@ -0,0 +1,126 @@
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.0.9466"
+        SchemaVersion = "1.0"
+        ProjectGuid = "{E5D02FE7-9B17-481B-ABA2-521F3FFE88DA}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = "App.ico"
+                AssemblyKeyContainerName = ""
+                AssemblyName = "WindowsApplication2"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "WinExe"
+                RootNamespace = "WindowsApplication2"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "true"
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
+                />
+                <Reference
+                    Name = "System.Drawing"
+                    AssemblyName = "System.Drawing"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll"
+                />
+                <Reference
+                    Name = "System.Windows.Forms"
+                    AssemblyName = "System.Windows.Forms"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
+                />
+                <Reference
+                    Name = "Microsoft.Web.Services"
+                    AssemblyName = "Microsoft.Web.Services"
+                    HintPath = "..\..\..\..\..\Program Files\Microsoft WSE\v1.0.2312\Microsoft.Web.Services.dll"
+                />
+                <Reference
+                    Name = "PSL.TotalRecall"
+                    AssemblyName = "PSL.TotalRecall"
+                    HintPath = "..\..\..\..\..\TotalRecall\pslroot\psl\totalrecall\discus2\bin\PSL.TotalRecall.dll"
+                />
+                <Reference
+                    Name = "PSL.Web.Services"
+                    AssemblyName = "PSL.Web.Services"
+                    HintPath = "..\..\..\..\..\TotalRecall\pslroot\psl\totalrecall\discus2\bin\PSL.Web.Services.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "App.ico"
+                    BuildAction = "Content"
+                />
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Form1.cs"
+                    SubType = "Form"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Form1.resx"
+                    DependentUpon = "Form1.cs"
+                    BuildAction = "EmbeddedResource"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj.user b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj.user
new file mode 100644
index 0000000..2c468af
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.csproj.user
@@ -0,0 +1,48 @@
+<VisualStudioProject>
+    <CSHARP>
+        <Build>
+            <Settings ReferencePath = "C:\TotalRecall\pslroot\psl\totalrecall\discus2\bin\" >
+                <Config
+                    Name = "Debug"
+                    EnableASPDebugging = "false"
+                    EnableASPXDebugging = "false"
+                    EnableUnmanagedDebugging = "false"
+                    EnableSQLServerDebugging = "false"
+                    RemoteDebugEnabled = "false"
+                    RemoteDebugMachine = ""
+                    StartAction = "Project"
+                    StartArguments = ""
+                    StartPage = ""
+                    StartProgram = ""
+                    StartURL = ""
+                    StartWorkingDirectory = ""
+                    StartWithIE = "false"
+                />
+                <Config
+                    Name = "Release"
+                    EnableASPDebugging = "false"
+                    EnableASPXDebugging = "false"
+                    EnableUnmanagedDebugging = "false"
+                    EnableSQLServerDebugging = "false"
+                    RemoteDebugEnabled = "false"
+                    RemoteDebugMachine = ""
+                    StartAction = "Project"
+                    StartArguments = ""
+                    StartPage = ""
+                    StartProgram = ""
+                    StartURL = ""
+                    StartWorkingDirectory = ""
+                    StartWithIE = "false"
+                />
+            </Settings>
+        </Build>
+        <OtherProjectSettings
+            CopyProjectDestinationFolder = ""
+            CopyProjectUncPath = ""
+            CopyProjectOption = "0"
+            ProjectView = "ProjectFiles"
+            ProjectTrust = "0"
+        />
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.sln b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.sln
new file mode 100644
index 0000000..b55433f
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsApplication2", "WindowsApplication2.csproj", "{E5D02FE7-9B17-481B-ABA2-521F3FFE88DA}"
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		ConfigName.0 = Debug
+		ConfigName.1 = Release
+	EndGlobalSection
+	GlobalSection(ProjectDependencies) = postSolution
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{E5D02FE7-9B17-481B-ABA2-521F3FFE88DA}.Debug.ActiveCfg = Debug|.NET
+		{E5D02FE7-9B17-481B-ABA2-521F3FFE88DA}.Debug.Build.0 = Debug|.NET
+		{E5D02FE7-9B17-481B-ABA2-521F3FFE88DA}.Release.ActiveCfg = Release|.NET
+		{E5D02FE7-9B17-481B-ABA2-521F3FFE88DA}.Release.Build.0 = Release|.NET
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.suo b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.suo
new file mode 100644
index 0000000..647d353
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/WindowsApplication2.suo differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.cs b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.cs
new file mode 100644
index 0000000..f280bb1
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.cs
@@ -0,0 +1,341 @@
+namespace DynamicPxy {
+    using System.Diagnostics;
+    using System.Xml.Serialization;
+    using System;
+    using System.Web.Services.Protocols;
+    using System.ComponentModel;
+    using System.Web.Services;
+    using Microsoft.Web.Services;
+    using Microsoft.Web.Services.Security;
+
+
+    /// <remarks/>
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Web.Services.WebServiceBindingAttribute(Name="InfoAgentSoap", Namespace="http://tempuri.org/")]
+    public class InfoAgent : Microsoft.Web.Services.WebServicesClientProtocol {
+
+        /// <remarks/>
+        public InfoAgent() {
+            this.Url = "http://localhost/TotalRecall/InfoAgent.asmx";
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/JoinMeeting", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string JoinMeeting(string strMeetingRequest, string strVouchers) {
+            object[] results = this.Invoke("JoinMeeting", new object[] {
+                        strMeetingRequest,
+                        strVouchers});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginJoinMeeting(string strMeetingRequest, string strVouchers, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("JoinMeeting", new object[] {
+                        strMeetingRequest,
+                        strVouchers}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndJoinMeeting(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/InviteAgent", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string InviteAgent(string strMeetingRequest, string strIAUrl) {
+            object[] results = this.Invoke("InviteAgent", new object[] {
+                        strMeetingRequest,
+                        strIAUrl});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginInviteAgent(string strMeetingRequest, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("InviteAgent", new object[] {
+                        strMeetingRequest,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndInviteAgent(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/SignMeetingRequest", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string SignMeetingRequest(string strMeetingRequest) {
+            object[] results = this.Invoke("SignMeetingRequest", new object[] {
+                        strMeetingRequest});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSignMeetingRequest(string strMeetingRequest, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SignMeetingRequest", new object[] {
+                        strMeetingRequest}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndSignMeetingRequest(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/CreateMeeting", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public bool CreateMeeting(string strMeetingID, string strTopic) {
+            object[] results = this.Invoke("CreateMeeting", new object[] {
+                        strMeetingID,
+                        strTopic});
+            return ((bool)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginCreateMeeting(string strMeetingID, string strTopic, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("CreateMeeting", new object[] {
+                        strMeetingID,
+                        strTopic}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public bool EndCreateMeeting(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((bool)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/InfoAgentContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void InfoAgentContextUpdate(string strIACtxMsg) {
+            this.Invoke("InfoAgentContextUpdate", new object[] {
+                        strIACtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginInfoAgentContextUpdate(string strIACtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("InfoAgentContextUpdate", new object[] {
+                        strIACtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndInfoAgentContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/MeetingContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void MeetingContextUpdate(string strMtgCtxMsg) {
+            this.Invoke("MeetingContextUpdate", new object[] {
+                        strMtgCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginMeetingContextUpdate(string strMtgCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("MeetingContextUpdate", new object[] {
+                        strMtgCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndMeetingContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/ContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void ContextUpdate(string strCtxResponse) {
+            this.Invoke("ContextUpdate", new object[] {
+                        strCtxResponse});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginContextUpdate(string strCtxResponse, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("ContextUpdate", new object[] {
+                        strCtxResponse}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendContextUpdate(string strCtxResponse, string strContactID, string strIAUrl) {
+            this.Invoke("SendContextUpdate", new object[] {
+                        strCtxResponse,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendContextUpdate(string strCtxResponse, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendContextUpdate", new object[] {
+                        strCtxResponse,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendInfoAgentContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendInfoAgentContextUpdate(string strIACtxMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendInfoAgentContextUpdate", new object[] {
+                        strIACtxMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendInfoAgentContextUpdate(string strIACtxMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendInfoAgentContextUpdate", new object[] {
+                        strIACtxMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendInfoAgentContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendMeetingContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendMeetingContextUpdate(string strMtgCtxMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendMeetingContextUpdate", new object[] {
+                        strMtgCtxMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendMeetingContextUpdate(string strMtgCtxMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendMeetingContextUpdate", new object[] {
+                        strMtgCtxMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendMeetingContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RequestRecommendation", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RequestRecommendation(string strRecommendationRequest) {
+            this.Invoke("RequestRecommendation", new object[] {
+                        strRecommendationRequest});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRequestRecommendation(string strRecommendationRequest, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RequestRecommendation", new object[] {
+                        strRecommendationRequest}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRequestRecommendation(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Recommend", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void Recommend(string strRecommendationResponse) {
+            this.Invoke("Recommend", new object[] {
+                        strRecommendationResponse});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecommend(string strRecommendationResponse, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("Recommend", new object[] {
+                        strRecommendationResponse}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecommend(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendResources(string strResMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendResources", new object[] {
+                        strResMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendResources(string strResMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendResources", new object[] {
+                        strResMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void AddResources(string strResMsg) {
+            this.Invoke("AddResources", new object[] {
+                        strResMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginAddResources(string strResMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("AddResources", new object[] {
+                        strResMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndAddResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RecallMyResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RecallMyResources(string strResCtxMsg) {
+            this.Invoke("RecallMyResources", new object[] {
+                        strResCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecallMyResources(string strResCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RecallMyResources", new object[] {
+                        strResCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecallMyResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RecallResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RecallResources(string strResCtxMsg) {
+            this.Invoke("RecallResources", new object[] {
+                        strResCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecallResources(string strResCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RecallResources", new object[] {
+                        strResCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecallResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+    }
+}
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.dll b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.dll
new file mode 100644
index 0000000..021d12b
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1239736828.dll differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1372724103.cs b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1372724103.cs
new file mode 100644
index 0000000..c3cc48e
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1372724103.cs
@@ -0,0 +1,341 @@
+namespace DynamicPxy {
+    using System.Diagnostics;
+    using System.Xml.Serialization;
+    using System;
+    using System.Web.Services.Protocols;
+    using System.ComponentModel;
+    using System.Web.Services;
+    using Microsoft.Web.Services;
+    using Microsoft.Web.Services.Security;
+
+
+    /// <remarks/>
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Web.Services.WebServiceBindingAttribute(Name="InfoAgentSoap", Namespace="http://tempuri.org/")]
+    public class InfoAgent : Microsoft.Web.Services.WebServicesClientProtocol {
+
+        /// <remarks/>
+        public InfoAgent() {
+            this.Url = "http://128.59.14.168/TotalRecall/InfoAgent.asmx";
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/JoinMeeting", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string JoinMeeting(string strMeetingRequest, string strVouchers) {
+            object[] results = this.Invoke("JoinMeeting", new object[] {
+                        strMeetingRequest,
+                        strVouchers});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginJoinMeeting(string strMeetingRequest, string strVouchers, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("JoinMeeting", new object[] {
+                        strMeetingRequest,
+                        strVouchers}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndJoinMeeting(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/InviteAgent", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string InviteAgent(string strMeetingRequest, string strIAUrl) {
+            object[] results = this.Invoke("InviteAgent", new object[] {
+                        strMeetingRequest,
+                        strIAUrl});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginInviteAgent(string strMeetingRequest, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("InviteAgent", new object[] {
+                        strMeetingRequest,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndInviteAgent(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/SignMeetingRequest", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string SignMeetingRequest(string strMeetingRequest) {
+            object[] results = this.Invoke("SignMeetingRequest", new object[] {
+                        strMeetingRequest});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSignMeetingRequest(string strMeetingRequest, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SignMeetingRequest", new object[] {
+                        strMeetingRequest}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndSignMeetingRequest(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/CreateMeeting", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public bool CreateMeeting(string strMeetingID, string strTopic) {
+            object[] results = this.Invoke("CreateMeeting", new object[] {
+                        strMeetingID,
+                        strTopic});
+            return ((bool)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginCreateMeeting(string strMeetingID, string strTopic, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("CreateMeeting", new object[] {
+                        strMeetingID,
+                        strTopic}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public bool EndCreateMeeting(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((bool)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/InfoAgentContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void InfoAgentContextUpdate(string strIACtxMsg) {
+            this.Invoke("InfoAgentContextUpdate", new object[] {
+                        strIACtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginInfoAgentContextUpdate(string strIACtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("InfoAgentContextUpdate", new object[] {
+                        strIACtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndInfoAgentContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/MeetingContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void MeetingContextUpdate(string strMtgCtxMsg) {
+            this.Invoke("MeetingContextUpdate", new object[] {
+                        strMtgCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginMeetingContextUpdate(string strMtgCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("MeetingContextUpdate", new object[] {
+                        strMtgCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndMeetingContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/ContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void ContextUpdate(string strCtxResponse) {
+            this.Invoke("ContextUpdate", new object[] {
+                        strCtxResponse});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginContextUpdate(string strCtxResponse, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("ContextUpdate", new object[] {
+                        strCtxResponse}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendContextUpdate(string strCtxResponse, string strContactID, string strIAUrl) {
+            this.Invoke("SendContextUpdate", new object[] {
+                        strCtxResponse,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendContextUpdate(string strCtxResponse, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendContextUpdate", new object[] {
+                        strCtxResponse,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendInfoAgentContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendInfoAgentContextUpdate(string strIACtxMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendInfoAgentContextUpdate", new object[] {
+                        strIACtxMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendInfoAgentContextUpdate(string strIACtxMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendInfoAgentContextUpdate", new object[] {
+                        strIACtxMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendInfoAgentContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendMeetingContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendMeetingContextUpdate(string strMtgCtxMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendMeetingContextUpdate", new object[] {
+                        strMtgCtxMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendMeetingContextUpdate(string strMtgCtxMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendMeetingContextUpdate", new object[] {
+                        strMtgCtxMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendMeetingContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RequestRecommendation", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RequestRecommendation(string strRecommendationRequest) {
+            this.Invoke("RequestRecommendation", new object[] {
+                        strRecommendationRequest});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRequestRecommendation(string strRecommendationRequest, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RequestRecommendation", new object[] {
+                        strRecommendationRequest}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRequestRecommendation(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Recommend", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void Recommend(string strRecommendationResponse) {
+            this.Invoke("Recommend", new object[] {
+                        strRecommendationResponse});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecommend(string strRecommendationResponse, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("Recommend", new object[] {
+                        strRecommendationResponse}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecommend(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendResources(string strResMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendResources", new object[] {
+                        strResMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendResources(string strResMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendResources", new object[] {
+                        strResMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void AddResources(string strResMsg) {
+            this.Invoke("AddResources", new object[] {
+                        strResMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginAddResources(string strResMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("AddResources", new object[] {
+                        strResMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndAddResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RecallMyResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RecallMyResources(string strResCtxMsg) {
+            this.Invoke("RecallMyResources", new object[] {
+                        strResCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecallMyResources(string strResCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RecallMyResources", new object[] {
+                        strResCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecallMyResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RecallResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RecallResources(string strResCtxMsg) {
+            this.Invoke("RecallResources", new object[] {
+                        strResCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecallResources(string strResCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RecallResources", new object[] {
+                        strResCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecallResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+    }
+}
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.cs b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.cs
new file mode 100644
index 0000000..c3cc48e
--- /dev/null
+++ b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.cs
@@ -0,0 +1,341 @@
+namespace DynamicPxy {
+    using System.Diagnostics;
+    using System.Xml.Serialization;
+    using System;
+    using System.Web.Services.Protocols;
+    using System.ComponentModel;
+    using System.Web.Services;
+    using Microsoft.Web.Services;
+    using Microsoft.Web.Services.Security;
+
+
+    /// <remarks/>
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Web.Services.WebServiceBindingAttribute(Name="InfoAgentSoap", Namespace="http://tempuri.org/")]
+    public class InfoAgent : Microsoft.Web.Services.WebServicesClientProtocol {
+
+        /// <remarks/>
+        public InfoAgent() {
+            this.Url = "http://128.59.14.168/TotalRecall/InfoAgent.asmx";
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/JoinMeeting", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string JoinMeeting(string strMeetingRequest, string strVouchers) {
+            object[] results = this.Invoke("JoinMeeting", new object[] {
+                        strMeetingRequest,
+                        strVouchers});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginJoinMeeting(string strMeetingRequest, string strVouchers, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("JoinMeeting", new object[] {
+                        strMeetingRequest,
+                        strVouchers}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndJoinMeeting(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/InviteAgent", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string InviteAgent(string strMeetingRequest, string strIAUrl) {
+            object[] results = this.Invoke("InviteAgent", new object[] {
+                        strMeetingRequest,
+                        strIAUrl});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginInviteAgent(string strMeetingRequest, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("InviteAgent", new object[] {
+                        strMeetingRequest,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndInviteAgent(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/SignMeetingRequest", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public string SignMeetingRequest(string strMeetingRequest) {
+            object[] results = this.Invoke("SignMeetingRequest", new object[] {
+                        strMeetingRequest});
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSignMeetingRequest(string strMeetingRequest, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SignMeetingRequest", new object[] {
+                        strMeetingRequest}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public string EndSignMeetingRequest(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((string)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapRpcMethodAttribute("http://tempuri.org/CreateMeeting", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/")]
+        public bool CreateMeeting(string strMeetingID, string strTopic) {
+            object[] results = this.Invoke("CreateMeeting", new object[] {
+                        strMeetingID,
+                        strTopic});
+            return ((bool)(results[0]));
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginCreateMeeting(string strMeetingID, string strTopic, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("CreateMeeting", new object[] {
+                        strMeetingID,
+                        strTopic}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public bool EndCreateMeeting(System.IAsyncResult asyncResult) {
+            object[] results = this.EndInvoke(asyncResult);
+            return ((bool)(results[0]));
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/InfoAgentContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void InfoAgentContextUpdate(string strIACtxMsg) {
+            this.Invoke("InfoAgentContextUpdate", new object[] {
+                        strIACtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginInfoAgentContextUpdate(string strIACtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("InfoAgentContextUpdate", new object[] {
+                        strIACtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndInfoAgentContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/MeetingContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void MeetingContextUpdate(string strMtgCtxMsg) {
+            this.Invoke("MeetingContextUpdate", new object[] {
+                        strMtgCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginMeetingContextUpdate(string strMtgCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("MeetingContextUpdate", new object[] {
+                        strMtgCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndMeetingContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/ContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void ContextUpdate(string strCtxResponse) {
+            this.Invoke("ContextUpdate", new object[] {
+                        strCtxResponse});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginContextUpdate(string strCtxResponse, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("ContextUpdate", new object[] {
+                        strCtxResponse}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendContextUpdate(string strCtxResponse, string strContactID, string strIAUrl) {
+            this.Invoke("SendContextUpdate", new object[] {
+                        strCtxResponse,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendContextUpdate(string strCtxResponse, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendContextUpdate", new object[] {
+                        strCtxResponse,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendInfoAgentContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendInfoAgentContextUpdate(string strIACtxMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendInfoAgentContextUpdate", new object[] {
+                        strIACtxMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendInfoAgentContextUpdate(string strIACtxMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendInfoAgentContextUpdate", new object[] {
+                        strIACtxMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendInfoAgentContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendMeetingContextUpdate", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendMeetingContextUpdate(string strMtgCtxMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendMeetingContextUpdate", new object[] {
+                        strMtgCtxMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendMeetingContextUpdate(string strMtgCtxMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendMeetingContextUpdate", new object[] {
+                        strMtgCtxMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendMeetingContextUpdate(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RequestRecommendation", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RequestRecommendation(string strRecommendationRequest) {
+            this.Invoke("RequestRecommendation", new object[] {
+                        strRecommendationRequest});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRequestRecommendation(string strRecommendationRequest, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RequestRecommendation", new object[] {
+                        strRecommendationRequest}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRequestRecommendation(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Recommend", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void Recommend(string strRecommendationResponse) {
+            this.Invoke("Recommend", new object[] {
+                        strRecommendationResponse});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecommend(string strRecommendationResponse, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("Recommend", new object[] {
+                        strRecommendationResponse}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecommend(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void SendResources(string strResMsg, string strContactID, string strIAUrl) {
+            this.Invoke("SendResources", new object[] {
+                        strResMsg,
+                        strContactID,
+                        strIAUrl});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginSendResources(string strResMsg, string strContactID, string strIAUrl, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("SendResources", new object[] {
+                        strResMsg,
+                        strContactID,
+                        strIAUrl}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndSendResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void AddResources(string strResMsg) {
+            this.Invoke("AddResources", new object[] {
+                        strResMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginAddResources(string strResMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("AddResources", new object[] {
+                        strResMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndAddResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RecallMyResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RecallMyResources(string strResCtxMsg) {
+            this.Invoke("RecallMyResources", new object[] {
+                        strResCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecallMyResources(string strResCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RecallMyResources", new object[] {
+                        strResCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecallMyResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+
+        /// <remarks/>
+        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/RecallResources", RequestNamespace="http://tempuri.org/", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
+        public void RecallResources(string strResCtxMsg) {
+            this.Invoke("RecallResources", new object[] {
+                        strResCtxMsg});
+        }
+
+        /// <remarks/>
+        public System.IAsyncResult BeginRecallResources(string strResCtxMsg, System.AsyncCallback callback, object asyncState) {
+            return this.BeginInvoke("RecallResources", new object[] {
+                        strResCtxMsg}, callback, asyncState);
+        }
+
+        /// <remarks/>
+        public void EndRecallResources(System.IAsyncResult asyncResult) {
+            this.EndInvoke(asyncResult);
+        }
+    }
+}
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.dll b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.dll
new file mode 100644
index 0000000..861b2a5
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/InfoAgent_1547569366.dll differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/Interop.CAPICOM.dll b/discus2/csharpsrc/WindowsApplication2/bin/Debug/Interop.CAPICOM.dll
new file mode 100644
index 0000000..feee46e
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/Interop.CAPICOM.dll differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/Microsoft.Web.Services.dll b/discus2/csharpsrc/WindowsApplication2/bin/Debug/Microsoft.Web.Services.dll
new file mode 100644
index 0000000..9733cda
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/Microsoft.Web.Services.dll differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.dll b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.dll
new file mode 100644
index 0000000..128df0d
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.dll differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.pdb b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.pdb
new file mode 100644
index 0000000..2398e67
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.TotalRecall.pdb differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.dll b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.dll
new file mode 100644
index 0000000..3be2b25
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.dll differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.pdb b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.pdb
new file mode 100644
index 0000000..1c164df
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/PSL.Web.Services.pdb differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.exe b/discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.exe
new file mode 100644
index 0000000..5c579a7
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.exe differ
diff --git a/discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.pdb b/discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.pdb
new file mode 100644
index 0000000..af3612b
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/bin/Debug/WindowsApplication2.pdb differ
diff --git a/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.Form1.resources b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.Form1.resources
new file mode 100644
index 0000000..f1e3c78
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.Form1.resources differ
diff --git a/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe
new file mode 100644
index 0000000..5c579a7
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe differ
diff --git a/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe.incr b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe.incr
new file mode 100644
index 0000000..02874c4
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.exe.incr differ
diff --git a/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.pdb b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.pdb
new file mode 100644
index 0000000..af3612b
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.pdb differ
diff --git a/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.projdata b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.projdata
new file mode 100644
index 0000000..66ada2b
Binary files /dev/null and b/discus2/csharpsrc/WindowsApplication2/obj/Debug/WindowsApplication2.projdata differ