⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clsxmlcreater.cs

📁 一个p2p的c#版源码
💻 CS
字号:
namespace WorkingWithXML
{
	// basic package includes
	using System;
    using System.Windows.Forms;
	using System.IO;
 
    ///    Creates requests and appropriate responses
    public class XMLCreater
    {
		// member variables for storing Apllication path of 
		// application that's using this class
		// and path to pick up share.ini from
		string ResponsPath;
		string SharedResourceInfoPath;

		// constructer to initiliaze both thses paths
        public XMLCreater(string responsePath,string sharedResourceInfoPath)
        {
			ResponsPath = responsePath;
			SharedResourceInfoPath = sharedResourceInfoPath;
        }

		// creates an XML document
		private MSXML2.IXMLDOMDocument CreateDocument()
		{
			// crate a document object and retrun that
			MSXML2.IXMLDOMDocument document = new MSXML2.DOMDocument();
			return document;
		}

		// saves and closes XML document
		private void SaveAndCloseDocument(MSXML2.IXMLDOMElement responseElem,MSXML2.IXMLDOMDocument document)
		{
			document.async = false;
			// create Processing Instruction for XML documdnt
			MSXML2.IXMLDOMProcessingInstruction	procsInstruct = document.createProcessingInstruction("xml","version=\"1.0\" encoding=\"utf-8\"");
			// create primary element
			MSXML2.IXMLDOMElement elem = document.createElement("p2p_lng");

			// add response object passed to the primary element as child node
			elem.appendChild(responseElem);
			// add Processing Instruction object and primary object to document 
			// object passed as child nodes and save the document
			document.appendChild(procsInstruct);
			document.appendChild(elem);
			document.save(ResponsPath);
		}
		

		// determins the request type passed in the given XML document
		public string DetermineRequestType(string path,out int UploadDownloadPrint,out string[] chatInfo)
		{
			int b = 0;
			string scopeVal = "";
			bool flag = false;
			string[] st = new string[3];

			try
			{
				// load the XML document
				MSXML2.IXMLDOMDocument document = new MSXML2.DOMDocument();
				if(!document.load(path))
					throw new Exception("XML request found corrupted.");

				// retrieve the request element
				MSXML2.IXMLDOMElement	element = document.documentElement;
				MSXML2.IXMLDOMNode		node = element.firstChild;
				MSXML2.IXMLDOMNamedNodeMap nodemap = node.attributes;
				// retrieve it's attributes
				MSXML2.IXMLDOMNode	childNode = nodemap.nextNode();

				if(0 == node.nodeName.CompareTo("request"))
				{
					// see what value does the element tequest holds
					// and react apprpriately
					switch(childNode.nodeValue.ToString())
					{
						case "CHAT":
						{
							b = 4;
							MSXML2.IXMLDOMNode scope = node.firstChild;
							MSXML2.IXMLDOMNamedNodeMap nodemap2 = scope.attributes;
							MSXML2.IXMLDOMNode childNode2 = nodemap2.nextNode();
							MSXML2.IXMLDOMNode childNode3 = nodemap2.nextNode();
							MSXML2.IXMLDOMNode childNode4 = nodemap2.nextNode();
							// set file name to upload to "path" parameter
							st.Initialize();
							st.SetValue(childNode2.nodeValue.ToString(),0);
							st.SetValue(childNode3.nodeValue.ToString(),1);
							st.SetValue(childNode4.nodeValue.ToString(),2);
							break;
						}
						case "SEARCH":
						{
							WriteSearchResponse(node);
							break;
						}
						case "SHOWFILES":
						{
							WriteShowfileResponse("SHOWFILES");
							break;
						}
						case "DOWNLOAD":
						{
							// set flag that its download request
							b = 2;
							flag = true;
							break;
						}
						case "UPLOAD":
						{
							// set flag that its upload request
							b = 1;
							flag = true;
							break;
						}
						case "PRINT":
						{
							// set flag that its print request
							b = 3;
							flag = true;
							break;
						}

						case "STREAMING":
						{
							// set flag that its Streaming request
							b = 5;
							flag = true;
							break;
						}

						default:
							throw new Exception("Request type could not be resolved.");
					}
					
					if(flag)
					{
						MSXML2.IXMLDOMNode scope = node.firstChild;
						MSXML2.IXMLDOMNamedNodeMap nodemap2 = scope.attributes;
						MSXML2.IXMLDOMNode childNode2 = nodemap2.nextNode();
						// set file name to upload to "path" parameter
						scopeVal = childNode2.nodeValue.ToString();
					}
				}
			}
			catch(Exception e)
			{
				WriteErrorResponse(e.Message);
			}

			chatInfo = st;
			UploadDownloadPrint = b;
			return scopeVal;
		}
		
		// writes error XML responses
		public void WriteErrorResponse(string error)
		{
			// create a document object
			MSXML2.IXMLDOMDocument document = CreateDocument();
			// create response and error info elements
			MSXML2.IXMLDOMElement responseElem = document.createElement("response");
			MSXML2.IXMLDOMElement errorInfoElem	 = document.createElement("errorinfo");

			// set attribute of response element
			responseElem.setAttribute( "type", "ERROR");
			// set attribute of errorinfo element
			errorInfoElem.setAttribute( "errorcode", "1");
			errorInfoElem.setAttribute( "severity", "Error" );
			errorInfoElem.setAttribute( "description", error);
			// add errorinfo element to response object as a child
			responseElem.appendChild(errorInfoElem);
			// save the document
			SaveAndCloseDocument(responseElem,document);
		}

