using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.IO; namespace SCJMapper_V2 { /// /// Maintains an action - something like: /// /// /// /// /// class ActionCls { private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); // Static items to have this mapping in only one place /// /// Returns the Device ID i.e. the single letter to tag a device /// /// The device name from the CryFile /// The single UCase device ID letter static public String DevID( String device ) { switch ( device.ToLower( ) ) { case "keyboard": return "K"; case JoystickCls.DeviceName: return "J"; case "xboxpad": return "X"; case "ps3pad": return "P"; default: return "Z"; } } /// /// Returns the Device name from the ID /// /// The single UCase device ID letter /// The device name from the CryFile static public String DeviceFromID( String devID ) { switch ( devID ) { case "K": return "keyboard"; case "J": return JoystickCls.DeviceName; case "X": return "xboxpad"; case "P": return "ps3pad"; default: return "unknown"; } } // Class items public String key { get; set; } // the key is the "Daction" formatted item (as we can have the same name multiple times) public String name { get; set; } public String device { get; set; } public String input { get; set; } public String defBinding { get; set; } // the default binding /// /// ctor /// public ActionCls( ) { device = "joystick"; // what else ?? } /// /// Merge action is simply copying the new input control /// /// public void Merge( ActionCls newAc ) { input = newAc.input; } /// /// Dump the action as partial XML nicely formatted /// /// the action as XML fragment public String toXML( ) { String r = ""; if ( !String.IsNullOrEmpty( input ) ) r = String.Format( "\t\n\t\t\t\n\t\t\n", name, device, input ); return r; } /// /// Read an action from XML - do some sanity check /// /// the XML action fragment /// True if an action was decoded public Boolean fromXML( String xml ) { XmlReaderSettings settings = new XmlReaderSettings( ); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.IgnoreWhitespace = true; settings.IgnoreComments = true; XmlReader reader = XmlReader.Create( new StringReader( xml ), settings ); reader.Read( ); if ( reader.Name == "action" ) { if ( reader.HasAttributes ) { name = reader["name"]; // Move the reader back to the element node. reader.ReadStartElement( "action" ); } else { return false; } } if ( reader.Name == "rebind" ) { if ( reader.HasAttributes ) { device = reader["device"]; input = reader["input"]; key = DevID( device ) + name; // unique id of the action // Move the reader back to the element node. reader.ReadStartElement( "rebind" ); } } else { return false; } return true; } } }