Mercurial > hg > ucis.core
diff Cci/CciCommand.cs @ 0:3ab940a0c7a0
Initial commit
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 11 Sep 2012 16:28:53 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Cci/CciCommand.cs Tue Sep 11 16:28:53 2012 +0200 @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Text; +using UCIS.Pml; + +namespace UCIS.Cci { + public enum CciResultType { + Success, + Error, + Value, + Message, + List, + Pml, + Object, + Binary + } + + public class CciResult { + private CciResultType _type; + private Object _value; + + public CciResult(CciResultType type, Object value) { + _type = type; + _value = value; + } + public CciResult(CciResultType type) : this(type, null) { } + public CciResult(Exception ex) : this(CciResultType.Error, ex) { } + public CciResult(Pml.PmlElement pml) : this(CciResultType.Pml, pml) { } + public CciResult(byte[] binary) : this(CciResultType.Binary, binary) { } + public CciResult(string[] stringList) : this(CciResultType.List, stringList) { } + public CciResult(string message) : this(CciResultType.Message, message) { } + + public override string ToString() { + if (_value == null) { + return _type.ToString(); + } else { + return _type.ToString() + ": " + ValueToString(); + } + } + public string ValueToString() { + if (_value == null) { + return ""; + } else if (_value is string) { + return (string)_value; + } else if (_value is byte[]) { + return Encoding.UTF8.GetString((byte[])_value); + } else if (_value is PmlElement) { + return Pml.PmlTextWriter.GetMessageString((PmlElement)_value); + } else if (_value is IEnumerable<Object>) { + StringBuilder sb = new StringBuilder(); + foreach (Object i in (Array)_value) sb.AppendLine(i.ToString()); + return sb.ToString(); + } else { + return _value.ToString(); + } + } + public PmlElement ValueToPml() { + if (_value == null) return new PmlNull(); + switch (_type) { + case CciResultType.Binary: return new PmlBinary((byte[])_value); + case CciResultType.Message: + case CciResultType.Object: + case CciResultType.Value: + case CciResultType.Error: return new PmlString(_value.ToString()); + case CciResultType.Success: return new PmlInteger(1); + case CciResultType.List: { + PmlCollection c = new PmlCollection(); + foreach (Object i in (Array)_value) c.Add(i.ToString()); + return c; + } + case CciResultType.Pml: return (PmlElement)_value; + default: return new PmlString("Unknown type: " + _type.ToString()); + } + } + public PmlElement ToPml() { + PmlDictionary d = new PmlDictionary(); + //d.Add("Type", (int)_type); + d.Add("Type", (int)CciResultType.Message); + //d.Add("TypeName", _type.ToString()); + d.Add("TypeName", "Message"); + //d.Add("Value", ValueToPml()); + d.Add("Value", ToString()); + d.Add("String", ToString()); + return d; + } + + public CciResultType Type { get { return _type; } } + public Object Value { get { return _value; } } + } + + public class CciCommand { + private string[] _command; + private int _offset; + private CciResult _result; + + public CciCommand(string[] command) { + _command = command; + _offset = 0; + _result = null; + } + + public int Offset { get { return _offset; } set { _offset = value; } } + + public static CciCommand Parse(string command, bool urlEncode, bool cEscape, bool quotes) { + List<string> l = new List<string>(); + + StringBuilder part = new StringBuilder(); + bool inQuotes = false; + int len = command.Length; + for (int i = 0; i < len; i++) { + char c = command[i]; + if (quotes && !inQuotes && c == '"') { + inQuotes = true; + } else if (quotes && inQuotes && c == '"') { + inQuotes = false; + } else if (urlEncode && c == '%') { + part.Append(Uri.HexUnescape(command, ref i)); + i--; + } else if (cEscape && c == '\\' && i + 1 < len) { + i++; + switch (command[i]) { + case 't': part.Append('\t'); break; + case 'n': part.Append('\n'); break; + case 'r': part.Append('\r'); break; + default: part.Append(command[i]); break; + } + } else if (!inQuotes && (c == ' ' || c == '\t')) { + if (part.Length > 0) l.Add(part.ToString()); + part.Length = 0; + } else { + part.Append(c); + } + } + if (part.Length > 0) l.Add(part.ToString()); + + return new CciCommand(l.ToArray()); + } + + public PmlCollection ToPml() { return ToPml(0); } + public PmlCollection ToPml(int offset) { + PmlCollection c = new PmlCollection(); + for (int i = _offset + offset; i < _command.Length; i++) c.Add(_command[i]); + return c; + } + public static CciCommand FromPml(PmlCollection pml) { + List<string> l = new List<string>(); + foreach (PmlElement e in pml) l.Add(e.ToString()); + return new CciCommand(l.ToArray()); + } + + public string Command { + get { + return _command[_offset]; + } + } + + public string GetArgument(int index) { + return _command[_offset + index + 1]; + } + + public CciCommand Jump(int offset) { + _offset += offset; + return this; + } + + public int Count { + get { + return _command.Length - _offset - 1; + } + } + + public CciResult Result { + get { + return _result; + } + set { + _result = value; + } + } + + public CciCommand Return(CciResult result) { + _result = result; + return this; + } + public CciCommand Return(CciResultType type, Object value) { return Return(new CciResult(type, value)); } + public CciCommand Return() { return Return(CciResultType.Success); } + public CciCommand Return(int value) { return Return(CciResultType.Value, value); } + public CciCommand Return(CciResultType type) { return Return(type, null); } + public CciCommand Return(Exception ex) { return Return(CciResultType.Error, ex); } + public CciCommand Return(PmlElement pml) { return Return(CciResultType.Pml, pml); } + public CciCommand Return(byte[] binary) { return Return(CciResultType.Binary, binary); } + public CciCommand Return(string[] stringList) { return Return(CciResultType.List, stringList); } + public CciCommand Return(string message) { return Return(CciResultType.Message, message); } + } +}