/** * Captures a preview that won't be stored on the camera but returned in * supplied file. * * @param camera a #Camera * @param file a #CameraFile * @param context a #GPContext * @return a gphoto2 error code * * For example, you could use gp_capture_preview() for taking some sample * pictures before calling gp_capture(). * **/ int gp_camera_capture_preview (Camera *camera, CameraFile *file, GPContext *context) { char *xname; C_PARAMS (camera && file); CHECK_INIT (camera, context); CR (camera, gp_file_clean (file), context); if (!camera->functions->capture_preview) { gp_context_error (context, _("This camera can " "not capture previews.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->capture_preview ( camera, file, context), context); gp_file_get_name_by_type (file, "capture_preview", GP_FILE_TYPE_NORMAL, &xname); /* FIXME: Marcus ... will go away, just keep compatible now. */ gp_file_set_name (file, xname); free (xname); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Reads a file partially from the #Camera. * * @param camera a #Camera * @param folder a folder * @param file the name of a file * @param type the #CameraFileType * @param offset the offset into the camera file * @param data the buffer receiving the data * @param size the size to be read and that was read * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_file_read (Camera *camera, const char *folder, const char *file, CameraFileType type, uint64_t offset, char *buf, uint64_t *size, GPContext *context) { GP_LOG_D ("Getting file '%s' in folder '%s'...", file, folder); C_PARAMS (camera && folder && file && buf && size); CHECK_INIT (camera, context); /* Did we get reasonable foldername/filename? */ if (strlen (folder) == 0) { CAMERA_UNUSED (camera, context); return (GP_ERROR_DIRECTORY_NOT_FOUND); } if (strlen (file) == 0) { CAMERA_UNUSED (camera, context); return (GP_ERROR_FILE_NOT_FOUND); } CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_read_file (camera->fs, folder, file, type, offset, buf, size, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Retrieves a file from the #Camera. * * @param camera a #Camera * @param folder a folder * @param file the name of a file * @param type the #CameraFileType * @param camera_file a #CameraFile * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_file_get (Camera *camera, const char *folder, const char *file, CameraFileType type, CameraFile *camera_file, GPContext *context) { gp_log (GP_LOG_DEBUG, "gphoto2-camera", "Getting file '%s' in " "folder '%s'...", file, folder); CHECK_NULL (camera && folder && file && camera_file); CHECK_INIT (camera, context); CR (camera, gp_file_clean (camera_file), context); /* Did we get reasonable foldername/filename? */ if (strlen (folder) == 0) { CAMERA_UNUSED (camera, context); return (GP_ERROR_DIRECTORY_NOT_FOUND); } if (strlen (file) == 0) { CAMERA_UNUSED (camera, context); return (GP_ERROR_FILE_NOT_FOUND); } CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_get_file (camera->fs, folder, file, type, camera_file, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Removes an (empty) directory called \c name from the given \c folder. * * @param camera a #Camera * @param folder the folder from which to remove the directory * @param name the name of the directory to be removed * @param context a #GPContext * @return a gphoto2 error code * */ int gp_camera_folder_remove_dir (Camera *camera, const char *folder, const char *name, GPContext *context) { CHECK_NULL (camera && folder && name); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_remove_dir (camera->fs, folder, name, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Sets some file properties like name or permissions. * * @param camera a #Camera * @param folder a folder * @param file the name of a file * @param info the #CameraFileInfo * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_file_set_info (Camera *camera, const char *folder, const char *file, CameraFileInfo info, GPContext *context) { CHECK_NULL (camera && folder && file); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_set_info (camera->fs, folder, file, info, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Deletes the file from \c folder. * * \param camera a #Camera * \param folder a folder * \param file the name of a file * \param context a #GPContext * \return a gphoto2 error code * **/ int gp_camera_file_delete (Camera *camera, const char *folder, const char *file, GPContext *context) { GP_LOG_D ("Deleting file '%s' in folder '%s'...", file, folder); C_PARAMS (camera && folder && file); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_delete_file ( camera->fs, folder, file, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Deletes all files in a given \c folder. * * @param camera a #Camera * @param folder a folder * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_folder_delete_all (Camera *camera, const char *folder, GPContext *context) { GP_LOG_D ("Deleting all files in '%s'...", folder); C_PARAMS (camera && folder); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_delete_all (camera->fs, folder, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Uploads a file into given \c folder. * * @param camera a #Camera * @param folder a folder * @param file a #CameraFile * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_folder_put_file (Camera *camera, const char *folder, CameraFile *file, GPContext *context) { gp_log (GP_LOG_DEBUG, "gphoto2-camera", "Uploading file into '%s'...", folder); CHECK_NULL (camera && folder && file); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_put_file (camera->fs, folder, file, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Deletes the file from \c folder. * * \param camera a #Camera * \param folder a folder * \param file the name of a file * \param context a #GPContext * \return a gphoto2 error code * **/ int gp_camera_file_delete (Camera *camera, const char *folder, const char *file, GPContext *context) { gp_log (GP_LOG_DEBUG, "gphoto2-camera", "Deleting file '%s' in " "folder '%s'...", file, folder); CHECK_NULL (camera && folder && file); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_delete_file ( camera->fs, folder, file, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Triggers capture of one or more images. * * @param camera a #Camera * @param context a #GPContext * @return a gphoto2 error code * * This functions just remotely causes the shutter release and returns * immediately. You will want to run #gp_camera_wait_event until a image * is added which can be downloaded using #gp_camera_file_get. **/ int gp_camera_trigger_capture (Camera *camera, GPContext *context) { C_PARAMS (camera); CHECK_INIT (camera, context); if (!camera->functions->trigger_capture) { gp_context_error (context, _("This camera can not trigger capture.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->trigger_capture (camera, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Lists the folders in supplied \c folder. * * @param camera a #Camera * @param folder a folder * @param list a #CameraList * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_folder_list_folders (Camera *camera, const char* folder, CameraList *list, GPContext *context) { GP_LOG_D ("Listing folders in '%s'...", folder); C_PARAMS (camera && folder && list); CHECK_INIT (camera, context); CR (camera, gp_list_reset (list), context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_list_folders ( camera->fs, folder, list, context), context); CR (camera, gp_list_sort (list), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * \brief Gets information on the camera attached storage. * * \param camera a #Camera * \param sifs Pointer to receive a pointer to/array of storage info items * \param nrofsifs Pointer to receive number of array entries * \param context a #GPContext * \return a gphoto2 error code * * Retrieves the storage information, like maximum and free space, for * the specified filesystem, if supported by the device. The storage * information is returned in an newly allocated array of * #CameraStorageInformation objects, to which the pointer pointed to * by #sifs will be set. * * The variable pointed to by #nrofsifs will be set to the number of * elements in that array. * * It is the caller's responsibility to free the memory of the array. * **/ int gp_camera_get_storageinfo ( Camera *camera, CameraStorageInformation **sifs, int *nrofsifs, GPContext *context) { CHECK_NULL (camera && sifs && nrofsifs); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_get_storageinfo ( camera->fs, sifs, nrofsifs, context ), context ); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Lists the files in supplied \c folder. * * @param camera a #Camera * @param folder a folder * @param list a #CameraList * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_folder_list_files (Camera *camera, const char *folder, CameraList *list, GPContext *context) { gp_log (GP_LOG_DEBUG, "gphoto2-camera", "Listing files in '%s'...", folder); CHECK_NULL (camera && folder && list); CHECK_INIT (camera, context); CR (camera, gp_list_reset (list), context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_list_files (camera->fs, folder, list, context), context); CR (camera, gp_list_sort (list), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Uploads a file into given \c folder. * * @param camera a #Camera * @param folder a folder * @param file a #CameraFile * @param context a #GPContext * @return a gphoto2 error code * **/ int gp_camera_folder_put_file (Camera *camera, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context) { GP_LOG_D ("Uploading file into '%s'...", folder); C_PARAMS (camera && folder && file); CHECK_INIT (camera, context); CHECK_RESULT_OPEN_CLOSE (camera, gp_filesystem_put_file (camera->fs, folder, filename, type, file, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Wait for an event from the camera. * * @param camera a Camera * @param timeout amount of time to wait in 1/1000 seconds * @param eventtype received CameraEventType [out] * @param eventdata received event specific data [out] * @param context a GPContext * @return gphoto2 error code * * This function blocks and waits for an event to come from the camera. If * timeout occurs before an event is received then * *eventtype==GP_EVENT_TIMEOUT and eventdata is left unchanged. * If an event is received then eventtype is set to the type of event, and * eventdata is set to event specific data. See the CameraEventType enum * to see which eventtype's match to which types of eventdata. * */ int gp_camera_wait_for_event (Camera *camera, int timeout, CameraEventType *eventtype, void **eventdata, GPContext *context) { CHECK_NULL (camera); CHECK_INIT (camera, context); if (!camera->functions->wait_for_event) { CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->wait_for_event ( camera, timeout, eventtype, eventdata, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Retrieve a configuration \c window for the \c camera. * * @param camera a #Camera * @param window a #CameraWidget * @param context a #GPContext * @return gphoto2 error code * * This \c window can be used for construction of a configuration dialog. * */ int gp_camera_get_config (Camera *camera, CameraWidget **window, GPContext *context) { C_PARAMS (camera); CHECK_INIT (camera, context); if (!camera->functions->get_config) { gp_context_error (context, _("This camera does " "not provide any configuration options.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->get_config ( camera, window, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Captures an image, movie, or sound clip depending on the given \c type. * * @param camera a #Camera * @param type a #CameraCaptureType * @param path a #CameraFilePath * @param context a #GPContext * @return a gphoto2 error code * * The resulting file will be stored on the camera. The location gets stored * in \c path. The file can then be downloaded using #gp_camera_file_get. * **/ int gp_camera_capture (Camera *camera, CameraCaptureType type, CameraFilePath *path, GPContext *context) { CHECK_NULL (camera); CHECK_INIT (camera, context); if (!camera->functions->capture) { gp_context_error (context, _("This camera can not capture.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->capture (camera, type, path, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Retrieves the \c manual for given \c camera. * * @param camera a #Camera * @param manual a #CameraText * @param context a #GPContext * @return a gphoto2 error code * * This manual typically contains information about using the camera. * **/ int gp_camera_get_manual (Camera *camera, CameraText *manual, GPContext *context) { CHECK_NULL (camera && manual); CHECK_INIT (camera, context); if (!camera->functions->manual) { gp_context_error (context, _("This camera " "does not offer a manual.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->manual (camera, manual, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Retrieves information about the camera driver. * * @param camera a #Camera * @param about a #CameraText * @param context a #GPContext * @return a gphoto2 error code * * Typically, this information contains name and address of the author, * acknowledgements, etc. * **/ int gp_camera_get_about (Camera *camera, CameraText *about, GPContext *context) { CHECK_NULL (camera && about); CHECK_INIT (camera, context); if (!camera->functions->about) { gp_context_error (context, _("This camera does " "not provide information about the driver.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->about (camera, about, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Retrieves a camera summary. * * @param camera a #Camera * @param summary a #CameraText * @param context a #GPContext * @return a gphoto2 error code * * This summary typically contains information like manufacturer, pictures * taken, or generally information that is not configurable. * **/ int gp_camera_get_summary (Camera *camera, CameraText *summary, GPContext *context) { CHECK_NULL (camera && summary); CHECK_INIT (camera, context); if (!camera->functions->summary) { gp_context_error (context, _("This camera does " "not support summaries.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->summary (camera, summary, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Sets the configuration. * * @param camera a #Camera * @param window a #CameraWidget * @param context a #GPContext * @return a gphoto2 error code * * Typically, a \c window is retrieved using #gp_camera_get_config and passed * to this function in order to adjust the settings on the camera. * **/ int gp_camera_set_config (Camera *camera, CameraWidget *window, GPContext *context) { CHECK_NULL (camera && window); CHECK_INIT (camera, context); if (!camera->functions->set_config) { gp_context_error (context, _("This camera does " "not support setting configuration options.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->set_config (camera, window, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
/** * Captures a preview that won't be stored on the camera but returned in * supplied file. * * @param camera a #Camera * @param file a #CameraFile * @param context a #GPContext * @return a gphoto2 error code * * For example, you could use #gp_capture_preview for taking some sample * pictures before calling #gp_capture. * **/ int gp_camera_capture_preview (Camera *camera, CameraFile *file, GPContext *context) { CHECK_NULL (camera && file); CHECK_INIT (camera, context); CR (camera, gp_file_clean (file), context); if (!camera->functions->capture_preview) { gp_context_error (context, _("This camera can " "not capture previews.")); CAMERA_UNUSED (camera, context); return (GP_ERROR_NOT_SUPPORTED); } CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->capture_preview ( camera, file, context), context); CAMERA_UNUSED (camera, context); return (GP_OK); }
int gp_camera_list_config (Camera *camera, CameraList *list, GPContext *context) { CameraWidget *rootwidget; int ret; C_PARAMS (camera); CHECK_INIT (camera, context); if (camera->functions->list_config) { CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->list_config ( camera, list, context), context); CAMERA_UNUSED (camera, context); return GP_OK; } if (!camera->functions->get_config) { gp_context_error (context, _("This camera does not provide any configuration options.")); CAMERA_UNUSED (camera, context); return GP_ERROR_NOT_SUPPORTED; } /* emulate it ... */ CHECK_OPEN (camera, context); ret = camera->functions->get_config ( camera, &rootwidget, context); if (ret != GP_OK) { CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; } _get_widget_names (rootwidget, list); gp_widget_free (rootwidget); CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; }
/** * Retrieve a single configuration \c widget for the \c camera. * * @param camera a #Camera * @param name the name of a configuration widget * @param widget a #CameraWidget * @param context a #GPContext * @return gphoto2 error code * * This \c widget will then contain the current and the possible values and the type. * */ int gp_camera_get_single_config (Camera *camera, const char *name, CameraWidget **widget, GPContext *context) { CameraWidget *rootwidget, *child; CameraWidgetType type; const char *label; int ret, ro; C_PARAMS (camera); CHECK_INIT (camera, context); if (camera->functions->get_single_config) { CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->get_single_config ( camera, name, widget, context), context); CAMERA_UNUSED (camera, context); return GP_OK; } if (!camera->functions->get_config) { gp_context_error (context, _("This camera does not provide any configuration options.")); CAMERA_UNUSED (camera, context); return GP_ERROR_NOT_SUPPORTED; } /* emulate it ... */ CHECK_OPEN (camera, context); ret = camera->functions->get_config ( camera, &rootwidget, context); if (ret != GP_OK) { CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; } ret = gp_widget_get_child_by_name (rootwidget, name, &child); if (ret != GP_OK) { gp_widget_free (rootwidget); CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; } /* We need to duplicate the widget, as we will free the widgettree */ gp_widget_get_type (child, &type); gp_widget_get_label (child, &label); gp_widget_get_readonly (child, &ro); ret = gp_widget_new (type, label, widget); if (ret != GP_OK) goto out; gp_widget_set_name (*widget, name); gp_widget_set_readonly (*widget, ro); switch (type) { case GP_WIDGET_MENU: case GP_WIDGET_RADIO: { char *value; int i, nrofchoices; nrofchoices = gp_widget_count_choices (child); for (i = 0; i < nrofchoices; i++) { const char *choice; gp_widget_get_choice (child, i, &choice); gp_widget_add_choice (*widget, choice); } gp_widget_get_value (child, &value); gp_widget_set_value (*widget, value); break; } case GP_WIDGET_TEXT: { char *value; gp_widget_get_value (child, &value); gp_widget_set_value (*widget, value); break; } case GP_WIDGET_RANGE: { float value, rmin, rmax, rstep; gp_widget_get_range (child, &rmin, &rmax, &rstep); gp_widget_set_range (*widget, rmin, rmax, rstep); gp_widget_get_value (child, &value); gp_widget_set_value (*widget, &value); break; } case GP_WIDGET_TOGGLE: case GP_WIDGET_DATE: { int value; gp_widget_get_value (child, &value); gp_widget_set_value (*widget, &value); break; } case GP_WIDGET_BUTTON: case GP_WIDGET_SECTION: case GP_WIDGET_WINDOW: default: ret = GP_ERROR_BAD_PARAMETERS; break; } out: gp_widget_free (rootwidget); CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; }
/** * Set a single configuration \c widget for the \c camera. * * @param camera a #Camera * @param name the name of a configuration widget * @param widget a #CameraWidget * @param context a #GPContext * @return gphoto2 error code * * This \c widget contains the new value of the widget to set. * */ int gp_camera_set_single_config (Camera *camera, const char *name, CameraWidget *widget, GPContext *context) { CameraWidget *rootwidget, *child; CameraWidgetType type; int ret; C_PARAMS (camera); CHECK_INIT (camera, context); if (camera->functions->set_single_config) { CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->set_single_config ( camera, name, widget, context), context); CAMERA_UNUSED (camera, context); return GP_OK; } if (!camera->functions->set_config) { gp_context_error (context, _("This camera does not provide any configuration options.")); CAMERA_UNUSED (camera, context); return GP_ERROR_NOT_SUPPORTED; } /* emulate single config with the full tree */ CHECK_OPEN (camera, context); ret = camera->functions->get_config ( camera, &rootwidget, context); if (ret != GP_OK) { CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; } ret = gp_widget_get_child_by_name (rootwidget, name, &child); if (ret != GP_OK) { gp_widget_free (rootwidget); CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; } gp_widget_get_type (child, &type); ret = GP_OK; switch (type) { case GP_WIDGET_MENU: case GP_WIDGET_RADIO: case GP_WIDGET_TEXT: { char *value; gp_widget_get_value (widget, &value); gp_widget_set_value (child, value); break; } case GP_WIDGET_RANGE: { float value; gp_widget_get_value (widget, &value); gp_widget_set_value (child, &value); break; } case GP_WIDGET_TOGGLE: case GP_WIDGET_DATE: { int value; gp_widget_get_value (widget, &value); gp_widget_set_value (child, &value); break; } case GP_WIDGET_BUTTON: case GP_WIDGET_SECTION: case GP_WIDGET_WINDOW: default: ret = GP_ERROR_BAD_PARAMETERS; break; } gp_widget_set_changed (child, 1); if (ret == GP_OK) ret = camera->functions->set_config (camera, rootwidget, context); gp_widget_free (rootwidget); CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; }