public void SaveTo(XmlTextWriter xw) { xw.WriteAttributeString("type", MappedType.ToString()); xw.WriteAttributeString("source", Source.ToString()); xw.WriteAttributeString("uuid", UUID.ToString()); if (Source == SourceType.RawInput) { xw.WriteAttributeString("vid", VendorID.ToString("X")); xw.WriteAttributeString("pid", ProductID.ToString("X")); xw.WriteAttributeString("rpt_hash", ReportHash.ToString()); xw.WriteAttributeString("idx", DeviceIndex.ToString()); } else if (Source == SourceType.XInput) { xw.WriteAttributeString("idx", DeviceIndex.ToString()); } else if (Source == SourceType.MUNIA) { xw.WriteAttributeString("devicepath", DevicePath); } else if (Source == SourceType.Arduino) { xw.WriteAttributeString("arduino_port", ArduinoPort.Name); xw.WriteAttributeString("arduino_type", ArduinoSource.ToString()); } xw.WriteStartElement("buttons"); foreach (var btn in ButtonMaps) { btn.SaveTo(xw); } xw.WriteEndElement(); xw.WriteStartElement("axes"); foreach (var axis in AxisMaps) { axis.SaveTo(xw); } xw.WriteEndElement(); xw.WriteStartElement("buttons_to_axis"); foreach (var btn in ButtonToAxisMaps) { btn.SaveTo(xw); } xw.WriteEndElement(); xw.WriteStartElement("axis_to_buttons"); foreach (var axis in AxisToButtonMaps) { axis.SaveTo(xw); } xw.WriteEndElement(); }
static DataTable ProtoRead(Stream stream) { DataTable table = new DataTable(); object[] values = null; using (ProtoReader reader = new ProtoReader(stream, null, null)) { int field; List <Func <object> > colReaders = new List <Func <object> >(); SubItemToken token; while ((field = reader.ReadFieldHeader()) != 0) { switch (field) { case 1: table.TableName = reader.ReadString(); break; case 2: string name = null; MappedType mappedType = (MappedType)(-1); token = ProtoReader.StartSubItem(reader); while ((field = reader.ReadFieldHeader()) != 0) { switch (field) { case 1: name = reader.ReadString(); break; case 2: mappedType = (MappedType)reader.ReadInt32(); break; default: reader.SkipField(); break; } } Type type; switch (mappedType) { case MappedType.Int32: type = typeof(int); colReaders.Add(() => reader.ReadInt32()); break; case MappedType.Int16: type = typeof(short); colReaders.Add(() => reader.ReadInt16()); break; case MappedType.Decimal: type = typeof(decimal); colReaders.Add(() => BclHelpers.ReadDecimal(reader)); break; case MappedType.String: type = typeof(string); colReaders.Add(() => reader.ReadString()); break; case MappedType.Guid: type = typeof(Guid); colReaders.Add(() => BclHelpers.ReadGuid(reader)); break; case MappedType.DateTime: type = typeof(DateTime); colReaders.Add(() => BclHelpers.ReadDateTime(reader)); break; default: throw new NotSupportedException(mappedType.ToString()); } ProtoReader.EndSubItem(token, reader); table.Columns.Add(name, type); values = null; break; case 3: if (values == null) { values = new object[table.Columns.Count]; } else { Array.Clear(values, 0, values.Length); } token = ProtoReader.StartSubItem(reader); while ((field = reader.ReadFieldHeader()) != 0) { if (field > values.Length) { reader.SkipField(); } else { int i = field - 1; values[i] = colReaders[i](); } } ProtoReader.EndSubItem(token, reader); table.Rows.Add(values); break; default: reader.SkipField(); break; } } } return(table); }