Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.98 KB | None | 0 0
  1. class ExternalInterfaceSerializer
  2. {
  3.  
  4. #region Constructor
  5.  
  6. private ExternalInterfaceSerializer()
  7. {
  8. }
  9.  
  10. #endregion
  11.  
  12. #region Public Methods
  13.  
  14. /// <summary>
  15. /// Encodes a function call to be sent to Flash.
  16. /// </summary>
  17. /// <param name="functionName">The name of the function to call.</param>
  18. /// <param name="arguments">Zero or more parameters to pass in to the ActonScript function.</param>
  19. /// <returns>The XML string representation of the function call to pass to Flash</returns>
  20. public static string EncodeInvoke(string functionName, object[] arguments)
  21. {
  22. StringBuilder sb = new StringBuilder();
  23.  
  24. XmlTextWriter writer = new XmlTextWriter(new StringWriter(sb));
  25.  
  26. // <invoke name="functionName" returntype="xml">
  27. writer.WriteStartElement("invoke");
  28. writer.WriteAttributeString("name", functionName);
  29. writer.WriteAttributeString("returntype", "xml");
  30.  
  31. if (arguments != null && arguments.Length > 0)
  32. {
  33. // <arguments>
  34. writer.WriteStartElement("arguments");
  35.  
  36. // individual arguments
  37. foreach (object value in arguments)
  38. {
  39. WriteElement(writer, value);
  40. }
  41.  
  42. // </arguments>
  43. writer.WriteEndElement();
  44. }
  45.  
  46. // </invoke>
  47. writer.WriteEndElement();
  48.  
  49. writer.Flush();
  50. writer.Close();
  51.  
  52. return sb.ToString();
  53. }
  54.  
  55. /// <summary>
  56. /// Encodes a value to send to Flash as the result of a function call from Flash.
  57. /// </summary>
  58. /// <param name="value">The value to encode.</param>
  59. /// <returns>The XML string representation of the value.</returns>
  60. public static string EncodeResult(object value)
  61. {
  62. StringBuilder sb = new StringBuilder();
  63.  
  64. XmlTextWriter writer = new XmlTextWriter(new StringWriter(sb));
  65.  
  66. WriteElement(writer, value);
  67.  
  68. writer.Flush();
  69. writer.Close();
  70.  
  71. return sb.ToString();
  72. }
  73.  
  74.  
  75. /// <summary>
  76. /// Decodes a function call from Flash.
  77. /// </summary>
  78. /// <param name="xml">The XML string representing the function call.</param>
  79. /// <returns>An ExternalInterfaceCall object representing the function call.</returns>
  80. public static ExternalInterfaceCall DecodeInvoke(string xml)
  81. {
  82. XmlTextReader reader = new XmlTextReader(xml, XmlNodeType.Document, null);
  83.  
  84. reader.Read();
  85.  
  86. string functionName = reader.GetAttribute("name");
  87. ExternalInterfaceCall result = new ExternalInterfaceCall(functionName);
  88.  
  89. reader.ReadStartElement("invoke");
  90. reader.ReadStartElement("arguments");
  91.  
  92. while (reader.NodeType != XmlNodeType.EndElement && reader.Name != "arguments")
  93. {
  94. result.AddArgument(ReadElement(reader));
  95. }
  96.  
  97. reader.ReadEndElement();
  98. reader.ReadEndElement();
  99.  
  100. return result;
  101. }
  102.  
  103.  
  104. /// <summary>
  105. /// Decodes the result of a function call to Flash
  106. /// </summary>
  107. /// <param name="xml">The XML string representing the result.</param>
  108. /// <returns>A <see cref="System.Object"/> containing the result</returns>
  109. public static object DecodeResult(string xml)
  110. {
  111. XmlTextReader reader = new XmlTextReader(xml, XmlNodeType.Document, null);
  112. reader.Read();
  113. return ReadElement(reader);
  114. }
  115.  
  116. #endregion
  117.  
  118. #region Writers
  119.  
  120. private static void WriteElement(XmlTextWriter writer, object value)
  121. {
  122. if (value == null)
  123. {
  124. writer.WriteStartElement("null");
  125. writer.WriteEndElement();
  126. }
  127. else if (value is string)
  128. {
  129. writer.WriteStartElement("string");
  130. writer.WriteString(value.ToString());
  131. writer.WriteEndElement();
  132. }
  133. else if (value is bool)
  134. {
  135. writer.WriteStartElement((bool)value ? "true" : "false");
  136. writer.WriteEndElement();
  137. }
  138. else if (value is Single || value is Double || value is int || value is uint)
  139. {
  140. writer.WriteStartElement("number");
  141. writer.WriteString(value.ToString());
  142. writer.WriteEndElement();
  143. }
  144. else if (value is ArrayList)
  145. {
  146. WriteArray(writer, (ArrayList)value);
  147. }
  148. else if (value is Hashtable)
  149. {
  150. WriteObject(writer, (Hashtable)value);
  151. }
  152. else
  153. {
  154. // null is the default when ActionScript can't serialize an object
  155. writer.WriteStartElement("null");
  156. writer.WriteEndElement();
  157. }
  158. }
  159.  
  160.  
  161. private static void WriteArray(XmlTextWriter writer, ArrayList array)
  162. {
  163. writer.WriteStartElement("array");
  164.  
  165. int len = array.Count;
  166.  
  167. for (int i = 0; i < len; i++)
  168. {
  169. writer.WriteStartElement("property");
  170. writer.WriteAttributeString("id", i.ToString());
  171. WriteElement(writer, array[i]);
  172. writer.WriteEndElement();
  173. }
  174.  
  175. writer.WriteEndElement();
  176. }
  177.  
  178.  
  179. private static void WriteObject(XmlTextWriter writer, Hashtable table)
  180. {
  181. writer.WriteStartElement("object");
  182.  
  183. foreach (DictionaryEntry entry in table)
  184. {
  185. writer.WriteStartElement("property");
  186. writer.WriteAttributeString("id", entry.Key.ToString());
  187. WriteElement(writer, entry.Value);
  188. writer.WriteEndElement();
  189. }
  190.  
  191. writer.WriteEndElement();
  192. }
  193.  
  194. #endregion
  195.  
  196. #region Readers
  197.  
  198. private static object ReadElement(XmlTextReader reader)
  199. {
  200. if (reader.NodeType != XmlNodeType.Element)
  201. {
  202. throw new XmlException();
  203. }
  204.  
  205. if (reader.Name == "true")
  206. {
  207. reader.Read();
  208. return true;
  209. }
  210.  
  211. if (reader.Name == "false")
  212. {
  213. reader.Read();
  214. return false;
  215. }
  216.  
  217. if (reader.Name == "null" || reader.Name == "undefined")
  218. {
  219. reader.Read();
  220. return null;
  221. }
  222.  
  223. if (reader.IsStartElement("number"))
  224. {
  225. reader.ReadStartElement("number");
  226. double value = Double.Parse(reader.Value);
  227. reader.Read();
  228. reader.ReadEndElement();
  229. return value;
  230. }
  231.  
  232. if (reader.IsStartElement("string"))
  233. {
  234. reader.ReadStartElement("string");
  235. string value = reader.Value;
  236. reader.Read();
  237. reader.ReadEndElement();
  238. return value;
  239. }
  240.  
  241. if (reader.IsStartElement("array"))
  242. {
  243. reader.ReadStartElement("array");
  244. ArrayList value = ReadArray(reader);
  245. reader.ReadEndElement();
  246. return value;
  247. }
  248.  
  249. if (reader.IsStartElement("object"))
  250. {
  251. reader.ReadStartElement("object");
  252. Hashtable value = ReadObject(reader);
  253. reader.ReadEndElement();
  254. return value;
  255. }
  256. throw new XmlException();
  257. }
  258.  
  259.  
  260. private static ArrayList ReadArray(XmlTextReader reader)
  261. {
  262. ArrayList result = new ArrayList();
  263.  
  264. while (reader.NodeType != XmlNodeType.EndElement && reader.Name != "array")
  265. {
  266. int id = int.Parse(reader.GetAttribute("id"));
  267. reader.ReadStartElement("property");
  268. result.Add(ReadElement(reader));
  269. reader.ReadEndElement();
  270. }
  271.  
  272. return result;
  273. }
  274.  
  275.  
  276. private static Hashtable ReadObject(XmlTextReader reader)
  277. {
  278. Hashtable result = new Hashtable();
  279.  
  280. while (reader.NodeType != XmlNodeType.EndElement && reader.Name != "object")
  281. {
  282. string id = reader.GetAttribute("id");
  283. reader.ReadStartElement("property");
  284. result.Add(id, ReadElement(reader));
  285. reader.ReadEndElement();
  286. }
  287.  
  288. return result;
  289. }
  290.  
  291. #endregion
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement