From: Philipp Zabel Date: Tue, 10 Aug 2010 15:18:50 +0000 (+0200) Subject: Improve error handling and reporting in the LED pattern parser X-Git-Url: http://vcs.maemo.org/git/?p=led-pattern-ed;a=commitdiff_plain;h=4445913670dd11e52e4c9c1a1e78839ec7f76912 Improve error handling and reporting in the LED pattern parser --- diff --git a/src/led-pattern-rx44.vala b/src/led-pattern-rx44.vala index 5b9554c..ad2d0dd 100644 --- a/src/led-pattern-rx44.vala +++ b/src/led-pattern-rx44.vala @@ -21,26 +21,24 @@ class LedPatternRX44 : LedPattern { public List engine_g; public List 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 parse_pattern (string pattern) { diff --git a/src/led-pattern-rx51.vala b/src/led-pattern-rx51.vala index 1518c4b..b4163e9 100644 --- a/src/led-pattern-rx51.vala +++ b/src/led-pattern-rx51.vala @@ -22,26 +22,24 @@ class LedPatternRX51 : LedPattern { public List engine1; public List 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 (); } diff --git a/src/led-pattern.vala b/src/led-pattern.vala index 4f9b196..fe3446c 100644 --- a/src/led-pattern.vala +++ b/src/led-pattern.vala @@ -16,6 +16,10 @@ * along with LED Pattern Editor. If not, see . */ +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 (); } diff --git a/src/led-program-dialog.vala b/src/led-program-dialog.vala index 63e8eda..004d0ea 100644 --- a/src/led-program-dialog.vala +++ b/src/led-program-dialog.vala @@ -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"); } } diff --git a/src/mce-ini-parse.vala b/src/mce-ini-parse.vala index 3198ed5..c4d07ff 100644 --- a/src/mce-ini-parse.vala +++ b/src/mce-ini-parse.vala @@ -52,8 +52,12 @@ List 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 (); }