Improve error handling and reporting in the LED pattern parser
authorPhilipp Zabel <philipp.zabel@gmail.com>
Tue, 10 Aug 2010 15:18:50 +0000 (17:18 +0200)
committerPhilipp Zabel <philipp.zabel@gmail.com>
Tue, 10 Aug 2010 16:27:50 +0000 (18:27 +0200)
src/led-pattern-rx44.vala
src/led-pattern-rx51.vala
src/led-pattern.vala
src/led-program-dialog.vala
src/mce-ini-parse.vala

index 5b9554c..ad2d0dd 100644 (file)
@@ -21,26 +21,24 @@ class LedPatternRX44 : LedPattern {
        public List<LedCommandRX44> engine_g;
        public List<LedCommandRX44> engine_b;
 
-       public override bool parse (string line) {
+       public override void parse (string line) throws LedPatternError {
                string[] key_value = line.split ("=");
 
-               if (key_value.length != 2) {
-                       print ("pattern line does not contain '=': %s\n", line);
-                       return false;
-               }
+               if (key_value.length != 2)
+                       throw new LedPatternError.INVALID_PATTERN ("pattern line does not contain '=': " + line);
+
+               name = key_value[0];
 
                string[] p = key_value[1].split (";");
-               if (p.length != 6) {
-                       print ("pattern does not contain 6 components: %d\n", p.length);
-                       return false;
-               }
+               if (p.length != 6)
+                       throw new LedPatternError.INVALID_PATTERN ("%s does not contain 6 components: %d".printf (name, p.length));
 
-               if (p[3].length > 16*4 || p[4].length > 16*4 || p[5].length > 16*4) {
-                       print ("pattern too long!\n");
-                       return false;
-               }
+               if (p[3].length > 16*4 || p[4].length > 16*4 || p[5].length > 16*4)
+                       throw new LedPatternError.INVALID_PATTERN ("%s engine pattern too long!".printf (name));
+
+               if (p[3].length % 4 != 0 || p[4].length % 4 != 0 || p[5].length % 4 != 0)
+                       throw new LedPatternError.INVALID_PATTERN ("%s engine pattern not an even number of bytes!".printf (name));
 
-               name = key_value[0];
                priority = p[0].to_int ();
                screen_on = p[1].to_int ();
                timeout = p[2].to_int ();
@@ -49,7 +47,6 @@ class LedPatternRX44 : LedPattern {
                engine_b = parse_pattern (p[5]);
 
                on_changed ();
-               return true;
        }
 
        private List<LedCommandRX44> parse_pattern (string pattern) {
index 1518c4b..b4163e9 100644 (file)
@@ -22,26 +22,24 @@ class LedPatternRX51 : LedPattern {
        public List<LedCommandRX51> engine1;
        public List<LedCommandRX51> engine2;
 
-       public override bool parse (string line) {
+       public override void parse (string line) throws LedPatternError {
                string[] key_value = line.split ("=");
 
-               if (key_value.length != 2) {
-                       print ("pattern line does not contain '=': %s\n", line);
-                       return false;
-               }
+               if (key_value.length != 2)
+                       throw new LedPatternError.INVALID_PATTERN ("pattern line does not contain '=': " + line);
+
+               name = key_value[0];
 
                string[] p = key_value[1].split (";");
-               if (p.length != 6) {
-                       print ("pattern does not contain 6 components: %d\n", p.length);
-                       return false;
-               }
+               if (p.length != 6)
+                       throw new LedPatternError.INVALID_PATTERN ("%s does not contain 6 components: %d".printf (name, p.length));
 
-               if (p[4].length > 16*4 || p[5].length > 16*4) {
-                       print ("pattern too long!\n");
-                       return false;
-               }
+               if (p[4].length > 16*4 || p[5].length > 16*4)
+                       throw new LedPatternError.INVALID_PATTERN ("%s engine pattern too long!".printf (name));
+
+               if (p[4].length % 4 != 0 || p[5].length % 4 != 0)
+                       throw new LedPatternError.INVALID_PATTERN ("%s engine pattern not an even number of bytes!".printf (name));
 
-               name = key_value[0];
                priority = p[0].to_int ();
                screen_on = p[1].to_int ();
                timeout = p[2].to_int ();
@@ -57,7 +55,6 @@ class LedPatternRX51 : LedPattern {
                }
 
                on_changed ();
-               return true;
        }
 
        private void parse_led_map (string led_map, out LedColor color1, out LedColor color2) {
@@ -174,10 +171,12 @@ class LedPatternRX51 : LedPattern {
 
        public void on_changed () {
                bool unresolved = calculate_timing ();
-               if (unresolved)
+               if (unresolved) {
                        unresolved = calculate_timing ();
-               if (unresolved)
+               }
+               if (unresolved) {
                        Hildon.Banner.show_information (null, null, "Timing unresolved");
+               }
                changed ();
        }
 
index 4f9b196..fe3446c 100644 (file)
  * along with LED Pattern Editor. If not, see <http://www.gnu.org/licenses/>.
  */
 
+errordomain LedPatternError {
+       INVALID_PATTERN;
+}
+
 abstract class LedPattern : Object {
        enum ScreenOn {
                DISPLAY_OFF = 0,
@@ -34,7 +38,7 @@ abstract class LedPattern : Object {
        public double duration;
 
        public abstract string dump ();
-       public abstract bool parse (string line);
+       public abstract void parse (string line) throws LedPatternError;
 
        public signal void changed ();
 }
index 63e8eda..004d0ea 100644 (file)
@@ -150,9 +150,10 @@ class LedProgramDialog : Gtk.Dialog {
 
        void on_text_received (Gtk.Clipboard clipboard, string text) {
                var clip_pattern = new LedPatternRX51 ();
-               if (clip_pattern.parse (text)) {
+               try {
+                       clip_pattern.parse (text);
                        lpv.pattern.replace_with (clip_pattern);
-               } else {
+               } catch (LedPatternError e) {
                        Hildon.Banner.show_information (null, null, "Not a valid pattern");
                }
        }
index 3198ed5..c4d07ff 100644 (file)
@@ -52,8 +52,12 @@ List<LedPattern> mce_ini_parse () {
                                                pattern = new LedPatternRX51 ();
                                                break;
                                        }
-                                       pattern.parse (line);
-                                       list.append (pattern);
+                                       try {
+                                               pattern.parse (line);
+                                               list.append (pattern);
+                                       } catch (LedPatternError e) {
+                                               Hildon.Banner.show_information (null, null, e.message);
+                                       }
                                }
                                line = f.read_line ();
                        }