284 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| // ========================================================================
 | |
| // Copyright 2006 - Volian Enterprises, Inc. All rights reserved.          
 | |
| // Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | |
| // ------------------------------------------------------------------------
 | |
| // $Workfile: $     $Revision: $                                           
 | |
| // $Author: $   $Date: $                                                   
 | |
| //                                                                         
 | |
| // $History: $                                                             
 | |
| // ========================================================================
 | |
| 
 | |
| using System;
 | |
| using System.IO;
 | |
| using System.Xml;
 | |
| using System.Collections.Specialized;
 | |
| using System.Collections.Generic;
 | |
| using System.Drawing;
 | |
| using VEPROMS.CSLA.Library;
 | |
| 
 | |
| namespace Config
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// PrivateProfile opens a private profile string and stores it's contents in an xml document.
 | |
| 	/// </summary>
 | |
| 	public class PrivateProfile
 | |
| 	{
 | |
|         #region Log4Net
 | |
|         private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
 | |
|         #endregion
 | |
| 
 | |
| 		private string ppName;
 | |
| 		private XmlDocument  ppXml;
 | |
| 		private List<string> attr;
 | |
| 		private List<string> ele;
 | |
| 
 | |
| 		private XmlNode AddNode(XmlNode xParent, string sName, string sValue )
 | |
| 		{
 | |
| 			XmlNode nd=AddNode(xParent,sName);
 | |
| 			nd.Value=sValue;
 | |
| 			return nd;
 | |
| 		}
 | |
| 		private XmlNode AddNode(XmlNode xParent, string sName)
 | |
| 		{
 | |
| 			XmlNode nd;
 | |
| 			// Add a node
 | |
| 			string tsName = sName.Replace(' ', '_');
 | |
| 			nd=xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Element,tsName,"");
 | |
| 			xParent.AppendChild(nd);
 | |
| 			return nd;
 | |
| 		}
 | |
| 		private void AddAttribute(XmlNode xParent, string sName, string sValue)
 | |
| 		{
 | |
| 			XmlNode xa = xParent.Attributes.GetNamedItem(sName);
 | |
| 			// bug fix. 09/15/03
 | |
| 			// If there was a space after an equal sign, that space character
 | |
| 			// was becomming part of the value string (reading the user.CFG file).
 | |
| 			// This was giving us a "Must have semi-colon" error message.
 | |
| 			// We now strip spaces before and after any Attribute that is written.
 | |
| 			sValue = sValue.Trim(' ');
 | |
| 			sName = sName.Replace(' ', '_');
 | |
| 			sName = sName.Replace("\\", "_slash_");
 | |
| 			if (xParent.Name == "color")
 | |
| 			{
 | |
| 				string[] parts = sValue.Split(",".ToCharArray());
 | |
| 				sValue = ColorConfig.FindKnownColor(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2])).ToString();
 | |
| 			}
 | |
| 			// Add an attribute 
 | |
| 			if (sValue == "")
 | |
