summaryrefslogtreecommitdiff
path: root/cli.c
diff options
context:
space:
mode:
Diffstat (limited to 'cli.c')
-rw-r--r--cli.c59
1 files changed, 38 insertions, 21 deletions
diff --git a/cli.c b/cli.c
index 79225c1..a5c20c7 100644
--- a/cli.c
+++ b/cli.c
@@ -20,21 +20,35 @@
* Web: http://ni.fr.eu.org/
* Email: <nico at ni.fr.eu.org>
*/
-#define _GNU_SOURCE
-#include <stdio.h>
+#include <glib.h>
+#include "cli.h"
#include "device.h"
#include "utils.h"
-#include "cli.h"
-void
+static bool
cli_read_images(libusb_context *usb, struct device *device, int count,
- bool raw, const char *out)
+ bool raw, const char *out, GError **error)
{
- device_start(device);
- for (int i = 0; i < count;) {
- struct image *image = device_read(device);
- if (image) {
+ g_return_val_if_fail(error == NULL || *error == NULL, false);
+ if (!device_start(device, error))
+ return false;
+ bool ret = true;
+ for (int i = 0; ret && i < count;) {
+ /* Read image. */
+ GError *image_error = NULL;
+ struct image *image = device_read(device, &image_error);
+ if (!image && image_error) {
+ g_propagate_error(error, image_error);
+ ret = false;
+ } else if (!image) {
+ /* No image yet, handle events. */
+ int r = libusb_handle_events(usb);
+ if (r)
+ utils_fatal("unable to handle libusb events: %s",
+ libusb_strerror(r));
+ } else {
+ /* Image received. */
if (!raw && image->format != IMAGE_FORMAT_XBGR32) {
struct image *cimage = image_new(image->width, image->height,
image->width * 4, IMAGE_FORMAT_XBGR32);
@@ -42,19 +56,18 @@ cli_read_images(libusb_context *usb, struct device *device, int count,
image_unref(image);
image = cimage;
}
- char *name = NULL;
- if (asprintf(&name, out, i) < 0)
- utils_fatal("can not prepare file name");
+ char *name = g_strdup_printf(out, i);
utils_info("write %s", name);
- image_save(image, name);
- free(name);
+ if (!image_save(image, name, error))
+ ret = false;
+ g_free(name);
image_unref(image);
i++;
- } else {
- libusb_handle_events(usb);
}
}
- device_stop(device);
+ if (!device_stop(device, ret ? error : NULL))
+ return false;
+ return ret;
}
int
@@ -64,9 +77,10 @@ cli_run(struct options *options)
int r = libusb_init(&usb);
if (r)
utils_fatal("unable to initialize libusb: %s", libusb_strerror(r));
- struct device *device = device_open(usb);
+ GError *error = NULL;
+ struct device *device = device_open(usb, &error);
if (!device)
- utils_fatal("unable to find device");
+ utils_fatal("unable to find device: %s", error->message);
const struct device_info *info = device_get_info(device);
if (options->exposure_ms > 0.0)
device_set_exposure(device, options->exposure_ms);
@@ -84,8 +98,11 @@ cli_run(struct options *options)
if (width == -1)
utils_fatal("no matching resolution");
device_set_resolution(device, width, height, 0);
- cli_read_images(usb, device, options->count, options->raw, options->out);
- device_close(device);
+ if (!cli_read_images(usb, device, options->count, options->raw,
+ options->out, &error))
+ utils_fatal("unable to read images: %s", error->message);
+ if (!device_close(device, &error))
+ utils_fatal("unable to close device: %s", error->message);
libusb_exit(usb);
return EXIT_SUCCESS;
}