Added the listening machinery
authorEnrico Zini <enrico@enricozini.org>
Thu, 17 Dec 2009 23:20:27 +0000 (23:20 +0000)
committerEnrico Zini <enrico@enricozini.org>
Thu, 17 Dec 2009 23:20:27 +0000 (23:20 +0000)
src/libomhacks.vapi
src/uevent.vala

index 78137c4945209a1d698ed206a3bb9c2c59730e58..10577a7e583144e95eb6ae66a64aa383b72ae5fa 100644 (file)
@@ -16,9 +16,8 @@ namespace Omhacks
 
     namespace UEvent
     {
-        [Compact]
-        [CCode (cname = "struct om_uevent")]
-        public class Event
+        [CCode (cname = "struct om_uevent", cheader_filename = "omhacks/uevent.h", destroy_function = "")]
+        public struct Event
         {
             public string buffer;
             size_t buflen;
index b63fb6f52098a445c334f90e95e71b928f3e1343..5d5dcffff5d7c07d4cbc6e45514f8e3234ad91f6 100644 (file)
@@ -25,20 +25,41 @@ namespace uevent {
 
 class UEvent : Service
 {
-    protected int sock;
+    protected IOChannel sock;
+    protected uint sock_watch = 0;
+    public Omhacks.UEvent.Event event_data;
+    public signal void event();
+
+    public UEvent()
+    {
+        //event_data = Omhacks.UEvent.Event();
+    }
+
+    protected bool on_input_data(IOChannel source, IOCondition condition)
+    {
+        if (condition != IOCondition.IN) return true;
+
+        Omhacks.UEvent.read(sock.unix_get_fd(), ref event_data);
+        event();
+
+        return true;
+    }
 
     /// Activate the service
     protected override void start()
     {
         if (started) return;
 
-        sock = Omhacks.UEvent.open();
-        if (sock < 0)
+        int sock_fd = Omhacks.UEvent.open();
+        if (sock_fd < 0)
         {
             zavai.log.error("UEvent: error getting socket");
             return;
         }
 
+        sock = new IOChannel.unix_new(sock_fd);
+        sock_watch = sock.add_watch(IOCondition.IN, on_input_data);
+
         base.start();
     }
 
@@ -46,7 +67,13 @@ class UEvent : Service
     protected override void stop()
     {
         if (!started) return;
-        // Do here
+        Source.remove(sock_watch);
+        try {
+            sock.shutdown(false);
+        } catch (IOChannelError e) {
+            zavai.log.error("When closing UEvent socket: " + e.message);
+        }
+        sock = null;
         base.stop();
     }
 }