#define _DARWIN_C_SOURCE #include "samples.h" #include #include #include /* * This function looks up a label or key entry of * a configuration widget. * The functions descend recursively, so you can just * specify the last component. */ static int _lookup_widget(CameraWidget*widget, const char *key, CameraWidget **child) { int ret; ret = gp_widget_get_child_by_name (widget, key, child); if (ret < GP_OK) ret = gp_widget_get_child_by_label (widget, key, child); return ret; } /* Gets a string configuration value. * This can be: * - A Text widget * - The current selection of a Radio Button choice * - The current selection of a Menu choice * * Sample (for Canons eg): * get_config_value_string (camera, "owner", &ownerstr, context); */ int get_config_value_string (Camera *camera, const char *key, char **str, GPContext *context) { CameraWidget *widget = NULL, *child = NULL; CameraWidgetType type; int ret; char *val; ret = gp_camera_get_single_config (camera, key, &child, context); if (ret == GP_OK) { if (!child) fprintf(stderr,"child is NULL?\n"); widget = child; } else { ret = gp_camera_get_config (camera, &widget, context); if (ret < GP_OK) { fprintf (stderr, "camera_get_config failed: %d\n", ret); return ret; } ret = _lookup_widget (widget, key, &child); if (ret < GP_OK) { fprintf (stderr, "lookup widget failed: %d\n", ret); goto out; } } /* This type check is optional, if you know what type the label * has already. If you are not sure, better check. */ ret = gp_widget_get_type (child, &type); if (ret < GP_OK) { fprintf (stderr, "widget get type failed: %d\n", ret); goto out; } switch (type) { case GP_WIDGET_MENU: case GP_WIDGET_RADIO: case GP_WIDGET_TEXT: break; default: fprintf (stderr, "widget has bad type %d\n", type); ret = GP_ERROR_BAD_PARAMETERS; goto out; } /* This is the actual query call. Note that we just * a pointer reference to the string, not a copy... */ ret = gp_widget_get_value (child, &val); if (ret < GP_OK) { fprintf (stderr, "could not query widget value: %d\n", ret); goto out; } /* Create a new copy for our caller. */ *str = strdup (val); out: gp_widget_free (widget); return ret; } /* Sets a string configuration value. * This can set for: * - A Text widget * - The current selection of a Radio Button choice * - The current selection of a Menu choice * * Sample (for Canons eg): * get_config_value_string (camera, "owner", &ownerstr, context); */ int set_config_value_string (Camera *camera, const char *key, const char *val, GPContext *context) { CameraWidget *widget = NULL, *child = NULL; CameraWidgetType type; int ret; ret = gp_camera_get_config (camera, &widget, context); if (ret < GP_OK) { fprintf (stderr, "camera_get_config failed: %d\n", ret); return ret; } ret = _lookup_widget (widget, key, &child); if (ret < GP_OK) { fprintf (stderr, "lookup widget failed: %d\n", ret); goto out; } /* This type check is optional, if you know what type the label * has already. If you are not sure, better check. */ ret = gp_widget_get_type (child, &type); if (ret < GP_OK) { fprintf (stderr, "widget get type failed: %d\n", ret); goto out; } switch (type) { case GP_WIDGET_MENU: case GP_WIDGET_RADIO: case GP_WIDGET_TEXT: break; default: fprintf (stderr, "widget has bad type %d\n", type); ret = GP_ERROR_BAD_PARAMETERS; goto out; } /* This is the actual set call. Note that we keep * ownership of the string and have to free it if necessary. */ ret = gp_widget_set_value (child, val); if (ret < GP_OK) { fprintf (stderr, "could not set widget value: %d\n", ret); goto out; } ret = gp_camera_set_single_config (camera, key, child, context); if (ret != GP_OK) { /* This stores it on the camera again */ ret = gp_camera_set_config (camera, widget, context); if (ret < GP_OK) { fprintf (stderr, "camera_set_config failed: %d\n", ret); return ret; } } out: gp_widget_free (widget); return ret; } /* * This enables/disables the specific canon capture mode. * * For non canons this is not required, and will just return * with an error (but without negative effects). */ int canon_enable_capture (Camera *camera, int onoff, GPContext *context) { CameraWidget *widget = NULL, *child = NULL; CameraWidgetType type; int ret; ret = gp_camera_get_single_config (camera, "capture", &widget, context); if (ret < GP_OK) { fprintf (stderr, "camera_get_config failed: %d\n", ret); return ret; } ret = gp_widget_get_type (child, &type); if (ret < GP_OK) { fprintf (stderr, "widget get type failed: %d\n", ret); goto out; } switch (type) { case GP_WIDGET_TOGGLE: break; default: fprintf (stderr, "widget has bad type %d\n", type); ret = GP_ERROR_BAD_PARAMETERS; goto out; } /* Now set the toggle to the wanted value */ ret = gp_widget_set_value (child, &onoff); if (ret < GP_OK) { fprintf (stderr, "toggling Canon capture to %d failed with %d\n", onoff, ret); goto out; } /* OK */ ret = gp_camera_set_single_config (camera, "capture", widget, context); if (ret < GP_OK) { fprintf (stderr, "camera_set_config failed: %d\n", ret); return ret; } out: gp_widget_free (widget); return ret; }