diff --git a/CASA/micasad/lib/communication/MiCasaRequestReply.cs b/CASA/micasad/lib/communication/MiCasaRequestReply.cs
deleted file mode 100644
index c15162ff..00000000
--- a/CASA/micasad/lib/communication/MiCasaRequestReply.cs
+++ /dev/null
@@ -1,191 +0,0 @@
-/***********************************************************************
- *
- * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; version 2.1
- * of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, Novell, Inc.
- *
- * To contact Novell about this file by physical or electronic mail,
- * you may find current contact information at www.novell.com.
- *
- ***********************************************************************/
-
-
-using System;
-using System.Text;
-using System.Runtime.Serialization.Formatters.Binary;
-using System.IO;
-
-using Novell.CASA.MiCasa.Common;
-
-namespace Novell.CASA.MiCasa.Communication
-{
- ///
- /// Summary description for MiCasaRequestReply.
- ///
- public class MiCasaRequestReply
- {
-
- //public const int VERB_GET_SECRET = 1;
- //public const int VERB_SET_SECRET = 2;
- //public const int VERB_GET_KEYCHAIN = 3;
- //public const int VERB_GET_STORE = 4;
- //public const int VERB_SET_KEYVALUE = 5;
- //public const int VERB_GET_KEYVALUE = 6;
- public const int VERB_SET_LINKED_KEY = 7;
- public const int VERB_GET_LINKED_KEYS = 8;
- public const int VERB_REMOVE_LINKED_KEY = 9;
- public const int VERB_WRITE_KEY = 10;
- public const int VERB_REMOVE_ALL_SECRETS = 11;
- public const int VERB_LOCK_STORE = 12;
- public const int VERB_UNLOCK_STORE = 13;
- public const int VERB_GET_STORE_STATUS = 14;
- public const int VERB_REMOVE_KEY = 15;
- public const int VERB_READ_KEY = 16;
- public const int VERB_GET_KEY_LIST = 17;
- public const int VERB_RESET_MASTER_PASSWORD = 18;
- public const int VERB_GET_SECRETIDS = 19;
- public const int VERB_VALIDATE_DESKTOP_PWD = 20;
- public const int VERB_EXPORT_SECRETS = 21;
- public const int VERB_ADD_XML_SECRETS = 22;
- public const int VERB_CHANGE_PERSIST_DIR = 23;
- public const int VERB_CREATE_POLICY_DIR = 24;
- public const int VERB_GET_CREATE_TIME = 25;
- public const int VERB_GET_MODIFIED_TIME = 26;
-
- public const int VERB_DUMP_LINKED_KEYS = 96;
- public const int VERB_CREATE_TEST_SECRETS = 97;
- public const int VERB_REMOVE_TEST_SECRETS = 98;
- public const int VERB_PING_MICASAD = 99;
-
- public MiCasaRequestReply()
- {
- //
- // TODO: Add constructor logic here
- //
- }
-
- public static object Send(int verb)
- {
- return Send(verb, null, null, null, null);
- }
-
- public static object Send(int verb, object wo)
- {
- return Send(verb, null, null, null, wo);
- }
-
- public static object Send(int verb,
- string sKeyChainID,
- string sSecretID,
- string sKeyID,
- object theObject)
- {
-
- // Lengths of message fields
- int MSGID_LEN = 2;
- int MSG_LEN = 4;
- WrappedObject request;
- WrappedObject reply = null;
-
- // open a client connection
- //IInterProcessConnection clientConnection = null;
-
- ClientChannel ipcChannel = IPCClientFactory.CreateClientConnection();
- ipcChannel.Open();
-
-
-
- try
- {
- // contruct and serialize the Message Object
- request = new WrappedObject(verb, sKeyChainID, sSecretID, sKeyID, theObject);
-
- BinaryFormatter formatter = new BinaryFormatter();
- MemoryStream ms = new MemoryStream();
- formatter.Serialize(ms, request);
- ms.Flush();
- ms.Position = 0;
-
- byte[] rawBytes = new byte[2+4+ms.Length];
-
- byte[] t = new byte[10];
-
- // set message id
- int destIndex = 0;
- ushort msgId = 20;
- t = BitConverter.GetBytes((ushort)msgId);
- Array.Copy(t,0,rawBytes,destIndex,MSGID_LEN);
- destIndex += MSGID_LEN;
-
- // set the object length
-//Poorna
- int msgLen = 2+4+(int)ms.Length;
-// int msgLen = (int)ms.Length;
- t = BitConverter.GetBytes(msgLen);
-// t = BitConverter.GetBytes(ms.Length);
- Array.Copy(t,0,rawBytes,destIndex,MSG_LEN);
- destIndex += MSG_LEN;
-
- // copy in the object
- Array.Copy(ms.GetBuffer(), 0, rawBytes, destIndex, ms.Length);
-
- //clientConnection = new ClientPipeConnection("MyPipe", ".");
- //clientConnection = new ClientPipeConnection(XTIER_RPC_PIPE, ".");
- //clientConnection.Connect();
-
- // write the bytes
- //clientConnection.WriteBytes(rawBytes);
- ipcChannel.Write(rawBytes);
-
- // read the bytes
- //byte[] returnBuffer = clientConnection.ReadBytes();
- byte[] returnBuffer = ipcChannel.Read();
-
- if (returnBuffer != null)
- {
- // deserialize MessageObject
- uint iMsgLen = BitConverter.ToUInt32(returnBuffer,0);
- ms = new MemoryStream(returnBuffer, 4, (int)iMsgLen);
- ms.Position = 0;
- reply = (WrappedObject)formatter.Deserialize(ms);
-
- if (reply.GetReturnCode() != 0)
- {
- ipcChannel.Close();
- throw new Exception(reply.GetReturnCode().ToString());
- }
-
- }
-
- // close the connection
- //clientConnection.Close();
- ipcChannel.Close();
-
-
- }
- catch (Exception)
- {
- //Console.WriteLine(e1.ToString());
- //clientConnection.Dispose();
- //throw new Exception(e1.ToString());
- }
-
- if (reply != null)
- return reply.GetObject();
- else
- return null;
- }
- }
- }
-
diff --git a/CASA/micasad/lib/communication/SAS.Designer.cs b/CASA/micasad/lib/communication/SAS.Designer.cs
new file mode 100644
index 00000000..3d178fbe
--- /dev/null
+++ b/CASA/micasad/lib/communication/SAS.Designer.cs
@@ -0,0 +1,52 @@
+namespace Novell.CASA.communication
+{
+ partial class SAS
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.SuspendLayout();
+ //
+ // SAS
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.SystemColors.ControlDark;
+ this.ClientSize = new System.Drawing.Size(292, 266);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "SAS";
+ this.Opacity = 0.8;
+ this.ShowInTaskbar = false;
+ this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/CASA/micasad/lib/communication/SAS.cs b/CASA/micasad/lib/communication/SAS.cs
new file mode 100644
index 00000000..3561e1f6
--- /dev/null
+++ b/CASA/micasad/lib/communication/SAS.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Novell.CASA.communication
+{
+ public partial class SAS: Form
+ {
+ public SAS()
+ {
+ InitializeComponent();
+ }
+ }
+}
\ No newline at end of file
diff --git a/CASA/micasad/lib/communication/UnixIPCClientChannel.cs b/CASA/micasad/lib/communication/UnixIPCClientChannel.cs
deleted file mode 100644
index 156f6d08..00000000
--- a/CASA/micasad/lib/communication/UnixIPCClientChannel.cs
+++ /dev/null
@@ -1,182 +0,0 @@
-/***********************************************************************
- *
- * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; version 2.1
- * of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, Novell, Inc.
- *
- * To contact Novell about this file by physical or electronic mail,
- * you may find current contact information at www.novell.com.
- *
- ***********************************************************************/
-
-using System;
-using System.Net;
-using System.IO;
-using System.Net.Sockets;
-using Mono.Unix;
-using System.Text;
-
-namespace Novell.CASA.MiCasa.Communication
-{
- ///
- /// Summary description for UnixIPCClientChannel.
- ///
- public class UnixIPCClientChannel : ClientChannel
- {
-
- private Socket mSocket = null;
- private string socketFileName = "/tmp/.novellCASA";
- private EndPoint sockEndPoint;
-
- public UnixIPCClientChannel()
- {
- }
-
- public void Open()
- {
- mSocket = new Socket(AddressFamily.Unix,
- SocketType.Stream,
- ProtocolType.IP);
-
- if (mSocket == null)
- {
- throw new Exception("could not get socket");
- }
-
- sockEndPoint = new UnixEndPoint(socketFileName);
- UnixFileSystemInfo sockFileInfo = new UnixFileInfo(socketFileName);
- UnixUserInfo sockFileOwner = sockFileInfo.OwnerUser;
-
- // root is the owner of the file "/tmp/.novellCASA"
- if (sockFileOwner.UserId == 0)
- {
- mSocket.Connect(sockEndPoint);
- }
- else
- {
- throw new Exception("not a valid miCASA service");
- }
-
- }
-
- public int Read(byte[] buf)
- {
- buf = Read();
-
- if (buf != null)
- {
- //Console.WriteLine("Bytes read = " + buf.Length);
- return buf.Length;
- }
- else
- return 0;
- }
-
- public byte[] Read()
- {
- byte[] returnBuffer = null;
- int bytesRecvd = 0;
-
- try
- {
- /* We need to read 'msgLen' to know how many bytes to
- * allocate.
- */
-
- byte[] msgIdBytes = new byte[2];
- bytesRecvd = mSocket.Receive(msgIdBytes);
- if (0 == bytesRecvd)
- {
- return null;
- }
- byte[] msgLenBytes = new byte[4];
- bytesRecvd = mSocket.Receive(msgLenBytes);
- if (0 == bytesRecvd)
- {
- return null;
- }
-
- uint msgLen = BitConverter.ToUInt32(msgLenBytes, 0);
- if (msgLen > 6)
- {
- byte[] buf = null;
- int bytesAvailable;
- int totalBytes = 0;
- int msgLencount = 0;
- string bufstring = null;
-
- // buffer for data
- MemoryStream ms = new MemoryStream();
-
- while (totalBytes < (msgLen - 6))
- {
- bytesAvailable = mSocket.Available;
- if (0 == bytesAvailable)
- {
- break;
- }
- buf = new byte[bytesAvailable];
- bytesRecvd = mSocket.Receive(buf);
- ms.Write(buf, 0, bytesRecvd);
-
- totalBytes = totalBytes + bytesAvailable;
- }
- if (totalBytes == 0)
- return null;
-
- byte[] finalbuf = ms.ToArray();
-
- int returnBufferLen = msgIdBytes.Length + msgLenBytes.Length + totalBytes;
- returnBuffer = new byte[returnBufferLen];
- Array.Copy(msgIdBytes, returnBuffer, 2);
- Array.Copy(msgLenBytes, 0, returnBuffer, 2, 4);
- Array.Copy(finalbuf, 0, returnBuffer, 6, finalbuf.Length);
- return returnBuffer;
- }
- else
- {
- returnBuffer = new byte[6];
- Array.Copy(msgIdBytes, returnBuffer, 2);
- Array.Copy(msgLenBytes, 0, returnBuffer, 2, 4);
- return returnBuffer;
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e.ToString());
- return null;
- }
- }
-
- public int Write(byte[] buf)
- {
- try
- {
- mSocket.Send(buf);
- //Console.WriteLine("Bytes written = " + buf.Length);
- return buf.Length;
- }
- catch (Exception e)
- {
- Console.WriteLine(e.ToString());
- return 0;
- }
- }
-
- public void Close()
- {
- mSocket.Close();
- }
- }
-}
diff --git a/CASA/micasad/lib/communication/WinIPCClientChannel.cs b/CASA/micasad/lib/communication/WinIPCClientChannel.cs
deleted file mode 100644
index ebe27f82..00000000
--- a/CASA/micasad/lib/communication/WinIPCClientChannel.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-/***********************************************************************
- *
- * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; version 2.1
- * of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, Novell, Inc.
- *
- * To contact Novell about this file by physical or electronic mail,
- * you may find current contact information at www.novell.com.
- *
- ***********************************************************************/
-
-
-using System;
-
-using AppModule.InterProcessComm;
-using AppModule.NamedPipes;
-
-namespace Novell.CASA.MiCasa.Communication
-{
- ///
- /// Summary description for WinIPCClientChannel.
- ///
- public class WinIPCClientChannel : ClientChannel
- {
-
- private static IInterProcessConnection clientConnection = null;
- private static string XTIER_RPC_PIPE = "SS_RPC_PIPE";
-
- public WinIPCClientChannel()
- {
-
- }
-
- public void Open()
- {
- if (clientConnection == null)
- {
- clientConnection = new ClientPipeConnection(XTIER_RPC_PIPE, ".");
- clientConnection.Connect();
- }
-
- }
-
- public int Read(byte[] buf)
- {
- buf = Read();
-
- if (buf != null)
- return 0;
- else
- return -1;
- }
-
- public byte[] Read()
- {
- byte[] returnBuffer;
-
- try
- {
- returnBuffer = clientConnection.ReadBytes();
- return returnBuffer;
- }
- catch (Exception e)
- {
- Console.WriteLine(e.ToString());
- return null;
- }
- }
-
- public int Write(byte[] buf)
- {
- try
- {
- clientConnection.WriteBytes(buf);
- return 0;
- }
- catch (Exception e)
- {
- Console.WriteLine(e.ToString());
- return -1;
- }
- }
-
- public void Close()
- {
-
- //clientConnection.Close();
- //clientConnection.Dispose();
- }
-
- }
-}
diff --git a/CASA/micasad/lib/communication/iss/MethodCall.cs b/CASA/micasad/lib/communication/iss/MethodCall.cs
new file mode 100644
index 00000000..28c66339
--- /dev/null
+++ b/CASA/micasad/lib/communication/iss/MethodCall.cs
@@ -0,0 +1,125 @@
+using System;
+using System.Collections;
+using System.Text;
+
+using System.Xml;
+
+namespace Novell.CASA
+{
+ class MethodCall
+ {
+ internal static string GetCard = "getCard";
+ internal static string GetSecurityToken = "getSecurityToken";
+
+ //private string m_methodname;
+ private Hashtable m_htParams = new Hashtable();
+ private ArrayList m_alReqClaims = new ArrayList();
+ private ArrayList m_alOptClaims = new ArrayList();
+
+ private XmlDocument m_doc = new XmlDocument();
+ private XmlNode m_methodCall;
+ private XmlNode m_methodName;
+ private XmlNode m_params;
+ private XmlNode m_param;
+ private XmlNode m_struct;
+
+
+ public MethodCall(string sMethodName)
+ {
+ //m_methodname = sMethodName;
+ //m_methodCall = m_doc.CreateNode(XmlNodeType.Element, "methodCall", "");
+ m_methodCall = m_doc.CreateElement("methodCall");
+
+ m_methodName = m_doc.CreateElement("methodName");
+ m_methodName.InnerText = sMethodName;
+
+ m_params = m_doc.CreateElement("params");
+ m_param = m_doc.CreateElement("param");
+ m_struct = m_doc.CreateElement("struct");
+
+ m_param.AppendChild(m_struct);
+ m_params.AppendChild(m_param);
+
+ m_methodCall.AppendChild(m_methodName);
+ m_methodCall.AppendChild(m_params);
+
+ m_doc.AppendChild(m_methodCall);
+
+ }
+
+
+ public void AddMember(string sName, string sValue)
+ {
+ XmlNode nodeMember = m_doc.CreateElement("member");
+
+ XmlNode nodeName = m_doc.CreateNode(XmlNodeType.Element, "name", null);
+ nodeName.InnerText = sName;
+
+ XmlNode nodeValue = m_doc.CreateNode(XmlNodeType.Element, "value", null);
+ nodeValue.InnerText = sValue;
+
+ nodeMember.AppendChild(nodeName);
+ nodeMember.AppendChild(nodeValue);
+
+ m_struct.AppendChild(nodeMember);
+ }
+
+
+ public void AddRequiredClaim(string sClaim)
+ {
+ m_alReqClaims.Add(sClaim);
+ }
+
+ public void AddOptionalClaim(string sOptClaim)
+ {
+ m_alOptClaims.Add(sOptClaim);
+ }
+
+ internal string GetXmlRpc()
+ {
+
+ // add claims to doc
+ if (m_alReqClaims.Count > 0)
+ {
+ AppendClaims("requiredclaims", m_alReqClaims);
+ }
+
+ if (m_alOptClaims.Count > 0)
+ {
+ AppendClaims("optionalclaims", m_alOptClaims);
+ }
+
+ return m_doc.InnerXml;
+// return null;
+
+ }
+
+ private void AppendClaims(string sClaimType, ArrayList al)
+ {
+
+ XmlNode member = m_doc.CreateNode(XmlNodeType.Element, "member", null);
+ XmlNode name = m_doc.CreateNode(XmlNodeType.Element, "name", null);
+ name.InnerText = sClaimType;
+
+ XmlNode array = m_doc.CreateElement("array");
+ XmlNode data = m_doc.CreateElement("data");
+ array.AppendChild(data);
+
+ foreach (string sClaim in al)
+ {
+ XmlNode valueNode = m_doc.CreateNode(XmlNodeType.Element, "value", null);
+ valueNode.InnerText = sClaim;
+ data.AppendChild(valueNode);
+ }
+
+ member.AppendChild(name);
+ member.AppendChild(array);
+
+ m_struct.AppendChild(member);
+
+ }
+
+
+
+ }
+}
diff --git a/CASA/micasad/lib/communication/server/AppHandler.cs b/CASA/micasad/lib/communication/server/AppHandler.cs
new file mode 100644
index 00000000..3f70cf07
--- /dev/null
+++ b/CASA/micasad/lib/communication/server/AppHandler.cs
@@ -0,0 +1,125 @@
+/***********************************************************************
+ *
+ * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail,
+ * you may find current contact information at www.novell.com.
+ *
+ ***********************************************************************/
+
+
+using System;
+using System.Collections;
+using System.Text;
+using Novell.CASA.MiCasa.Communication.Server;
+
+class AppHandler
+{
+ //Data
+ private IPCChannel clientChannel;
+
+ //Methods
+ internal AppHandler(IPCChannel ipcChannel)
+ {
+ clientChannel = ipcChannel;
+ //CSSSLogger.ExecutionTrace(this);
+ }
+
+ ~AppHandler()
+ {
+ //CSSSLogger.ExecutionTrace(this);
+ }
+
+ /* Starts servicing the application. This is called as soon
+ * as a new client connection is established.
+ */
+ internal int ServiceApp(RequestParser reqParser)
+ {
+ SSVerb verb = null;
+ //CSSSLogger.ExecutionTrace(this);
+
+ while(true)
+ {
+ byte[] buf = null;
+
+ try
+ {
+ buf = clientChannel.Read();
+ if( null == buf )
+ {
+ return RetCodes.SUCCESS;
+ }
+ //RequestParser reqParser = new RequestParser();
+ verb = reqParser.ParseRequest(buf);
+ //CSSSLogger.logbreak();
+ //CSSSLogger.DbgLog("SSCS going to sevice a :: ** " + verb.GetVerbName() + " **");
+
+
+ buf = verb.ProcessRequest();
+ if ( buf != null)
+ {
+ int retVal = clientChannel.Write(buf);
+ if(retVal < 0)
+ {
+// CSSSLogger.DbgLog("Write failed");
+ return RetCodes.FAILURE;
+ }
+ }
+ else
+ {
+ //There must always be something written back to client.
+ return RetCodes.FAILURE;
+ }
+ }
+// catch(CommunicationException e)
+// {
+// CSSSLogger.ExpLog(e.ToString());
+// throw e;
+// }
+ catch(FormatException e)
+ {
+// CSSSLogger.ExpLog(e.ToString());
+ throw e;
+ }
+ catch(Exception e)
+ {
+ // CSSSLogger.ExpLog(e.ToString());
+ throw e;
+ }
+
+ /* TBD define verb specific heirarchy of exceptions catch
+ * (Some processing problem)
+ */
+
+ finally
+ {
+// CSSSLogger.DbgLog("SSCS finished processing a SS Verb :: ** " + verb.GetVerbName() + " **");
+// CSSSLogger.logbreak();
+ }
+ }
+ }
+
+ internal class RetCodes
+ {
+ internal static int SUCCESS = 0;
+ internal static int FAILURE = -1;
+ internal static int LOAD_HIDDEN_ONLY = 1;
+ internal static int LOAD_ALL_EXCEPT_HIDDEN = 2;
+ internal static int WRITE_HIDDEN_ONLY = 3;
+ internal static int WRITE_ALL_EXCEPT_HIDDEN = 4;
+ internal static int WRITE_ALL = 5;
+ }
+}
diff --git a/CASA/micasad/lib/communication/IPCClientFactory.cs b/CASA/micasad/lib/communication/server/CommunicationFactory.cs
similarity index 63%
rename from CASA/micasad/lib/communication/IPCClientFactory.cs
rename to CASA/micasad/lib/communication/server/CommunicationFactory.cs
index 3e487562..493d130f 100644
--- a/CASA/micasad/lib/communication/IPCClientFactory.cs
+++ b/CASA/micasad/lib/communication/server/CommunicationFactory.cs
@@ -21,30 +21,32 @@
***********************************************************************/
using System;
-
-namespace Novell.CASA.MiCasa.Communication
+/* This class would have only static methods.
+ */
+namespace Novell.CASA.MiCasa.Communication.Server
{
- ///
- /// Summary description for IPCClientFactory.
- ///
- public class IPCClientFactory
- {
- private IPCClientFactory()
- {
- }
- public static ClientChannel CreateClientConnection()
- {
+public class CommunicationFactory
+{
+ /* Make the constructor private, to avoid instances of this
+ * class.
+ */
+ private CommunicationFactory()
+ {
+ }
+
+ /* This method must check for platform and return
+ * an appropriate class. As of now, it assumes platform as Linux.
+ */
+ public static Communication CreateCommunicationEndPoint()
+ {
#if LINUX
- return( new UnixIPCClientChannel());
+ return( new UnixCommunication());
#endif
#if W32
- return (new WinIPCClientChannel());
+ return (new WinCommunication());
#endif
- }
-
-
- }
+ }
+}
}
-
diff --git a/CASA/micasad/lib/communication/IClientChannel.cs b/CASA/micasad/lib/communication/server/ICommunication.cs
similarity index 77%
rename from CASA/micasad/lib/communication/IClientChannel.cs
rename to CASA/micasad/lib/communication/server/ICommunication.cs
index 0138551b..7a644f7d 100644
--- a/CASA/micasad/lib/communication/IClientChannel.cs
+++ b/CASA/micasad/lib/communication/server/ICommunication.cs
@@ -21,20 +21,17 @@
***********************************************************************/
using System;
-using System.Net;
-using System.Net.Sockets;
-//using sscs.communication.win.NamedPipes;
+/* This is an interface which would be implemented
+ * by UnixCommunication and WinCommunication.
+ */
-
-namespace Novell.CASA.MiCasa.Communication
+namespace Novell.CASA.MiCasa.Communication.Server
{
- public interface ClientChannel
- {
- void Open();
- int Read(byte[] buf);
- byte[] Read();
- int Write(byte[] buf);
- void Close();
- }
-}
\ No newline at end of file
+
+public interface Communication
+{
+ void StartCommunicationEndPoint();
+ void CloseCommunicationEndPoint();
+}
+}
diff --git a/CASA/micasad/lib/communication/server/IPCChannel.cs b/CASA/micasad/lib/communication/server/IPCChannel.cs
new file mode 100644
index 00000000..0fd9d275
--- /dev/null
+++ b/CASA/micasad/lib/communication/server/IPCChannel.cs
@@ -0,0 +1,62 @@
+/***********************************************************************
+ *
+ * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail,
+ * you may find current contact information at www.novell.com.
+ *
+ ***********************************************************************/
+
+using System;
+using System.Net;
+using System.Net.Sockets;
+#if W32
+using AppModule.NamedPipes;
+#endif
+
+namespace Novell.CASA.MiCasa.Communication.Server
+{
+
+abstract class IPCChannel
+{
+ /* This must check for the platform and return an
+ * appropriate IPCChannel.
+ */
+#if LINUX
+ internal static IPCChannel Create(Socket socket)
+ {
+ int platform = (int)Environment.OSVersion.Platform;
+ if(( platform ==4 ) || ( platform == 128 ))
+ return (new UnixIPCChannel(socket) ) ;
+ else
+ return null;
+ }
+
+#endif
+
+#if W32
+ internal static IPCChannel Create(ServerPipeConnection serverPipe)
+ {
+ return (new WinIPCChannel(serverPipe));
+ }
+#endif
+ abstract internal int Read(byte[] buf);
+ abstract internal byte[] Read();
+ abstract internal int Write(byte[] buf);
+ abstract internal void Close();
+
+}
+}
diff --git a/CASA/micasad/lib/communication/server/ISSVerb.cs b/CASA/micasad/lib/communication/server/ISSVerb.cs
new file mode 100644
index 00000000..85d9189e
--- /dev/null
+++ b/CASA/micasad/lib/communication/server/ISSVerb.cs
@@ -0,0 +1,55 @@
+/***********************************************************************
+ *
+ * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail,
+ * you may find current contact information at www.novell.com.
+ *
+ ***********************************************************************/
+
+using System;
+using System.Collections;
+using System.Text;
+using System.Threading;
+
+
+
+namespace Novell.CASA.MiCasa.Communication.Server
+ {
+
+ /*
+ * Defines the interfaces to be implemenetd by all Secret Store Verbs.
+ */
+ public interface SSVerb
+ {
+ /* Takes in the raw bytes and sets them for a Verb,
+ * so that the verb will execute in the bytes given.
+ * TBD: In case we are able to send the byte[] through constructor,
+ * we can avoid this interface.
+ */
+
+ void SetMessageContent(byte[] rawbytes);
+
+ /* Takes in the SecretStore Reeference and returns the correct SSVerb
+ */
+ byte[] ProcessRequest();
+
+ //Gives the name of operation performed.Can be used in case of error.
+ string GetVerbName();
+ }
+
+ }
+
diff --git a/CASA/micasad/lib/communication/verbs/CMWebClient.cs b/CASA/micasad/lib/communication/verbs/CMWebClient.cs
new file mode 100644
index 00000000..3ba1560f
--- /dev/null
+++ b/CASA/micasad/lib/communication/verbs/CMWebClient.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Specialized;
+using System.Text;
+using System.Net;
+using System.IO;
+
+using Novell.CASA.GUI;
+
+namespace Novell.CASA.communication
+{
+ class CMWebClient
+ {
+ private WebClient m_wc = new WebClient();
+ private Config m_config;
+
+ public CMWebClient(Config config)
+ {
+ m_config = config;
+ }
+
+ public byte[] GetData()
+ {
+ return GetData(null);
+ }
+
+ public byte[] GetData(byte[] baDataToSend)
+ {
+
+ try
+ {
+ string sISSAddr = m_config.GetConfigSetting("ISS_Address", "http://localhost:2020");
+ byte[] responseData;
+
+ if (baDataToSend != null)
+ {
+ responseData = m_wc.UploadData(sISSAddr, "POST", baDataToSend);
+ }
+ else
+ {
+ responseData = m_wc.DownloadData(sISSAddr);
+ }
+
+ //NameValueCollection form = new NameValueCollection();
+ //form.Add("MyName", "MyValue");
+ //byte[] responseData = m_wc.UploadValues("http://buydotcom:8080/auction/innerweb.jsp", form);
+ return responseData;
+ }
+ catch (Exception e)
+ {
+ e.ToString();
+
+ }
+
+ return null;
+
+ //byte[] new data = m_wc.UploadData("http://www.novell.com", "POST", responseData);
+
+ /*
+
+ Stream s = m_wc.OpenRead("http://buydotcom:8080/auction/innerweb.jsp");
+ StreamReader sr = new StreamReader(s);
+ string line = sr.ReadLine();
+ while (line != null)
+ {
+ Console.WriteLine(line);
+ line = sr.ReadLine();
+ }
+ */
+
+
+ }
+ }
+}
diff --git a/CASA/micasad/lib/communication/verbs/SelectCard.cs b/CASA/micasad/lib/communication/verbs/SelectCard.cs
new file mode 100644
index 00000000..1df2449c
--- /dev/null
+++ b/CASA/micasad/lib/communication/verbs/SelectCard.cs
@@ -0,0 +1,262 @@
+/***********************************************************************
+ *
+ * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail,
+ * you may find current contact information at www.novell.com.
+ *
+ ***********************************************************************/
+
+using System;
+using System.Collections;
+using System.Text;
+using System.Threading;
+
+using Novell.CASA.MiCasa.Communication.Server;
+using Novell.CASA.GUI;
+
+namespace casa.verbs
+{
+
+ /*
+ * This class is implementation of OpenSecretStore call.
+ * There will be one instance existing for every call made by the client.
+ */
+
+ internal class SelectCard : SSVerb
+ {
+ ushort msgId = 0;
+ uint inMsgLen = 0;
+ uint outMsgLen = 0;
+ uint ssVersion = 0;
+ uint ssNameLen = 0;
+ private string ssName; //Name of SecretStore to open
+ private byte[] inBuf;
+
+ private byte[] outBuf;
+ int retCode = 0;
+
+ private static int MAX_SS_NAME_LEN = 256;
+
+ /*
+ * This method sets the class member with the byte array received.
+ */
+
+ public void SetMessageContent(byte[] ipcBytes)
+ {
+ inBuf = ipcBytes;
+ }
+
+ /*
+ * This method does the actual implementation of OpenSecretStore
+ *
+ */
+
+ public byte[] ProcessRequest()
+ {
+ /* If an exception occurs in message format decoding,
+ * it is handled by AppHandler
+ */
+ string sCardSelected = null;
+ byte[] baToken = null;
+
+
+ //parse incoming data
+ uint iLenIssuerUri = 0;
+ uint iLenRecipientUrl = 0;
+ uint iLenRequiredClaims = 0;
+ uint iLenOptionalClaims = 0;
+ uint iLenTokenType = 0;
+ uint iLenPolicy = 0;
+
+ // get issuer
+ string sIssueUri = null;
+ iLenIssuerUri = BitConverter.ToUInt32(inBuf, 6);
+ if (iLenIssuerUri > 0)
+ {
+ byte[] baIssuerUri = new Byte[iLenIssuerUri];
+ Array.Copy(inBuf, 10, baIssuerUri, 0, iLenIssuerUri);
+ sIssueUri = Encoding.Unicode.GetString(baIssuerUri);
+ }
+
+ string sRecipientUrl = null;
+ iLenRecipientUrl = BitConverter.ToUInt32(inBuf, 6 + (4 + (int)iLenIssuerUri));
+ if (iLenRecipientUrl > 0)
+ {
+ byte[] baRecipentUrl = new byte[iLenRecipientUrl];
+ Array.Copy(inBuf, 10 + (4 + iLenIssuerUri), baRecipentUrl, 0, iLenRecipientUrl);
+ sRecipientUrl = Encoding.Unicode.GetString(baRecipentUrl);
+ }
+
+
+ // get requested claims
+ string sClaims = null;
+ iLenRequiredClaims = BitConverter.ToUInt32(inBuf, 6 + (4 + (int)iLenIssuerUri) + (4 + (int)iLenRecipientUrl));
+ if (iLenRequiredClaims > 0)
+ {
+ byte[] baRequiredClaims = new byte[iLenRequiredClaims];
+ Array.Copy(inBuf, 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl), baRequiredClaims, 0, iLenRequiredClaims);
+ sClaims = Encoding.Unicode.GetString(baRequiredClaims);
+ }
+
+ // get optional claims
+ string sOptClaims = null;
+ iLenOptionalClaims = BitConverter.ToUInt32(inBuf,
+ 6 +
+ (4 + (int)iLenIssuerUri) +
+ (4 + (int)iLenRecipientUrl) +
+ (4 + (int)iLenRequiredClaims));
+
+ if (iLenOptionalClaims > 0)
+ {
+ byte[] baOptClaims = new byte[iLenOptionalClaims];
+ Array.Copy(inBuf, 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl) + (4 + iLenRequiredClaims), baOptClaims, 0, iLenOptionalClaims);
+ sOptClaims = Encoding.Unicode.GetString(baOptClaims);
+ }
+
+ string sTokenType = null;
+ iLenTokenType = BitConverter.ToUInt32(inBuf,
+ 6 +
+ (4 + (int)iLenIssuerUri) +
+ (4 + (int)iLenRecipientUrl) +
+ (4 + (int)iLenRequiredClaims) +
+ (4 + (int)iLenOptionalClaims));
+
+ if (iLenTokenType > 0)
+ {
+ byte[] baTokenType = new byte[iLenTokenType];
+ Array.Copy(inBuf,
+ 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl) + (4 + iLenRequiredClaims) + (4 + iLenOptionalClaims),
+ baTokenType,
+ 0,
+ iLenTokenType);
+ sTokenType = Encoding.Unicode.GetString(baTokenType);
+
+ }
+
+
+ string sPolicy = null;
+ iLenPolicy = BitConverter.ToUInt32(inBuf,
+ 6 +
+ (4 + (int)iLenIssuerUri) +
+ (4 + (int)iLenRecipientUrl) +
+ (4 + (int)iLenRequiredClaims) +
+ (4 + (int)iLenOptionalClaims) +
+ (4 + (int)iLenTokenType));
+
+ if (iLenPolicy > 0)
+ {
+ byte[] baPolicy = new byte[iLenPolicy];
+ Array.Copy(inBuf,
+ 10 + (4 + iLenIssuerUri) + (4 + iLenRecipientUrl) + (4 + iLenRequiredClaims) + (4 + iLenOptionalClaims) + (4 + iLenTokenType),
+ baPolicy,
+ 0,
+ iLenPolicy);
+ sPolicy = Encoding.Unicode.GetString(baPolicy);
+ }
+
+ if (true)
+ {
+ // display Card Selector
+ CardSelector cs = new CardSelector();
+ //sCardSelected = cs.DisplaySelector();
+ baToken = cs.GetToken();
+
+ retCode = 0;
+ }
+ else
+ {
+
+ msgId = BitConverter.ToUInt16(inBuf, 0);
+ inMsgLen = BitConverter.ToUInt32(inBuf, 2);
+
+ if (inMsgLen != inBuf.Length)
+ throw new FormatException(" MsgLen sent does not match the length of the message received.");
+
+ ssVersion = BitConverter.ToUInt32(inBuf, 6);
+ ssNameLen = BitConverter.ToUInt32(inBuf, 10);
+
+ if (ssNameLen > MAX_SS_NAME_LEN)
+ throw new FormatException(" SecretStore Name length exceeds length allowed");
+
+ byte[] tempArr = new byte[ssNameLen];
+ Array.Copy(inBuf, 14, tempArr, 0, ssNameLen);
+ ssName = Encoding.UTF8.GetString(tempArr);
+
+ }
+
+ try
+ {
+ msgId = 0;
+ outMsgLen = 14;
+ if (baToken.Length > 0)
+ {
+ outBuf = new byte[14 + baToken.Length];
+ outMsgLen = 14 + (uint)baToken.Length;
+ }
+ else
+ {
+ outBuf = new byte[14];
+ }
+
+ byte[] t = new byte[10];
+
+ t = BitConverter.GetBytes((ushort)msgId);
+ Array.Copy(t,0,outBuf,0,2);
+
+ t = BitConverter.GetBytes((uint)outMsgLen);
+ Array.Copy(t,0,outBuf,2,4);
+
+ t = BitConverter.GetBytes((uint)ssVersion);
+ Array.Copy(t,0,outBuf,6,4);
+
+ t = BitConverter.GetBytes(retCode);
+ Array.Copy(t,0,outBuf,10,4);
+
+ // copy card selected if there is one
+ //if (sCardSelected != null)
+ //{
+ // byte[] baCard = Encoding.ASCII.GetBytes(sCardSelected);
+ // Array.Copy(baCard, 0, outBuf, 14, baCard.Length);
+ //}
+ if (baToken.Length > 0)
+ {
+ Array.Copy(baToken, 0, outBuf, 14, baToken.Length);
+ }
+
+
+
+
+ }
+ catch(Exception e)
+ {
+
+ throw new FormatException("Unable to form the response " + e.ToString());
+ }
+ return outBuf;
+ }
+
+
+ /*
+ * Gives the name of operation performed. Will be used in case
+ * of error.
+ */
+ public string GetVerbName()
+ {
+ return this.ToString();
+ }
+ }
+}
diff --git a/CASA/micasad/lib/communication/win/PipeManager.cs b/CASA/micasad/lib/communication/win/PipeManager.cs
new file mode 100644
index 00000000..5e2e65e8
--- /dev/null
+++ b/CASA/micasad/lib/communication/win/PipeManager.cs
@@ -0,0 +1,174 @@
+/***********************************************************************
+ *
+ * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail,
+ * you may find current contact information at www.novell.com.
+ *
+ ***********************************************************************/
+
+using System;
+using System.Collections;
+using System.Threading;
+using System.Web;
+using System.IO;
+using System.Configuration;
+using System.Diagnostics;
+
+using AppModule.InterProcessComm;
+using AppModule.NamedPipes;
+
+using Novell.CASA.MiCasa.Communication.Server;
+
+namespace Novell.CASA.MiCasa.Communication.win
+{
+
+ public class PipeManager : IChannelManager {
+
+ public Hashtable Pipes;
+
+ private uint NumberPipes = 16;
+ private uint OutBuffer = 65536; //512;
+ private uint InBuffer = 65536; //512;
+ private const int MAX_READ_BYTES = 15000;
+ private bool _listen = true;
+ public bool Listen {
+ get {
+ return _listen;
+ }
+ set {
+ _listen=value;
+ }
+ }
+ private int numChannels = 0;
+ private Hashtable _pipes = new Hashtable();
+
+ //private Thread MainThread;
+ private string CASA_RPC_PIPE = "\\\\.\\PIPE\\CASA_MANAGER";
+ private ManualResetEvent Mre;
+ private const int PIPE_MAX_STUFFED_TIME = 5000;
+
+ public object SyncRoot = new object();
+
+ public void Initialize() {
+ Pipes = Hashtable.Synchronized(_pipes);
+ Mre = new ManualResetEvent(false);
+ /*
+ MainThread = new Thread(new ThreadStart(Start));
+ MainThread.IsBackground = true;
+ MainThread.Name = "Main Pipe Thread";
+ MainThread.Start();
+ */
+ Thread.Sleep(1000);
+ }
+ public string HandleRequest(string request) {
+ string returnVal;
+
+ //Form1.ActivityRef.AppendText(request + Environment.NewLine);
+ returnVal = "Response to: " + request;
+
+ return returnVal;
+ }
+
+ public void Start() {
+ try {
+ while (_listen) {
+ int[] keys = new int[Pipes.Keys.Count];
+ Pipes.Keys.CopyTo(keys,0);
+ foreach (int key in keys) {
+ ServerNamedPipe serverPipe = (ServerNamedPipe)Pipes[key];
+ if (serverPipe != null && DateTime.Now.Subtract(serverPipe.LastAction).Milliseconds > PIPE_MAX_STUFFED_TIME && serverPipe.PipeConnection.GetState() != InterProcessConnectionState.WaitingForClient) {
+ serverPipe.Listen = false;
+ serverPipe.PipeThread.Abort();
+ RemoveServerChannel(serverPipe.PipeConnection.NativeHandle);
+ }
+ }
+ if (numChannels <= NumberPipes) {
+ ServerNamedPipe pipe = new ServerNamedPipe(CASA_RPC_PIPE, OutBuffer, InBuffer, MAX_READ_BYTES);
+
+ // register all verbs with this pipe
+
+
+ try {
+ pipe.Connect();
+ pipe.LastAction = DateTime.Now;
+ System.Threading.Interlocked.Increment(ref numChannels);
+ pipe.Start();
+ Pipes.Add(pipe.PipeConnection.NativeHandle, pipe);
+ }
+ catch (InterProcessIOException) {
+ RemoveServerChannel(pipe.PipeConnection.NativeHandle);
+ pipe.Dispose();
+ }
+ }
+ else {
+ Mre.Reset();
+ Mre.WaitOne(1000, false);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Exception starting server: "+e.ToString());
+ // Log exception
+ }
+ }
+ public void Stop() {
+ _listen = false;
+ Mre.Set();
+ try {
+ int[] keys = new int[Pipes.Keys.Count];
+ Pipes.Keys.CopyTo(keys,0);
+ foreach (int key in keys) {
+ ((ServerNamedPipe)Pipes[key]).Listen = false;
+ }
+ int i = numChannels * 3;
+ for (int j = 0; j < i; j++) {
+ StopServerPipe();
+ }
+ Pipes.Clear();
+ Mre.Close();
+ Mre = null;
+ }
+ catch {
+ // Log exception
+ }
+ }
+
+ public void WakeUp() {
+ if (Mre != null) {
+ Mre.Set();
+ }
+ }
+ private void StopServerPipe() {
+ try {
+ ClientPipeConnection pipe = new ClientPipeConnection(CASA_RPC_PIPE);
+ if (pipe.TryConnect()) {
+ pipe.Close();
+ }
+ } catch {
+ // Log exception
+ }
+ }
+
+ public void RemoveServerChannel(object param) {
+ int handle = (int)param;
+ System.Threading.Interlocked.Decrement(ref numChannels);
+ Pipes.Remove(handle);
+ this.WakeUp();
+ }
+ }
+}
\ No newline at end of file
diff --git a/CASA/micasad/lib/communication/win/ServerNamedPipe.cs b/CASA/micasad/lib/communication/win/ServerNamedPipe.cs
new file mode 100644
index 00000000..1b91169b
--- /dev/null
+++ b/CASA/micasad/lib/communication/win/ServerNamedPipe.cs
@@ -0,0 +1,132 @@
+/***********************************************************************
+ *
+ * Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; version 2.1
+ * of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail,
+ * you may find current contact information at www.novell.com.
+ *
+ ***********************************************************************/
+
+using System;
+using System.Threading;
+using System.IO;
+
+using AppModule.InterProcessComm;
+using AppModule.NamedPipes;
+
+using Novell.CASA.MiCasa.Communication.Server;
+
+
+namespace Novell.CASA.MiCasa.Communication.win
+{
+
+ public sealed class ServerNamedPipe : IDisposable {
+ internal Thread PipeThread;
+ internal ServerPipeConnection PipeConnection;
+ internal bool Listen = true;
+ internal DateTime LastAction;
+ private bool disposed = false;
+
+ private void PipeListener() {
+ CheckIfDisposed();
+ try {
+ Listen = true;
+ while (Listen) {
+ LastAction = DateTime.Now;
+
+ // Service Client (new code)
+ IPCChannel ipcChannel = IPCChannel.Create(PipeConnection);
+ AppHandler appHandler = new AppHandler(ipcChannel);
+
+ try
+ {
+ int retVal = appHandler.ServiceApp(new RequestParser());
+ }
+ catch(Exception)
+ {
+ ipcChannel.Close();
+ }
+
+ LastAction = DateTime.Now;
+ PipeConnection.Disconnect();
+ if (Listen) {
+ Connect();
+ }
+ WinCommunication.PipeManager.WakeUp();
+ }
+ }
+ catch (System.Threading.ThreadAbortException) { }
+ catch (System.Threading.ThreadStateException) { }
+ catch (Exception) {
+ // Log exception
+
+ }
+ finally {
+ this.Close();
+ }
+ }
+ internal void Connect() {
+ CheckIfDisposed();
+ PipeConnection.Connect();
+ }
+ internal void Close() {
+ CheckIfDisposed();
+ this.Listen = false;
+ WinCommunication.PipeManager.RemoveServerChannel(this.PipeConnection.NativeHandle);
+ this.Dispose();
+ }
+ internal void Start() {
+ CheckIfDisposed();
+ PipeThread.Start();
+ }
+ private void CheckIfDisposed() {
+ if(this.disposed) {
+ throw new ObjectDisposedException("ServerNamedPipe");
+ }
+ }
+ public void Dispose() {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+ private void Dispose(bool disposing) {
+ if(!this.disposed) {
+ PipeConnection.Dispose();
+ if (PipeThread != null) {
+ try {
+ PipeThread.Abort();
+ }
+ catch (System.Threading.ThreadAbortException) { }
+ catch (System.Threading.ThreadStateException) { }
+ catch (Exception) {
+ // Log exception
+ }
+ }
+ }
+ disposed = true;
+ }
+ ~ServerNamedPipe() {
+ Dispose(false);
+ }
+
+ internal ServerNamedPipe(string name, uint outBuffer, uint inBuffer, int maxReadBytes) {
+ PipeConnection = new ServerPipeConnection(name, outBuffer, inBuffer, maxReadBytes, false);
+ PipeThread = new Thread(new ThreadStart(PipeListener));
+ PipeThread.IsBackground = true;
+ PipeThread.Name = "Pipe Thread " + this.PipeConnection.NativeHandle.ToString();
+ LastAction = DateTime.Now;
+ }
+ }
+}
\ No newline at end of file