		// writes request XML according to the parameter passed
		public void WriteRequest(string type,string searchValue,string mask)
		{
			// create a document object
			MSXML2.IXMLDOMDocument document = CreateDocument();

			// create request element
			MSXML2.IXMLDOMElement requestElem = document.createElement("request");

			// set attributes of request element
			requestElem.setAttribute( "type", type);

			// if one of these kinds of request is to be made
			// specify the filename and pertaining info too.
			if(type.CompareTo("SHOWFILES") != 0)
			{
				string ReqType = "";
				if(type.CompareTo("CHAT") == 0)
					ReqType = "message";
				else
					ReqType = "scope";

				MSXML2.IXMLDOMElement file_infoElem	= document.createElement(ReqType.ToString());

				if(type.CompareTo("CHAT") == 0)
				{
					file_infoElem.setAttribute("sendername",searchValue.Substring(0,searchValue.IndexOf("(")));
					file_infoElem.setAttribute("senderIP",searchValue.Substring(searchValue.IndexOf("(")+1).Substring(0,searchValue.Substring(searchValue.IndexOf("(")+1).Length-1));
					file_infoElem.setAttribute("chatmsg",mask);
				}
				else
				{
					file_infoElem.setAttribute("type",searchValue);
					file_infoElem.setAttribute("mask",mask);
				}
				requestElem.appendChild(file_infoElem);
			}

			// close and save the documdent
			SaveAndCloseDocument(requestElem,document);
		}


		private void WriteShowfileResponse(string reqType)
		{
			// create a document object
			MSXML2.IXMLDOMDocument document = CreateDocument();
			// create response and error info elements
			MSXML2.IXMLDOMElement responseElem = document.createElement("response");
			// set attribute of response element
			responseElem.setAttribute( "type", reqType);

			// open share.ini for reading
			StreamReader readfile = new StreamReader(SharedResourceInfoPath);
			string readData;

			// read entire file
			while((readData = readfile.ReadLine()) != null)
			{
				try
				{
					// for each entry in share .ini create a fileinfo element
					// and fill it with required information
					MSXML2.IXMLDOMElement file_infoElem = document.createElement("fileinfo");
					int index = readData.IndexOf("=",0);
					file_infoElem.setAttribute( "filename",readData.Substring(0,index));
					file_infoElem.setAttribute( "mask", readData.Substring(index+1,1));

					int secindex = -1;
					if(-1 != (secindex = readData.IndexOf("=",index+1)))
						file_infoElem.setAttribute( "filesize", readData.Substring(secindex+1));

					// add this element to response element as child
					responseElem.appendChild(file_infoElem);
				}
				catch(Exception e)	{ MessageBox.Show("Problem faced while responding : " + e.Message);	}
			}
			// close and save the documdent
			SaveAndCloseDocument(responseElem,document);
		}

		// responds for search requests
		private void WriteSearchResponse(MSXML2.IXMLDOMNode node)
		{
			try
			{
				MSXML2.IXMLDOMNode scope = node.firstChild;
				MSXML2.IXMLDOMNamedNodeMap nodemap = scope.attributes;
				MSXML2.IXMLDOMNode	childNode = nodemap.nextNode();
				MSXML2.IXMLDOMNode	childNode2 = nodemap.nextNode();
				string scopeVal = childNode.nodeValue.ToString();
				string maskVal = childNode2.nodeValue.ToString();

				// make sure that search request has criteria specified in it
				if(0 != scope.nodeName.CompareTo("scope"))
					return;

				// validated that directory's existing
				if(!Directory.Exists(scopeVal.Substring(0, scopeVal.LastIndexOf("\\")+1)))
					throw new Exception("Directory does not exists any more");

				MSXML2.IXMLDOMDocument document = CreateDocument();
				MSXML2.IXMLDOMElement responseElem = document.createElement("response");
				responseElem.setAttribute( "type", "SHOWFILES");

				int i = 0;
				// get files in the specified directory satisfying the
				// given criteria
				string[] files = Directory.GetFiles(scopeVal.Substring(0, scopeVal.LastIndexOf("\\")+1),scopeVal.Substring(scopeVal.LastIndexOf("\\")+1));
				files.Initialize();

				while(i < files.Length)
				{
					// make fileinfo elements and fill then up with 
					// required 
					MSXML2.IXMLDOMElement file_infoElem = document.createElement("fileinfo");
					file_infoElem.setAttribute( "filename",files[i]);
					file_infoElem.setAttribute( "mask",maskVal);
					file_infoElem.setAttribute( "filesize",Convert.ToString(new FileInfo(files[i]).Length));
					++i;
					// add them to response element as children;
					responseElem.appendChild(file_infoElem);
				}

				// get files in the specified directory satisfying the
				// given criteria
				string[] dirs = Directory.GetDirectories(scopeVal.Substring(0, scopeVal.LastIndexOf("\\")+1),scopeVal.Substring(scopeVal.LastIndexOf("\\")+1));
				dirs.Initialize();

				i = 0;
				while(i < dirs.Length)
				{
					// make fileinfo elements and fill then up with 
					// required 
					MSXML2.IXMLDOMElement file_infoElem = document.createElement("fileinfo");
					file_infoElem.setAttribute( "filename",dirs[i] + "\\");
					file_infoElem.setAttribute( "mask",maskVal);
					++i;

					// add them to response element as children;
					responseElem.appendChild(file_infoElem);
				}
				// close and save the document
				SaveAndCloseDocument(responseElem,document);
			}
			catch(Exception e) { WriteErrorResponse(e.Message); }
		}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -