From d6bdcc8895e38e8b4a61dd6e550103bce44e71b3 Mon Sep 17 00:00:00 2001 From: Sebastian Reichel Date: Wed, 27 Mar 2013 00:06:53 +0100 Subject: handle errors --- src/curses-ui/main.vala | 18 +++++-- src/pdf-invoice/pdf-invoice.vala | 8 ++- src/scanner-session/scannersession.vala | 19 ++++++- src/web/Makefile | 2 +- src/web/csv.vala | 2 +- src/web/web.vala | 93 ++++++++++++++++++++++++++++++++- src/web/websession.vala | 10 ++-- 7 files changed, 137 insertions(+), 15 deletions(-) diff --git a/src/curses-ui/main.vala b/src/curses-ui/main.vala index 1d79c43..b70ecbc 100644 --- a/src/curses-ui/main.vala +++ b/src/curses-ui/main.vala @@ -14,24 +14,36 @@ */ public MainLoop loop; +public AudioPlayer audio; + +private static void play(string file) { + try { + audio.play_system(file); + } catch(IOError e) { } +} public static int main(string[] args) { + /* handle unix signals */ Unix.signal_add(Posix.SIGTERM, handle_signals); Unix.signal_add(Posix.SIGINT, handle_signals); - AudioPlayer audio = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.AudioPlayer", "/io/mainframe/shopsystem/audio"); + try { + audio = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.AudioPlayer", "/io/mainframe/shopsystem/audio"); + } catch(IOError e) { + error("IOError: %s\n", e.message); + } var ui = new CursesUI(); ui.log("KtT Shop System has been started"); - audio.play_system("startup.ogg"); + play("startup.ogg"); /* run mainloop */ loop.run(); ui.log("Stopping Shop System"); - audio.play_system("shutdown.ogg"); + play("shutdown.ogg"); /* we need to run the mainloop to play audio */ audio.end_of_stream.connect(() => { loop.quit(); }); diff --git a/src/pdf-invoice/pdf-invoice.vala b/src/pdf-invoice/pdf-invoice.vala index 095dcc6..8a6242d 100644 --- a/src/pdf-invoice/pdf-invoice.vala +++ b/src/pdf-invoice/pdf-invoice.vala @@ -52,8 +52,12 @@ public class InvoicePDF { } private void render_svg(Cairo.Context ctx, string file) { - var svg = new Rsvg.Handle.from_file(file); - svg.render_cairo(ctx); + try { + var svg = new Rsvg.Handle.from_file(file); + svg.render_cairo(ctx); + } catch(Error e) { + error("Could not load SVG: %s\n", e.message); + } } private void draw_footer(Cairo.Context ctx) { diff --git a/src/scanner-session/scannersession.vala b/src/scanner-session/scannersession.vala index 6926ba9..5d87cc8 100644 --- a/src/scanner-session/scannersession.vala +++ b/src/scanner-session/scannersession.vala @@ -23,13 +23,17 @@ public class ScannerSessionImplementation { private Database db; private AudioPlayer audio; + private SerialDevice dev; public signal void msg(MessageType type, string message); public ScannerSessionImplementation() { try { db = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.Database", "/io/mainframe/shopsystem/database"); + dev = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.SerialDevice", "/io/mainframe/shopsystem/device"); audio = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.AudioPlayer", "/io/mainframe/shopsystem/audio"); + + dev.received_barcode.connect(handle_barcode); } catch(IOError e) { error("IOError: %s\n", e.message); } @@ -46,7 +50,7 @@ public class ScannerSessionImplementation { logged_in = false; } - private bool login(int user) { + private bool login(int user) throws IOError { this.user = user; try { this.name = db.get_username(user); @@ -60,7 +64,18 @@ public class ScannerSessionImplementation { return true; } - private bool interpret(string scannerdata) { + private void handle_barcode(string scannerdata) { + try { + if(interpret(scannerdata)) + dev.blink(1000); + } catch(IOError e) { + send_message(MessageType.ERROR, "IOError: %s", e.message); + } catch(DatabaseError e) { + send_message(MessageType.ERROR, "DatabaseError: %s", e.message); + } + } + + private bool interpret(string scannerdata) throws DatabaseError, IOError { if(scannerdata.has_prefix("USER ")) { string str_id = scannerdata.substring(5); int32 id = int.parse(str_id); diff --git a/src/web/Makefile b/src/web/Makefile index cc9d77e..de305d9 100644 --- a/src/web/Makefile +++ b/src/web/Makefile @@ -1,7 +1,7 @@ all: web web: main.vala web.vala websession.vala csv.vala template.vala ../database/db-interface.vala ../pgp/pgp-interface.vala ../price.vapi - valac -o $@ --vapidir=../../vapi --pkg gee-1.0 --pkg gio-2.0 --pkg libsoup-2.4 --pkg posix --pkg libarchive --pkg gpgme $^ + valac -o $@ --vapidir=../../vapi --enable-experimental --pkg gee-1.0 --pkg gio-2.0 --pkg libsoup-2.4 --pkg posix $^ clean: rm -rf web diff --git a/src/web/csv.vala b/src/web/csv.vala index 4e32a0a..f9622b8 100644 --- a/src/web/csv.vala +++ b/src/web/csv.vala @@ -16,7 +16,7 @@ public class CSVMemberFile { private UserInfo[] members; - public Gee.List missing_unblocked_members() { + public Gee.List missing_unblocked_members() throws DatabaseError, IOError { var result = new Gee.ArrayList(); var dbusers = db.get_member_ids(); diff --git a/src/web/web.vala b/src/web/web.vala index 1c0d9b7..3e58fe6 100644 --- a/src/web/web.vala +++ b/src/web/web.vala @@ -26,6 +26,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -40,6 +46,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -98,6 +110,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -145,6 +163,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -243,6 +267,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -291,6 +321,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -403,6 +439,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -455,6 +497,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -519,6 +567,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -562,6 +616,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -614,6 +674,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -655,6 +721,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } @@ -787,6 +859,12 @@ public class WebServer { return; } + void handler_400(Soup.Server server, Soup.Message msg, string path, GLib.HashTable? query, Soup.ClientContext client) { + string result = "Internal Server Error\n"; + msg.set_status(400); + msg.set_response("text/plain", Soup.MemoryUse.COPY, result.data); + } + void handler_404(Soup.Server server, Soup.Message msg, string path, GLib.HashTable? query, Soup.ClientContext client) { string result = "Page not Found\n"; msg.set_status(404); @@ -804,7 +882,14 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); - } } + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } + } void handler_todo(Soup.Server server, Soup.Message msg, string path, GLib.HashTable? query, Soup.ClientContext client) { try { @@ -816,6 +901,12 @@ public class WebServer { } catch(TemplateError e) { stderr.printf(e.message+"\n"); handler_404(server, msg, path, query, client); + } catch(DatabaseError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); + } catch(IOError e) { + stderr.printf(e.message+"\n"); + handler_400(server, msg, path, query, client); } } diff --git a/src/web/websession.vala b/src/web/websession.vala index 5c562c6..1dc6319 100644 --- a/src/web/websession.vala +++ b/src/web/websession.vala @@ -67,14 +67,14 @@ public class WebSession { return result; } - private void setup_auth(int user) { + private void setup_auth(int user) throws DatabaseError, IOError { var auth = db.get_user_auth(user); this.disabled = auth.disabled; this.superuser = auth.superuser; this.logged_in = true; } - public void logout() { + public void logout() throws DatabaseError, IOError { if(logged_in) { db.set_sessionid(user, ""); superuser = false; @@ -82,7 +82,7 @@ public class WebSession { } } - public WebSession(Soup.Server server, Soup.Message msg, string path, GLib.HashTable? query, Soup.ClientContext client) { + public WebSession(Soup.Server server, Soup.Message msg, string path, GLib.HashTable? query, Soup.ClientContext client) throws DatabaseError, IOError { var cookies = Soup.cookies_from_request(msg); /* Check for existing session */ @@ -95,7 +95,7 @@ public class WebSession { name = db.get_username(user); setup_auth(user); return; - } catch(WebSessionError e) { + } catch(DatabaseError e) { /* invalid session, ignore */ } } @@ -128,7 +128,7 @@ public class WebSession { user = userid; try { name = db.get_username(user); - } catch(WebSessionError e) { + } catch(DatabaseError e) { name = "Unknown User"; } -- cgit v1.2.3