clsXMLCreater.cs
上传用户:hkhxjs
上传日期:2008-11-25
资源大小:155k
文件大小:11k
源码类别:

Internet/网络编程

开发平台:

C#

  1. namespace WorkingWithXML
  2. {
  3. // basic package includes
  4. using System;
  5.     using System.Windows.Forms;
  6. using System.IO;
  7.  
  8.     ///    Creates requests and appropriate responses
  9.     public class XMLCreater
  10.     {
  11. // member variables for storing Apllication path of 
  12. // application that's using this class
  13. // and path to pick up share.ini from
  14. string ResponsPath;
  15. string SharedResourceInfoPath;
  16. // constructer to initiliaze both thses paths
  17.         public XMLCreater(string responsePath,string sharedResourceInfoPath)
  18.         {
  19. ResponsPath = responsePath;
  20. SharedResourceInfoPath = sharedResourceInfoPath;
  21.         }
  22. // creates an XML document
  23. private MSXML2.IXMLDOMDocument CreateDocument()
  24. {
  25. // crate a document object and retrun that
  26. MSXML2.IXMLDOMDocument document = new MSXML2.DOMDocument();
  27. return document;
  28. }
  29. // saves and closes XML document
  30. private void SaveAndCloseDocument(MSXML2.IXMLDOMElement responseElem,MSXML2.IXMLDOMDocument document)
  31. {
  32. document.async = false;
  33. // create Processing Instruction for XML documdnt
  34. MSXML2.IXMLDOMProcessingInstruction procsInstruct = document.createProcessingInstruction("xml","version="1.0" encoding="utf-8"");
  35. // create primary element
  36. MSXML2.IXMLDOMElement elem = document.createElement("p2p_lng");
  37. // add response object passed to the primary element as child node
  38. elem.appendChild(responseElem);
  39. // add Processing Instruction object and primary object to document 
  40. // object passed as child nodes and save the document
  41. document.appendChild(procsInstruct);
  42. document.appendChild(elem);
  43. document.save(ResponsPath);
  44. }
  45. // determins the request type passed in the given XML document
  46. public string DetermineRequestType(string path,out int UploadDownloadPrint,out string[] chatInfo)
  47. {
  48. int b = 0;
  49. string scopeVal = "";
  50. bool flag = false;
  51. string[] st = new string[3];
  52. try
  53. {
  54. // load the XML document
  55. MSXML2.IXMLDOMDocument document = new MSXML2.DOMDocument();
  56. if(!document.load(path))
  57. throw new Exception("XML request found corrupted.");
  58. // retrieve the request element
  59. MSXML2.IXMLDOMElement element = document.documentElement;
  60. MSXML2.IXMLDOMNode node = element.firstChild;
  61. MSXML2.IXMLDOMNamedNodeMap nodemap = node.attributes;
  62. // retrieve it's attributes
  63. MSXML2.IXMLDOMNode childNode = nodemap.nextNode();
  64. if(0 == node.nodeName.CompareTo("request"))
  65. {
  66. // see what value does the element tequest holds
  67. // and react apprpriately
  68. switch(childNode.nodeValue.ToString())
  69. {
  70. case "CHAT":
  71. {
  72. b = 4;
  73. MSXML2.IXMLDOMNode scope = node.firstChild;
  74. MSXML2.IXMLDOMNamedNodeMap nodemap2 = scope.attributes;
  75. MSXML2.IXMLDOMNode childNode2 = nodemap2.nextNode();
  76. MSXML2.IXMLDOMNode childNode3 = nodemap2.nextNode();
  77. MSXML2.IXMLDOMNode childNode4 = nodemap2.nextNode();
  78. // set file name to upload to "path" parameter
  79. st.Initialize();
  80. st.SetValue(childNode2.nodeValue.ToString(),0);
  81. st.SetValue(childNode3.nodeValue.ToString(),1);
  82. st.SetValue(childNode4.nodeValue.ToString(),2);
  83. break;
  84. }
  85. case "SEARCH":
  86. {
  87. WriteSearchResponse(node);
  88. break;
  89. }
  90. case "SHOWFILES":
  91. {
  92. WriteShowfileResponse("SHOWFILES");
  93. break;
  94. }
  95. case "DOWNLOAD":
  96. {
  97. // set flag that its download request
  98. b = 2;
  99. flag = true;
  100. break;
  101. }
  102. case "UPLOAD":
  103. {
  104. // set flag that its upload request
  105. b = 1;
  106. flag = true;
  107. break;
  108. }
  109. case "PRINT":
  110. {
  111. // set flag that its print request
  112. b = 3;
  113. flag = true;
  114. break;
  115. }
  116. case "STREAMING":
  117. {
  118. // set flag that its Streaming request
  119. b = 5;
  120. flag = true;
  121. break;
  122. }
  123. default:
  124. throw new Exception("Request type could not be resolved.");
  125. }
  126. if(flag)
  127. {
  128. MSXML2.IXMLDOMNode scope = node.firstChild;
  129. MSXML2.IXMLDOMNamedNodeMap nodemap2 = scope.attributes;
  130. MSXML2.IXMLDOMNode childNode2 = nodemap2.nextNode();
  131. // set file name to upload to "path" parameter
  132. scopeVal = childNode2.nodeValue.ToString();
  133. }
  134. }
  135. }
  136. catch(Exception e)
  137. {
  138. WriteErrorResponse(e.Message);
  139. }
  140. chatInfo = st;
  141. UploadDownloadPrint = b;
  142. return scopeVal;
  143. }
  144. // writes error XML responses
  145. public void WriteErrorResponse(string error)
  146. {
  147. // create a document object
  148. MSXML2.IXMLDOMDocument document = CreateDocument();
  149. // create response and error info elements
  150. MSXML2.IXMLDOMElement responseElem = document.createElement("response");
  151. MSXML2.IXMLDOMElement errorInfoElem  = document.createElement("errorinfo");
  152. // set attribute of response element
  153. responseElem.setAttribute( "type", "ERROR");
  154. // set attribute of errorinfo element
  155. errorInfoElem.setAttribute( "errorcode", "1");
  156. errorInfoElem.setAttribute( "severity", "Error" );
  157. errorInfoElem.setAttribute( "description", error);
  158. // add errorinfo element to response object as a child
  159. responseElem.appendChild(errorInfoElem);
  160. // save the document
  161. SaveAndCloseDocument(responseElem,document);
  162. }
  163. // writes request XML according to the parameter passed
  164. public void WriteRequest(string type,string searchValue,string mask)
  165. {
  166. // create a document object
  167. MSXML2.IXMLDOMDocument document = CreateDocument();
  168. // create request element
  169. MSXML2.IXMLDOMElement requestElem = document.createElement("request");
  170. // set attributes of request element
  171. requestElem.setAttribute( "type", type);
  172. // if one of these kinds of request is to be made
  173. // specify the filename and pertaining info too.
  174. if(type.CompareTo("SHOWFILES") != 0)
  175. {
  176. string ReqType = "";
  177. if(type.CompareTo("CHAT") == 0)
  178. ReqType = "message";
  179. else
  180. ReqType = "scope";
  181. MSXML2.IXMLDOMElement file_infoElem = document.createElement(ReqType.ToString());
  182. if(type.CompareTo("CHAT") == 0)
  183. {
  184. file_infoElem.setAttribute("sendername",searchValue.Substring(0,searchValue.IndexOf("(")));
  185. file_infoElem.setAttribute("senderIP",searchValue.Substring(searchValue.IndexOf("(")+1).Substring(0,searchValue.Substring(searchValue.IndexOf("(")+1).Length-1));
  186. file_infoElem.setAttribute("chatmsg",mask);
  187. }
  188. else
  189. {
  190. file_infoElem.setAttribute("type",searchValue);
  191. file_infoElem.setAttribute("mask",mask);
  192. }
  193. requestElem.appendChild(file_infoElem);
  194. }
  195. // close and save the documdent
  196. SaveAndCloseDocument(requestElem,document);
  197. }
  198. private void WriteShowfileResponse(string reqType)
  199. {
  200. // create a document object
  201. MSXML2.IXMLDOMDocument document = CreateDocument();
  202. // create response and error info elements
  203. MSXML2.IXMLDOMElement responseElem = document.createElement("response");
  204. // set attribute of response element
  205. responseElem.setAttribute( "type", reqType);
  206. // open share.ini for reading
  207. StreamReader readfile = new StreamReader(SharedResourceInfoPath);
  208. string readData;
  209. // read entire file
  210. while((readData = readfile.ReadLine()) != null)
  211. {
  212. try
  213. {
  214. // for each entry in share .ini create a fileinfo element
  215. // and fill it with required information
  216. MSXML2.IXMLDOMElement file_infoElem = document.createElement("fileinfo");
  217. int index = readData.IndexOf("=",0);
  218. file_infoElem.setAttribute( "filename",readData.Substring(0,index));
  219. file_infoElem.setAttribute( "mask", readData.Substring(index+1,1));
  220. int secindex = -1;
  221. if(-1 != (secindex = readData.IndexOf("=",index+1)))
  222. file_infoElem.setAttribute( "filesize", readData.Substring(secindex+1));
  223. // add this element to response element as child
  224. responseElem.appendChild(file_infoElem);
  225. }
  226. catch(Exception e) { MessageBox.Show("Problem faced while responding : " + e.Message); }
  227. }
  228. // close and save the documdent
  229. SaveAndCloseDocument(responseElem,document);
  230. }
  231. // responds for search requests
  232. private void WriteSearchResponse(MSXML2.IXMLDOMNode node)
  233. {
  234. try
  235. {
  236. MSXML2.IXMLDOMNode scope = node.firstChild;
  237. MSXML2.IXMLDOMNamedNodeMap nodemap = scope.attributes;
  238. MSXML2.IXMLDOMNode childNode = nodemap.nextNode();
  239. MSXML2.IXMLDOMNode childNode2 = nodemap.nextNode();
  240. string scopeVal = childNode.nodeValue.ToString();
  241. string maskVal = childNode2.nodeValue.ToString();
  242. // make sure that search request has criteria specified in it
  243. if(0 != scope.nodeName.CompareTo("scope"))
  244. return;
  245. // validated that directory's existing
  246. if(!Directory.Exists(scopeVal.Substring(0, scopeVal.LastIndexOf("\")+1)))
  247. throw new Exception("Directory does not exists any more");
  248. MSXML2.IXMLDOMDocument document = CreateDocument();
  249. MSXML2.IXMLDOMElement responseElem = document.createElement("response");
  250. responseElem.setAttribute( "type", "SHOWFILES");
  251. int i = 0;
  252. // get files in the specified directory satisfying the
  253. // given criteria
  254. string[] files = Directory.GetFiles(scopeVal.Substring(0, scopeVal.LastIndexOf("\")+1),scopeVal.Substring(scopeVal.LastIndexOf("\")+1));
  255. files.Initialize();
  256. while(i < files.Length)
  257. {
  258. // make fileinfo elements and fill then up with 
  259. // required 
  260. MSXML2.IXMLDOMElement file_infoElem = document.createElement("fileinfo");
  261. file_infoElem.setAttribute( "filename",files[i]);
  262. file_infoElem.setAttribute( "mask",maskVal);
  263. file_infoElem.setAttribute( "filesize",Convert.ToString(new FileInfo(files[i]).Length));
  264. ++i;
  265. // add them to response element as children;
  266. responseElem.appendChild(file_infoElem);
  267. }
  268. // get files in the specified directory satisfying the
  269. // given criteria
  270. string[] dirs = Directory.GetDirectories(scopeVal.Substring(0, scopeVal.LastIndexOf("\")+1),scopeVal.Substring(scopeVal.LastIndexOf("\")+1));
  271. dirs.Initialize();
  272. i = 0;
  273. while(i < dirs.Length)
  274. {
  275. // make fileinfo elements and fill then up with 
  276. // required 
  277. MSXML2.IXMLDOMElement file_infoElem = document.createElement("fileinfo");
  278. file_infoElem.setAttribute( "filename",dirs[i] + "\");
  279. file_infoElem.setAttribute( "mask",maskVal);
  280. ++i;
  281. // add them to response element as children;
  282. responseElem.appendChild(file_infoElem);
  283. }
  284. // close and save the document
  285. SaveAndCloseDocument(responseElem,document);
  286. }
  287. catch(Exception e) { WriteErrorResponse(e.Message); }
  288. }
  289.     }
  290. }