private static void WriteElementTo(PmlElement Element, string Indent, TextWriter Writer) { if (Element == null) { Console.WriteLine("NULL"); return; } switch (Element.Type) { case PmlType.Null: Writer.WriteLine("NULL"); break; case PmlType.Collection: Writer.WriteLine("COLLECTION {"); foreach (PmlElement Child in (PmlCollection)Element) { Writer.Write(Indent + " "); WriteElementTo(Child, Indent + " ", Writer); } Writer.WriteLine(Indent + "}"); break; case PmlType.Dictionary: Writer.WriteLine("DICTIONARY {"); foreach (KeyValuePair <string, PmlElement> Child in (PmlDictionary)Element) { Writer.Write(Indent + " " + Uri.EscapeDataString(Child.Key) + " "); WriteElementTo(Child.Value, Indent + " ", Writer); } Writer.WriteLine(Indent + "}"); break; case PmlType.Binary: Writer.WriteLine("BINARY " + Convert.ToBase64String(Element.ToByteArray())); break; case PmlType.Integer: Writer.WriteLine("INT " + Element.ToString()); break; case PmlType.String: Writer.WriteLine("STRING " + Uri.EscapeDataString(Element.ToString())); break; } }
private static void WriteElementTo(PmlElement Element, System.Xml.XmlWriter Writer) { switch (Element.Type) { case PmlType.Binary: Writer.WriteAttributeString("type", "binary"); byte[] Bytes = Element.ToByteArray(); Writer.WriteBase64(Bytes, 0, Bytes.Length); break; case PmlType.Collection: Writer.WriteAttributeString("type", "collection"); foreach (PmlElement Child in (PmlCollection)Element) { Writer.WriteStartElement("item"); WriteElementTo(Child, Writer); Writer.WriteEndElement(); } break; case PmlType.Dictionary: Writer.WriteAttributeString("type", "dictionary"); foreach (KeyValuePair <string, PmlElement> Child in (PmlDictionary)Element) { Writer.WriteStartElement(Child.Key); WriteElementTo(Child.Value, Writer); Writer.WriteEndElement(); } break; case PmlType.Integer: Writer.WriteAttributeString("type", "integer"); Writer.WriteString(Element.ToString()); break; case PmlType.Null: Writer.WriteAttributeString("type", "null"); break; case PmlType.String: Writer.WriteAttributeString("type", "string"); Writer.WriteString(Element.ToString()); break; } }
private static void WriteElementTo(PmlElement Element, BinaryWriter Writer) { if (Element == null) { Writer.Write((byte)AmfDataType.Null); return; } switch (Element.Type) { case PmlType.Null: Writer.Write((byte)AmfDataType.Null); break; case PmlType.Dictionary: Writer.Write((byte)AmfDataType.UntypedObject); //WriteDictionary(Writer, (PmlDictionary)Element); WriteUntypedObject(Writer, (PmlDictionary)Element); break; case PmlType.Collection: Writer.Write((byte)AmfDataType.Array); WriteCollection(Writer, (PmlCollection)Element); break; case PmlType.Binary: Writer.Write((byte)AmfDataType.String); byte[] bytes = Element.ToByteArray(); if (bytes.Length > UInt16.MaxValue) { Writer.Write((byte)AmfDataType.String); WriteString(Writer, bytes); } else { Writer.Write((byte)AmfDataType.LongString); WriteLongString(Writer, bytes); } break; case PmlType.String: string str = Element.ToString(); if (str.Length < UInt16.MaxValue) { Writer.Write((byte)AmfDataType.String); WriteString(Writer, str); } else { Writer.Write((byte)AmfDataType.LongString); WriteLongString(Writer, str); } break; case PmlType.Integer: Writer.Write((byte)AmfDataType.Number); WriteDouble(Writer, (Element as PmlInteger).ToDouble()); break; } }
private void processMessage(PmlElement Message) { if (Message is PmlString) { String cmd = Message.ToString(); if (cmd == "PING") { _WriteMessage("PONG"); } else if (cmd == "PONG") { } } else if (Message is PmlDictionary) { String cmd = Message.GetChild("CMD").ToString(); if (cmd == "SES") { processSessionMessage(Message); } else if (cmd == "RPL") { UInt32 SID = Message.GetChild("SID").ToUInt32(); CSyncRequest SRequest; lock (_invocations) { if (!_invocations.TryGetValue(SID, out SRequest)) { SRequest = null; } _invocations.Remove(SID); } if (SRequest != null) { SRequest.Completed((PmlDictionary)Message); } } else if (cmd == "REQ" || cmd == "MSG") { UThreadPool.RunCall(processCall, Message); } } }
public PmlElement Invoke(PmlElement message, int timeout) { if (_closed) { throw new InvalidOperationException("Sorry, we're closed."); } CSyncRequest SyncEvent = new CSyncRequest(); UInt32 SID; lock (_invocations) { SID = GetNextSessionId(ref pNextSyncRequest, _invocations); _invocations.Add(SID, SyncEvent); } Boolean waitSuccess = false; try { _WriteMessage(new PmlDictionary() { { "CMD", "REQ" }, { "SID", SID }, { "MSG", message } }); lock (SyncEvent) waitSuccess = SyncEvent.Reply != null || Monitor.Wait(SyncEvent, timeout); } finally { lock (_invocations) _invocations.Remove(SID); } if (!waitSuccess) { throw new TimeoutException("The SyncRequest timed out (SID=" + SID.ToString() + ")"); } if (SyncEvent.Reply == null) { throw new OperationCanceledException("The operation was aborted"); } PmlElement errmsg = SyncEvent.Reply.GetChild("ERRMSG"); if (errmsg != null) { PmlElement errtxt = SyncEvent.Reply.GetChild("ERRTXT"); throw new PmlRemoteException(errmsg.ToString(), errtxt == null ? null : errtxt.ToString()); } return(SyncEvent.Reply.GetChild("MSG")); }
private static void WriteElementTo(PmlElement element, TextWriter stream) { if (element == null) { stream.Write("null"); return; } switch (element.Type) { case PmlType.Null: stream.Write("null"); break; case PmlType.String: WriteEscapedString(stream, element.ToString()); break; case PmlType.Binary: stream.Write('"'); foreach (Byte b in element.ToByteArray()) { if (b < ' ' || b == '"' || b == '\\') { WriteEscapedCharacter(stream, (Char)b); } else { stream.Write((Char)b); } } stream.Write('"'); break; case PmlType.Integer: stream.Write(element.ToInt64().ToString(CultureInfo.InvariantCulture)); break; case PmlType.Dictionary: IDictionary <String, PmlElement> dict = (IDictionary <String, PmlElement>)element; Boolean first = true; stream.Write('{'); foreach (KeyValuePair <String, PmlElement> item in dict) { if (!first) { stream.Write(','); } first = false; WriteEscapedString(stream, item.Key); stream.Write(':'); WriteElementTo(item.Value, stream); } stream.Write('}'); break; case PmlType.Collection: IEnumerable <PmlElement> col = (IEnumerable <PmlElement>)element; first = true; stream.Write('['); foreach (PmlElement item in col) { if (!first) { stream.Write(','); } first = false; WriteElementTo(item, stream); } stream.Write(']'); break; default: throw new InvalidOperationException("Can not encode PML type " + element.Type.ToString() + " to JSON"); } }
private static void WriteElementTo(PmlElement element, Stream stream, Encoding encoding) { if (element == null) { WriteString(stream, encoding, "N;"); return; } switch (element.Type) { case PmlType.Null: WriteString(stream, encoding, "N;"); break; case PmlType.String: Byte[] bytes = encoding.GetBytes(element.ToString()); WriteString(stream, encoding, "s:"); WriteString(stream, encoding, bytes.Length.ToString()); WriteString(stream, encoding, ":\""); stream.Write(bytes, 0, bytes.Length); WriteString(stream, encoding, "\";"); break; case PmlType.Binary: bytes = element.ToByteArray(); WriteString(stream, encoding, "s:"); WriteString(stream, encoding, bytes.Length.ToString()); WriteString(stream, encoding, ":\""); stream.Write(bytes, 0, bytes.Length); WriteString(stream, encoding, "\";"); break; case PmlType.Integer: WriteString(stream, encoding, "i:"); WriteString(stream, encoding, element.ToString()); WriteString(stream, encoding, ";"); break; case PmlType.Number: WriteString(stream, encoding, "d:"); WriteString(stream, encoding, element.ToDouble().ToString("f", CultureInfo.InvariantCulture)); WriteString(stream, encoding, ";"); break; case PmlType.Dictionary: IDictionary <String, PmlElement> dict = (IDictionary <String, PmlElement>)element; WriteString(stream, encoding, "a:"); WriteString(stream, encoding, dict.Count.ToString()); WriteString(stream, encoding, ":{"); foreach (KeyValuePair <String, PmlElement> item in dict) { bytes = encoding.GetBytes(item.Key); WriteString(stream, encoding, "s:"); WriteString(stream, encoding, bytes.Length.ToString()); WriteString(stream, encoding, ":\""); stream.Write(bytes, 0, bytes.Length); WriteString(stream, encoding, "\";"); WriteElementTo(item.Value, stream, encoding); } WriteString(stream, encoding, "}"); break; case PmlType.Collection: ICollection <PmlElement> col = (ICollection <PmlElement>)element; WriteString(stream, encoding, "a:"); WriteString(stream, encoding, col.Count.ToString()); WriteString(stream, encoding, ":{"); int i = 0; foreach (PmlElement item in col) { WriteString(stream, encoding, "i:"); WriteString(stream, encoding, i.ToString()); WriteString(stream, encoding, ";"); WriteElementTo(item, stream, encoding); i += 1; } WriteString(stream, encoding, "}"); break; default: WriteString(stream, encoding, "N;"); break; } }
private static void WriteElementTo(PmlElement Element, BinaryWriter Writer) { if (Element == null) { Writer.Write((byte)0); return; } switch (Element.Type) { case PmlType.Null: Writer.Write((byte)0); break; case PmlType.Dictionary: Writer.Write((byte)1); foreach (KeyValuePair <string, PmlElement> Item in (PmlDictionary)Element) { Writer.Write((byte)1); Writer.Write(Item.Key); WriteElementTo(Item.Value, Writer); } Writer.Write((byte)0); break; case PmlType.Collection: Writer.Write((byte)2); foreach (PmlElement Item in (PmlCollection)Element) { Writer.Write((byte)1); WriteElementTo(Item, Writer); } Writer.Write((byte)0); break; case PmlType.Binary: { Writer.Write((byte)10); Byte[] Buffer = Element.ToByteArray(); if (Buffer == null) { Writer.Write((int)0); } else { Writer.Write((int)Buffer.Length); Writer.Write(Buffer); } } break; case PmlType.String: Writer.Write((byte)11); string Str = Element.ToString(); if (Str == null) { Writer.Write(String.Empty); } else { Writer.Write(Str); } break; case PmlType.Integer: Writer.Write((byte)20); PmlInteger RMInt = (PmlInteger)Element; if (RMInt.IsSigned) { Writer.Write((byte)1); Writer.Write((long)RMInt); } else { Writer.Write((byte)0); Writer.Write((ulong)RMInt); } break; case PmlType.Boolean: Writer.Write((byte)21); Writer.Write(Element.ToBoolean()); break; case PmlType.Number: Writer.Write((byte)22); Writer.Write(Element.ToDouble()); break; default: Writer.Write((byte)0); Console.WriteLine("PmlBinaryRW: Can not encode PML type {0}", Element.Type); break; } }