This is basically a continuation of the work from #1002 but her for the camlibs directory. The purpose was to replace spaces as a means for indentation with tab characters. Note: there are some files which are still offending the general rule but are (mostly) consistent within themselves. I let them be for the moment. Fixing them would basically replace the whole file. Also: there are still a ton of whitespace related inconsistencies like "x=10" vs "x = 10" or "func(10)" vs "func (10)". This is a whitespace only change (if you include newlines as whitespace).
142 lines
4.3 KiB
C
142 lines
4.3 KiB
C
/*
|
|
* This code released into the public domain 21 July 2008
|
|
*
|
|
* This program does the equivalent of:
|
|
* gphoto2 --shell
|
|
* > set-config capture=1
|
|
* > capture-image-and-download
|
|
* compile with gcc -Wall -o canon-capture -lgphoto2 canon-capture.c
|
|
*
|
|
* Taken from: http://credentiality2.blogspot.com/2008/07/linux-libgphoto2-image-capture-from.html
|
|
*
|
|
* and condensed into simple capture sample
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <gphoto2/gphoto2.h>
|
|
|
|
#include "samples.h"
|
|
|
|
static void
|
|
errordumper(GPLogLevel level, const char *domain, const char *str, void *data) {
|
|
fprintf(stdout, "%s\n", str);
|
|
}
|
|
|
|
static void
|
|
capture_to_memory(Camera *camera, GPContext *context, const char **ptr, unsigned long int *size) {
|
|
int retval;
|
|
CameraFile *file;
|
|
CameraFilePath camera_file_path;
|
|
|
|
printf("Capturing.\n");
|
|
|
|
/* NOP: This gets overridden in the library to /capt0000.jpg */
|
|
strcpy(camera_file_path.folder, "/");
|
|
strcpy(camera_file_path.name, "foo.jpg");
|
|
|
|
retval = gp_camera_capture(camera, GP_CAPTURE_IMAGE, &camera_file_path, context);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
printf("Pathname on the camera: %s/%s\n", camera_file_path.folder, camera_file_path.name);
|
|
|
|
retval = gp_file_new(&file);
|
|
printf(" Retval: %d\n", retval);
|
|
retval = gp_camera_file_get(camera, camera_file_path.folder, camera_file_path.name,
|
|
GP_FILE_TYPE_NORMAL, file, context);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
gp_file_get_data_and_size (file, ptr, size);
|
|
|
|
printf("Deleting.\n");
|
|
retval = gp_camera_file_delete(camera, camera_file_path.folder, camera_file_path.name,
|
|
context);
|
|
printf(" Retval: %d\n", retval);
|
|
/*gp_file_free(file); */
|
|
}
|
|
|
|
static void
|
|
capture_to_file(Camera *camera, GPContext *context, char *fn) {
|
|
int fd, retval;
|
|
CameraFile *file;
|
|
CameraFilePath camera_file_path;
|
|
CameraFileInfo info;
|
|
|
|
printf("Capturing.\n");
|
|
|
|
/* NOP: This gets overridden in the library to /capt0000.jpg */
|
|
strcpy(camera_file_path.folder, "/");
|
|
strcpy(camera_file_path.name, "foo.jpg");
|
|
|
|
retval = gp_camera_capture(camera, GP_CAPTURE_IMAGE, &camera_file_path, context);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
|
|
printf("Pathname on the camera: %s/%s\n", camera_file_path.folder, camera_file_path.name);
|
|
|
|
retval = gp_camera_file_get_info (camera, camera_file_path.folder, camera_file_path.name, &info, context);
|
|
printf (" file info reported flags: %d\n", info.file.fields);
|
|
if (info.file.fields & GP_FILE_INFO_MTIME) printf (" info reported mtime: %ld\n", info.file.mtime);
|
|
if (info.file.fields & GP_FILE_INFO_SIZE) printf (" info reported size: %ld\n", info.file.size);
|
|
if (info.file.fields & GP_FILE_INFO_TYPE) printf (" info reported type: %s\n", info.file.type);
|
|
|
|
fd = open(fn, O_CREAT | O_WRONLY | O_BINARY, 0644);
|
|
retval = gp_file_new_from_fd(&file, fd);
|
|
printf(" Retval: %d\n", retval);
|
|
retval = gp_camera_file_get(camera, camera_file_path.folder, camera_file_path.name,
|
|
GP_FILE_TYPE_NORMAL, file, context);
|
|
printf(" Retval: %d\n", retval);
|
|
|
|
gp_file_free(file);
|
|
|
|
printf("Deleting.\n");
|
|
retval = gp_camera_file_delete(camera, camera_file_path.folder, camera_file_path.name,
|
|
context);
|
|
printf(" Retval: %d\n", retval);
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv) {
|
|
Camera *camera;
|
|
int retval;
|
|
GPContext *context = sample_create_context();
|
|
FILE *f;
|
|
char *data;
|
|
unsigned long size;
|
|
|
|
gp_log_add_func(GP_LOG_ERROR, errordumper, NULL);
|
|
gp_camera_new(&camera);
|
|
|
|
/* When I set GP_LOG_DEBUG instead of GP_LOG_ERROR above, I noticed that the
|
|
* init function seems to traverse the entire filesystem on the camera. This
|
|
* is partly why it takes so long.
|
|
* (Marcus: the ptp2 driver does this by default currently.)
|
|
*/
|
|
printf("Camera init. Takes about 10 seconds.\n");
|
|
retval = gp_camera_init(camera, context);
|
|
if (retval != GP_OK) {
|
|
printf(" Retval of capture_to_file: %d\n", retval);
|
|
exit (1);
|
|
}
|
|
capture_to_file(camera, context, "foo.jpg");
|
|
|
|
capture_to_memory(camera, context, (const char**)&data, &size);
|
|
|
|
f = fopen("foo2.jpg", "wb");
|
|
if (f) {
|
|
retval = fwrite (data, size, 1, f);
|
|
if (retval != (int)size) {
|
|
printf(" fwrite size %ld, written %d\n", size, retval);
|
|
}
|
|
fclose(f);
|
|
} else
|
|
printf(" fopen foo2.jpg failed.\n");
|
|
gp_camera_exit(camera, context);
|
|
return 0;
|
|
}
|