Note that additional memory may be required to typecheck Augeas lenses (RHBZ#729887).
[libguestfs.git] / generator / generator_python.ml
index f3a2a94..48dd24f 100644 (file)
@@ -28,6 +28,7 @@ open Generator_optgroups
 open Generator_actions
 open Generator_structs
 open Generator_c
+open Generator_events
 
 (* Generate Python C module. *)
 let rec generate_python_c () =
@@ -455,6 +456,10 @@ free_strings (char **argv)
   pr "static PyMethodDef methods[] = {\n";
   pr "  { (char *) \"create\", py_guestfs_create, METH_VARARGS, NULL },\n";
   pr "  { (char *) \"close\", py_guestfs_close, METH_VARARGS, NULL },\n";
+  pr "  { (char *) \"set_event_callback\",\n";
+  pr "    py_guestfs_set_event_callback, METH_VARARGS, NULL },\n";
+  pr "  { (char *) \"delete_event_callback\",\n";
+  pr "    py_guestfs_delete_event_callback, METH_VARARGS, NULL },\n";
   List.iter (
     fun (name, _, _, _, _, _, _) ->
       pr "  { (char *) \"%s\", py_guestfs_%s, METH_VARARGS, NULL },\n"
@@ -531,6 +536,18 @@ logvols = g.lvs ()
 
 import libguestfsmod
 
+";
+
+  List.iter (
+    fun (name, bitmask) ->
+      pr "EVENT_%s = 0x%x\n" (String.uppercase name) bitmask
+  ) events;
+  pr "\n";
+
+  pr "\
+class ClosedHandle(ValueError):
+    pass
+
 class GuestFS:
     \"\"\"Instances of this class are libguestfs API handles.\"\"\"
 
@@ -539,7 +556,57 @@ class GuestFS:
         self._o = libguestfsmod.create ()
 
     def __del__ (self):
+        if self._o:
+            libguestfsmod.close (self._o)
+
+    def _check_not_closed (self):
+        if not self._o:
+            raise ClosedHandle (\"GuestFS: method called on closed handle\")
+
+    def close (self):
+        u\"\"\"Explicitly close the guestfs handle.
+
+        The handle is closed implicitly when its reference count goes
+        to zero (eg. when it goes out of scope or the program ends).
+
+        This call is only needed if you want to force the handle to
+        close now.  After calling this, the program must not call
+        any method on the handle (except the implicit call to
+        __del__ which happens when the final reference is cleaned up).
+        \"\"\"
+        self._check_not_closed ()
         libguestfsmod.close (self._o)
+        self._o = None
+
+    def set_event_callback (self, cb, event_bitmask):
+        u\"\"\"Register an event callback.
+
+        Register \"cb\" as a callback function for all of the
+        events in \"event_bitmask\".  \"event_bitmask\" should be
+        one or more \"guestfs.EVENT_*\" flags logically or'd together.
+
+        This function returns an event handle which can be used
+        to delete the callback (see \"delete_event_callback\").
+
+        The callback function receives 4 parameters:
+
+        cb (event, event_handle, buf, array)
+
+        \"event\" is one of the \"EVENT_*\" flags.  \"buf\" is a
+        message buffer (only for some types of events).  \"array\"
+        is an array of integers (only for some types of events).
+
+        You should read the documentation for
+        \"guestfs_set_event_callback\" in guestfs(3) before using
+        this function.
+        \"\"\"
+        self._check_not_closed ()
+        return libguestfsmod.set_event_callback (self._o, cb, event_bitmask)
+
+    def delete_event_callback (self, event_handle):
+        u\"\"\"Delete an event callback.\"\"\"
+        self._check_not_closed ()
+        libguestfsmod.delete_event_callback (self._o, event_handle)
 
 ";
 
@@ -599,6 +666,7 @@ class GuestFS:
         | StringList n | DeviceList n ->
             pr "        %s = list (%s)\n" n n
       ) args;
+      pr "        self._check_not_closed ()\n";
       pr "        return libguestfsmod.%s (self._o" name;
       List.iter (fun arg -> pr ", %s" (name_of_argt arg)) (args@optargs);
       pr ")\n\n";