28 #define _DEFAULT_SOURCE
45 #define CHECK_RESULT(result) {int r = (result); if (r < 0) return (r);}
87 C_MEM (*file = calloc (1,
sizeof (
CameraFile)));
89 strcpy ((*file)->mime_type,
"unknown/unknown");
90 (*file)->ref_count = 1;
109 C_MEM (*file = calloc (1,
sizeof (
CameraFile)));
111 strcpy ((*file)->mime_type,
"unknown/unknown");
112 (*file)->ref_count = 1;
130 C_MEM (*file = calloc (1,
sizeof (
CameraFile)));
132 strcpy ((*file)->mime_type,
"unknown/unknown");
133 (*file)->ref_count = 1;
135 (*file)->handler = handler;
136 (*file)->private =
private;
171 file->ref_count += 1;
188 file->ref_count -= 1;
190 if (file->ref_count == 0)
206 unsigned long int size)
210 switch (file->accesstype) {
212 C_MEM (file->data = realloc (file->data, sizeof (
char) * (file->size + size)));
213 memcpy (&file->data[file->size], data, size);
217 unsigned long int curwritten = 0;
218 while (curwritten < size) {
219 ssize_t res = write (file->fd, data+curwritten, size-curwritten);
221 GP_LOG_E (
"Encountered error %d writing to fd.", errno);
225 GP_LOG_E (
"Encountered 0 bytes written to fd.");
233 uint64_t xsize = size;
235 C_PARAMS (file->handler->write);
236 return file->handler->write (file->private, (
unsigned char*)data, &xsize);
239 GP_LOG_E (
"Unknown file access type %d", file->accesstype);
255 size_t size,
size_t *readlen
259 switch (file->accesstype) {
261 if (size > file->size-file->offset)
262 size = file->size - file->offset;
263 memcpy (data, &file->data[file->offset], size);
264 file->offset += size;
265 if (readlen) *readlen = size;
268 unsigned long int curread = 0;
269 while (curread < size) {
270 ssize_t res = read (file->fd, data+curread, size-curread);
272 GP_LOG_E (
"Encountered error %d reading from fd.", errno);
276 GP_LOG_E (
"Encountered 0 bytes reading from fd.");
286 uint64_t xsize = size;
289 C_PARAMS (file->handler->read);
290 ret = file->handler->read (file->private, (
unsigned char*)data, &xsize);
293 GP_LOG_E (
"File handler read returned %d", ret);
297 GP_LOG_E (
"Unknown file access type %d", file->accesstype);
314 unsigned long int size)
318 switch (file->accesstype) {
321 file->data = (
unsigned char*)data;
325 unsigned int curwritten = 0;
328 if (-1 == lseek (file->fd, 0, SEEK_SET)) {
329 GP_LOG_E (
"Encountered error %d lseeking to 0.", errno);
332 if (-1 == ftruncate (file->fd, 0)) {
333 GP_LOG_E (
"Encountered error %d ftruncating to 0.", errno);
336 while (curwritten < size) {
337 ssize_t res = write (file->fd, data+curwritten, size-curwritten);
339 GP_LOG_E (
"Encountered error %d writing to fd.", errno);
343 GP_LOG_E (
"Encountered 0 bytes written to fd.");
355 uint64_t xsize = size;
358 C_PARAMS (file->handler->write);
360 ret = file->handler->write (file->private, (
unsigned char*)data, &xsize);
362 GP_LOG_E (
"Handler data() returned %d", ret);
372 GP_LOG_E (
"Unknown file access type %d", file->accesstype);
399 unsigned long int *size)
403 switch (file->accesstype) {
406 *data = (
char*)file->data;
412 unsigned long int curread = 0;
414 if (-1 == lseek (file->fd, 0, SEEK_END)) {
419 if (-1 == (offset = lseek (file->fd, 0, SEEK_CUR))) {
421 GP_LOG_E (
"Encountered error %d lseekin to CUR.", errno);
424 if (-1 == lseek (file->fd, 0, SEEK_SET)) {
426 GP_LOG_E (
"Encountered error %d lseekin to CUR.", errno);
429 if (size) *size = offset;
432 C_MEM (*data = malloc (offset));
433 while (curread < offset) {
434 ssize_t res = read (file->fd, (
char*)((*data)+curread), offset-curread);
437 GP_LOG_E (
"Encountered error %d reading.", errno);
442 GP_LOG_E (
"No progress during reading.");
453 C_PARAMS (file->handler->read);
454 ret = file->handler->size (file->private, &xsize);
456 GP_LOG_E (
"Encountered error %d querying size().", ret);
459 if (size) *size = xsize;
462 C_MEM (*data = malloc (xsize));
463 ret = file->handler->read (file->private, (
unsigned char*)*data, &xsize);
465 GP_LOG_E (
"Encountered error %d getting data().", ret);
472 GP_LOG_E (
"Unknown file access type %d", file->accesstype);
491 C_PARAMS (file && filename);
493 switch (file->accesstype) {
495 if (!(fp = fopen (filename,
"wb")))
497 if (fwrite (file->data, (
size_t)
sizeof(
char), (
size_t)file->size, fp) != (
size_t)file->size) {
498 GP_LOG_E (
"Not enough space on device in order to save '%s'.", filename);
507 unsigned long int curread = 0;
510 if (-1 == lseek (file->fd, 0, SEEK_END))
512 if (-1 == (offset = lseek (file->fd, 0, SEEK_CUR))) {
514 GP_LOG_E (
"Encountered error %d lseekin to CUR.", errno);
517 if (-1 == lseek (file->fd, 0, SEEK_SET)) {
519 GP_LOG_E (
"Encountered error %d lseekin to BEGIN.", errno);
522 C_MEM (data = malloc(65536));
523 if (!(fp = fopen (filename,
"wb"))) {
527 while (curread < offset) {
531 if (toread > (offset-curread))
532 toread = offset-curread;
533 res = read (file->fd, data, toread);
540 if (fwrite (data, 1, res, fp) != res) {
541 GP_LOG_E (
"Not enough space on device in order to save '%s'.", filename);
554 GP_LOG_E (
"Unknown file access type %d", file->accesstype);
559 u.actime = file->mtime;
560 u.modtime = file->mtime;
561 utime (filename, &u);
607 long size, size_read;
612 C_PARAMS (file && filename);
616 fp = fopen(filename,
"r");
619 fseek (fp, 0, SEEK_END);
623 switch (file->accesstype) {
625 file->data = malloc (
sizeof(
char)*(size + 1));
630 size_read = fread (file->data, (
size_t)
sizeof(
char), (
size_t)size, fp);
637 file->size = size_read;
638 file->data[size_read] = 0;
641 if (file->fd == -1) {
642 file->fd = dup(fileno(fp));
646 GP_LOG_E (
"Needs to be initialized with fd=-1 to work");
654 name = strrchr (filename,
'/');
656 strncpy (file->name, name + 1, sizeof (file->name));
658 strncpy (file->name, filename, sizeof (file->name));
661 dot = strrchr (filename,
'.');
665 strncpy (file->mime_type,
mime_table[i+1],
sizeof(file->mime_type));
675 sprintf(file->mime_type,
"image/%s", dot + 1);
681 sizeof (file->mime_type));
683 if (stat (filename, &s) != -1) {
684 file->mtime = s.st_mtime;
686 file->mtime = time (NULL);
708 switch (file->accesstype) {
718 strcpy (file->name,
"");
731 C_PARAMS (destination && source);
733 GP_LOG_D (
"Copying '%s' onto '%s'...", source->name, destination->name);
736 memcpy (destination->name, source->name, sizeof (source->name));
737 memcpy (destination->mime_type, source->mime_type, sizeof (source->mime_type));
738 destination->mtime = source->mtime;
742 free (destination->data);
743 destination->data = NULL;
744 destination->size = source->size;
745 C_MEM (destination->data = malloc (
sizeof (
char) * source->size));
746 memcpy (destination->data, source->data, source->size);
753 unsigned long int curread = 0;
755 free (destination->data);
756 destination->data = NULL;
758 if (-1 == lseek (source->fd, 0, SEEK_END)) {
763 if (-1 == (offset = lseek (source->fd, 0, SEEK_CUR))) {
765 GP_LOG_E (
"Encountered error %d lseekin to CUR.", errno);
768 if (-1 == lseek (source->fd, 0, SEEK_SET)) {
770 GP_LOG_E (
"Encountered error %d lseekin to CUR.", errno);
773 destination->size = offset;
774 C_MEM (destination->data = malloc (offset));
775 while (curread < offset) {
776 ssize_t res = read (source->fd, destination->data+curread, offset-curread);
778 free (destination->data);
779 GP_LOG_E (
"Encountered error %d reading.", errno);
783 free (destination->data);
784 GP_LOG_E (
"No progress during reading.");
796 lseek (destination->fd, 0, SEEK_SET);
797 if (-1 == ftruncate (destination->fd, 0))
799 lseek (source->fd, 0, SEEK_SET);
800 C_MEM (data = malloc (65536));
802 unsigned long curwritten = 0;
805 res = read (source->fd, data, 65536);
812 while (curwritten < res) {
813 ssize_t res2 = write (destination->fd, data+curwritten, res-curwritten);
831 unsigned long curwritten = 0;
832 while (curwritten < source->size) {
833 int res = write (destination->fd, source->data+curwritten, source->size-curwritten);
846 uint64_t xsize = source->size;
847 unsigned long curwritten = 0;
849 destination->handler->size (destination->private, &xsize);
850 while (curwritten < source->size) {
851 uint64_t tmpsize = source->size - curwritten;
852 int res = destination->handler->write (destination->private, source->data+curwritten, &tmpsize);
858 curwritten += tmpsize;
862 GP_LOG_E (
"Unhandled cases in gp_copy_file. Bad!");
875 C_PARAMS (file && name);
901 char *prefix = NULL, *s, *
new, *slash = NULL;
902 const char *suffix = NULL;
905 C_PARAMS (file && basename && newname);
910 C_MEM (*newname = strdup (basename));
915 if (!strcmp (
mime_table[i+1],file->mime_type)) {
920 s = strrchr(basename,
'.');
921 slash = strrchr(basename,
'/');
930 default: prefix =
"";
break;
938 C_MEM (
new = calloc (strlen(prefix) + (s-basename+1) + strlen (suffix) + 1, 1));
940 xlen = strlen (prefix);
942 memcpy (
new, basename, slash-basename+1);
943 strcat (
new, prefix);
944 memcpy (
new + strlen (
new), slash+1, s-slash+1);
946 strcpy (
new, prefix);
947 memcpy (
new + strlen (
new), basename, s-basename+1);
949 new[xlen+(s-basename)+1]=
'\0';
950 strcat (
new, suffix);
952 if (!suffix) suffix =
"";
953 C_MEM (
new = calloc (strlen(prefix) + strlen(basename) + 1 + strlen (suffix) + 1, 1));
955 memcpy (
new, basename, slash-basename+1);
956 strcat (
new, prefix);
957 strcat (
new, slash+1);
959 strcpy (
new, prefix);
960 strcat (
new, basename);
962 if (strlen(suffix)) {
964 strcat (
new, suffix);
981 C_PARAMS (file && mime_type);
983 *mime_type = file->mime_type;
998 C_PARAMS (file && name);
1000 strncpy (file->name, name, sizeof (file->name));
1015 C_PARAMS (file && mime_type);
1017 strncpy (file->mime_type, mime_type, sizeof (file->mime_type));
1031 const char TIFF_SOI_MARKER[] = {(char) 0x49, (
char) 0x49, (char) 0x2A,
1032 (
char) 0x00, (char) 0x08,
'\0' };
1033 const char JPEG_SOI_MARKER[] = {(char) 0xFF, (
char) 0xD8,
'\0' };
1037 switch (file->accesstype) {
1040 if ((file->size >= 5) && !memcmp (file->data, TIFF_SOI_MARKER, 5))
1044 else if ((file->size >= 2) && !memcmp (file->data, JPEG_SOI_MARKER, 2))
1054 offset = lseek (file->fd, 0, SEEK_SET);
1055 res = read (file->fd, data,
sizeof(data));
1059 if ((res >= 5) && !memcmp (data, TIFF_SOI_MARKER, 5))
1063 else if ((res >= 2) && !memcmp (data, JPEG_SOI_MARKER, 2))
1067 lseek (file->fd, offset, SEEK_SET);
1087 const char *table[] = {
1106 GP_LOG_D (
"Adjusting file name for mime type '%s'...", file->mime_type);
1107 for (x = 0; table[x]; x += 2)
1108 if (!strcmp (file->mime_type, table[x])) {
1111 suffix = strrchr (file->name,
'.');
1114 strcat (file->name, table[x + 1]);
1117 GP_LOG_D (
"Name adjusted to '%s'.", file->name);
1132 C_PARAMS (file && mtime);
1134 *mtime = file->mtime;
1151 file->mtime = mtime;