13d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij/**
23d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * \file thumb.c
33d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Example program to send and associate album art to an entity
43d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * on a device.
53d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
63d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Copyright (C) 2006 Robert Reardon <rreardon@monkshatch.vispa.com>
73d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
83d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * This library is free software; you can redistribute it and/or
93d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * modify it under the terms of the GNU Lesser General Public
103d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * License as published by the Free Software Foundation; either
113d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * version 2 of the License, or (at your option) any later version.
123d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
133d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * This library is distributed in the hope that it will be useful,
143d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * but WITHOUT ANY WARRANTY; without even the implied warranty of
153d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
163d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Lesser General Public License for more details.
173d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
183d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * You should have received a copy of the GNU Lesser General Public
193d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * License along with this library; if not, write to the
203d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
213d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Boston, MA 02111-1307, USA.
223d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij */
232f1b640e110452668d767b3a1d9e7a3a75a52c8eLinus Walleij#include "config.h"
245332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon#include "common.h"
255332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon#include "string.h"
265332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon#include <fcntl.h>
275332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon#include <errno.h>
282eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <stdlib.h>
292eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <unistd.h>
302eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <limits.h>
312eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <sys/types.h>
326f05002d6cfbf22777def1c79d92d4df323e5d48Linus Walleij#ifdef HAVE_SYS_UIO_H
332eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <sys/uio.h>
346f05002d6cfbf22777def1c79d92d4df323e5d48Linus Walleij#endif
352eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <sys/stat.h>
365332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
375332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardonstatic void usage(void) {
385332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  printf("Usage: thumb -i <fileid/trackid> <imagefile>\n");
395332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  exit(0);
405332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon}
415332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
425332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardonint main (int argc, char **argv) {
435332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  int opt;
445332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  extern int optind;
455332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  extern char *optarg;
465332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  LIBMTP_mtpdevice_t *device = NULL;
475332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  int fd;
485332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  uint32_t id = 0;
495332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  uint64_t filesize;
50f59e7fdfd114d3c72c8d8a640f33bd823e20dc17Marcus Meissner  char *imagedata = NULL;
515332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  char *path = NULL;
5220c3b6712c74c05c12b5e5f7123a2d7e1876c40eLinus Walleij  char *rest;
535332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  struct stat statbuff;
545332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  int ret;
555332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
56cd9f49913d12199fa7971309530a37f664df916etedbullock  fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n");
57cd9f49913d12199fa7971309530a37f664df916etedbullock
585332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  while ( (opt = getopt(argc, argv, "hi:")) != -1 ) {
595332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    switch (opt) {
605332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    case 'h':
615332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon      usage();
625332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    case 'i':
6320c3b6712c74c05c12b5e5f7123a2d7e1876c40eLinus Walleij      id = strtoul(optarg, &rest, 0);
645332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon      break;
655332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    default:
665332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon      usage();
675332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    }
685332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  }
695332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  argc -= optind;
705332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  argv += optind;
715332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
725332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  if ( argc != 1 ) {
735332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    printf("You need to pass a filename.\n");
745332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    usage();
755332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  }
765332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
775332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  path = argv[0];
785332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
795332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  if ( stat(path, &statbuff) == -1 ) {
805332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    fprintf(stderr, "%s: ", path);
815332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    perror("stat");
825332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    exit(1);
835332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  }
84f59e7fdfd114d3c72c8d8a640f33bd823e20dc17Marcus Meissner  filesize = statbuff.st_size;
85f59e7fdfd114d3c72c8d8a640f33bd823e20dc17Marcus Meissner  imagedata = malloc(filesize);
865332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
875332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon#ifdef __WIN32__
885b4a4d2b78e61715937b26c0bab9e901d891c937Linus Walleij  if ( (fd = open(path, O_RDONLY|O_BINARY) == -1) ) {
895332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon#else
905332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  if ( (fd = open(path, O_RDONLY)) == -1) {
915332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon#endif
925332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    printf("Couldn't open image file %s (%s)\n",path,strerror(errno));
935332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    return 1;
94f59e7fdfd114d3c72c8d8a640f33bd823e20dc17Marcus Meissner  } else {
95f59e7fdfd114d3c72c8d8a640f33bd823e20dc17Marcus Meissner    ret = read(fd, imagedata, filesize);
96f59e7fdfd114d3c72c8d8a640f33bd823e20dc17Marcus Meissner    if (ret == -1) perror("read thumb data");
975332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    close(fd);
985332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  }
995332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
1005332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  LIBMTP_Init();
1015332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  device = LIBMTP_Get_First_Device();
1025332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  if (device == NULL) {
1035332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    printf("No devices.\n");
1045332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    return 0;
1055332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  }
1065332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
1075332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  LIBMTP_filesampledata_t *thumb = LIBMTP_new_filesampledata_t();
108f59e7fdfd114d3c72c8d8a640f33bd823e20dc17Marcus Meissner  thumb->data = imagedata;
1095332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  thumb->size = filesize;
1105332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  thumb->filetype = LIBMTP_FILETYPE_JPEG;
1115332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  ret = LIBMTP_Send_Representative_Sample(device,id,thumb);
1125332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  if (ret != 0) {
1135332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon    printf("Couldn't send thumbnail\n");
114070e9b4a25c2384f070f20b92c8101c9e3f58f33Linus Walleij    LIBMTP_Dump_Errorstack(device);
115070e9b4a25c2384f070f20b92c8101c9e3f58f33Linus Walleij    LIBMTP_Clear_Errorstack(device);
1165332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  }
1175332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
118f1b02f2781e71391dbf4eb421f5204d08d15caf4Linus Walleij  LIBMTP_destroy_filesampledata_t(thumb);
1195332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon
1205332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  LIBMTP_Release_Device(device);
1215332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  printf("OK.\n");
1225332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon  return 0;
1235332f9ca4a10f9b0cea998be9f872d5da2c21e4erreardon}
124