| 			{
 | |
| 				if (xa != null)
 | |
| 				{
 | |
| 					xParent.Attributes.RemoveNamedItem(sName);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if (xa == null)
 | |
| 				{
 | |
| 					xa = xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Attribute, sName, "");
 | |
| 					xParent.Attributes.SetNamedItem(xa);
 | |
| 				}
 | |
| 				xa.Value = sValue;
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 		private XmlNode AddSection(XmlNode xParent, string sSection)
 | |
| 		{
 | |
| 			// get the name. If it's not in the 'migrated elements' list, then
 | |
| 			// preface the name with a 'z'.
 | |
| 			string elename = sSection.Substring(1, sSection.IndexOf("]") - 1);
 | |
| 			while(elename.IndexOf(' ')>-1) elename = elename.Remove(elename.IndexOf(' '),1);
 | |
| 			if (!ele.Contains(elename.ToLower())) elename = 'z' + elename;
 | |
|             elename = elename.Replace("\\", "_slash_");
 | |
| 			// Add a section [name]
 | |
| 			XmlNode nd = AddNode(xParent, elename);
 | |
| 			//AddAttribute(nd,"name",sSection.Substring(1,sSection.IndexOf("]")-1));
 | |
| 			return nd;
 | |
| 		}
 | |
| 		private XmlNode AddSection_UC(XmlNode xParent, string sSection )
 | |
| 		{
 | |
| 			// Add a section [name]
 | |
| 			string name_uc = sSection.Substring(1,sSection.IndexOf("]")-1).ToUpper() + "__UC";
 | |
| 			XmlNode nd =AddNode(xParent,name_uc);
 | |
| 			// AddAttribute(nd,"name",name_uc);
 | |
| 			return nd;
 | |
| 		}
 | |
| 		private void  AddComment(XmlNode xParent, string sComment)
 | |
| 		{
 | |
| 			
 | |
| 			if(xParent.ChildNodes.Count > 0)
 | |
| 			{
 | |
| 				XmlNode ndlast=xParent.ChildNodes.Item(xParent.ChildNodes.Count-1);
 | |
| 				if(ndlast.Name=="comment")
 | |
| 				{
 | |
| 					XmlNode xa = ndlast.Attributes.GetNamedItem("text");
 | |
| 					xa.Value=xa.Value + "\r\n" + sComment;
 | |
| 					return;
 | |
| 				}
 | |
| 			}
 | |
| 			// Add a comment text
 | |
| 			XmlNode nd =AddNode(xParent,"comment");			
 | |
| 			AddAttribute(nd,"text",sComment);
 | |
| 		}
 | |
| 		private void  AddLine(XmlNode xParent, string sLine)
 | |
| 		{
 | |
| 			// Add a comment text
 | |
| 			XmlNode nd =AddNode(xParent,"line");			
 | |
| 			AddAttribute(nd,"text",sLine);
 | |
| 		}
 | |
| 		private void AddParam(XmlNode xParent, string sParam)
 | |
| 		{		
 | |
| 			int i = sParam.IndexOf("=");		
 | |
| 			// get the name. If it's not in the 'migrated attribute' list, then
 | |
| 			// preface the name with a 'z'.
 | |
| 			string attrname = sParam.Substring(0, i);
 | |
| 			while (attrname.IndexOf(' ') > -1) attrname = attrname.Remove(attrname.IndexOf(' '), 1);
 | |
| 			if (!attr.Contains(attrname.ToLower())) attrname = 'z' + attrname;
 | |
| 			string sValue=sParam.Substring(i+1);
 | |
| 			string sName = attrname.Trim(' ');
 | |
| 			sName = sName.Replace("id", "ID").Replace("name", "Name").Replace("number", "Number").Replace("text", "Text").Replace("other", "Other");
 | |
| 			AddAttribute(xParent, sName, sValue);
 | |
| 		}
 | |
| 		private void AddParam_UC(XmlNode xParent, string sParam)
 | |
| 		{
 | |
| 			int i = sParam.IndexOf("=");
 | |
| 			// add a param name=value
 | |
| 			string sName=sParam.Substring(0,i);
 | |
| 			string sValue=sParam.Substring(i+1);
 | |
| 			//XmlNode nd =AddNode(xParent,"paramUC");
 | |
| 			sName = sName.Trim(' ');
 | |
| 			AddAttribute(xParent, sName, sValue);
 | |
| 			//AddAttribute(nd,"name",sName.ToUpper()+"__UC");
 | |
| 			//AddAttribute(nd,"value",sValue);
 | |
| 		}
 | |
| 		private void LoadXML()
 | |
| 		{
 | |
| 			string sLine;
 | |
| 			ppXml.LoadXml("<Config/>");// initialize ppXml
 | |
| 			XmlNode  xmlTop=ppXml.DocumentElement;
 | |
| 			XmlNode  xmlNd=ppXml.DocumentElement;
 | |
| 			//XmlNode  xmlNd_UC=ppXml.DocumentElement;
 | |
| 			StreamReader myReader = new StreamReader(ppName);// Open file
 | |
| 			while( (sLine = myReader.ReadLine())!= null)// read line-by-line
 | |
| 			{
 | |
| 				// add structure
 | |
| 				try
 | |
| 				{
 | |
| 					if (sLine.Length > 0)
 | |
| 					{
 | |
| 						switch (sLine.Substring(0, 1))
 | |
| 						{
 | |
| 							case "[":
 | |
| 								xmlNd = AddSection(xmlTop, sLine);
 | |
| 								//xmlNd_UC=AddSection_UC(xmlTop, sLine);
 | |
| 								break;
 | |
| 							case ";":
 | |
| 								//AddComment(xmlNd, sLine);
 | |
| 								break;
 | |
| 							default:
 | |
| 								if (sLine.IndexOf("=") >= 0)
 | |
| 								{
 | |
| 									AddParam(xmlNd, sLine);
 | |
| 									//AddParam_UC(xmlNd_UC, sLine);
 | |
| 								}
 | |
| 								else
 | |
| 								{
 | |
| 									//AddLine(xmlNd, sLine);
 | |
| 								}
 | |
| 								break;
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				 catch (Exception ex)
 | |
| 				{
 | |
| 					log.ErrorFormat("error parsing .INI file: {0} - Directory: {1}", ex.Message,ppName);
 | |
| 				}
 | |
| 			}
 | |
| 			myReader.Close();
 | |
| 		}
 | |
| 		public PrivateProfile(string sFileName, List<string> listIni_EleName, List<string> listIni_AttrName)
 | |
| 		{
 | |
| 			ppName=sFileName;
 | |
| 			ppXml= new XmlDocument();
 | |
| 			attr = listIni_AttrName;
 | |
| 			ele = listIni_EleName;
 | |
| 			LoadXML();
 | |
| 		}
 | |
| 		~PrivateProfile()
 | |
| 		{
 | |
| 			// Clean-up
 | |
| 			// 
 | |
| 		}
 | |
| 		public string PrettyNode(XmlNode nd,int level)
 | |
| 		{
 | |
| 			string retval="";
 | |
| 			string prefix=new string(' ',level*2);
 | |
| 			if(nd.ChildNodes.Count > 0)
 | |
| 			{
 | |
| 				retval = prefix + "<" + nd.Name;
 | |
| 				for(int i=0;i<nd.Attributes.Count;i++)
 | |
| 				{
 | |
| 					retval=retval + " " + nd.Attributes.Item(i).Name + "='" + nd.Attributes.Item(i).Value + "'";
 | |
| 				}
 | |
| 				retval=retval+">";
 | |
| 				for(int i=0;i<nd.ChildNodes.Count;i++)
 | |
| 				{
 | |
| 					retval=retval+"\r\n"+PrettyNode(nd.ChildNodes.Item(i),level+1);
 | |
| 				}
 | |
| 				retval=retval+"\r\n" + prefix + "</" + nd.Name + ">";
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				retval = prefix + "<" + nd.Name;
 | |
| 				for(int i=0;i<nd.Attributes.Count;i++)
 | |
| 				{
 | |
| 					retval=retval + " " + nd.Attributes.Item(i).Name + "='" + nd.Attributes.Item(i).Value + "'";
 | |
| 				}
 | |
| 				retval=retval+"/>";
 | |
| 			}
 | |
| 			return retval;
 | |
| 		}
 | |
| 		public string PrettyXML()
 | |
| 		{
 | |
| 			return PrettyNode(ppXml.DocumentElement,0);
 | |
| 		}
 | |
| 		public XmlDocument XML()
 | |
| 		{
 | |
| 			// return XML Document
 | |
| 			return ppXml;
 | |
| 		}
 | |
| 		public override string ToString()
 | |
| 		{
 | |
| 			// return string
 | |
| 			return "";
 | |
| 		}
 | |
| 		public void Save()
 | |
| 		{
 | |
| 			SaveAs(ppName);
 | |
| 		}
 | |
| 		public void SaveAs(string sName)
 | |
| 		{
 | |
| 		}
 | |
| 		public string Attr(string sPath)
 | |
| 		{
 | |
| 			string retval="";
 | |
| 			XmlNode xn = ppXml.SelectSingleNode(sPath);
 | |
| 			if(xn != null)
 | |
| 			{
 | |
| 				string quots = xn.Value;
 | |
| 				if (quots.Substring(0,1)=="\"" && quots.Substring(quots.Length-1,1)=="\"")
 | |
| 					retval = quots.Substring(1,quots.Length-2);
 | |
| 				else
 | |
| 					retval=xn.Value;
 | |
| 			}
 | |
| 			return retval;
 | |
| 		}
 | |
| 
 | |
| 		public string Attr(string sSection, string sParameter)
 | |
| 		{
 | |
| 			string findstr = "/ini/sectionUC[@name='" + sSection.ToUpper() + "__UC']/paramUC[@name='" + sParameter.ToUpper() + "__UC']/@value";
 | |
| 			return Attr(findstr);
 | |
| 		}
 | |
| 	}
 | |
| }
 |