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