<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>libmtp: sendtr.c</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.6.2 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> <li><a href="dirs.html"><span>Directories</span></a></li> <li><a href="examples.html"><span>Examples</span></a></li> </ul> </div> </div> <div class="contents"> <h1>sendtr.c</h1><div class="fragment"><pre class="fragment"> <span class="preprocessor">#include "config.h"</span> <span class="preprocessor">#include "common.h"</span> <span class="preprocessor">#include "util.h"</span> <span class="preprocessor">#include <stdlib.h></span> <span class="preprocessor">#include <limits.h></span> <span class="preprocessor">#include <string.h></span> <span class="preprocessor">#include <libgen.h></span> <span class="preprocessor">#include <sys/stat.h></span> <span class="preprocessor">#include <sys/types.h></span> <span class="preprocessor">#include <fcntl.h></span> <span class="preprocessor">#ifdef HAVE_LANGINFO_H</span> <span class="preprocessor"></span><span class="preprocessor">#include <langinfo.h></span> <span class="preprocessor">#endif</span> <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="libmtp_8h.html">libmtp.h</a>"</span> <span class="preprocessor">#include "pathutils.h"</span> <span class="keyword">extern</span> <a name="_a0"></a><a class="code" href="structLIBMTP__folder__struct.html">LIBMTP_folder_t</a> *folders; <span class="keyword">extern</span> <a name="_a1"></a><a class="code" href="structLIBMTP__file__struct.html">LIBMTP_file_t</a> *files; <span class="keyword">extern</span> <a name="_a2"></a><a class="code" href="structLIBMTP__mtpdevice__struct.html">LIBMTP_mtpdevice_t</a> *device; <span class="keywordtype">int</span> sendtrack_function (<span class="keywordtype">char</span> *, <span class="keywordtype">char</span> *, <span class="keywordtype">char</span> *, <span class="keywordtype">char</span> *, <span class="keywordtype">char</span> *, <span class="keywordtype">char</span> *, <span class="keywordtype">char</span> *, <span class="keywordtype">char</span> *, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t); <span class="keywordtype">void</span> sendtrack_command (<span class="keywordtype">int</span>, <span class="keywordtype">char</span> **); <span class="keywordtype">void</span> sendtrack_usage (<span class="keywordtype">void</span>); <span class="keywordtype">void</span> sendtrack_usage (<span class="keywordtype">void</span>) { fprintf(stderr, <span class="stringliteral">"usage: sendtr [ -D debuglvl ] [ -q ]\n"</span>); fprintf(stderr, <span class="stringliteral">"-t <title> -a <artist> -A <Album artist> -w <writer or composer>\n"</span>); fprintf(stderr, <span class="stringliteral">" -l <album> -c <codec> -g <genre> -n <track number> -y <year>\n"</span>); fprintf(stderr, <span class="stringliteral">" -d <duration in seconds> -s <storage_id> <local path> <remote path>\n"</span>); fprintf(stderr, <span class="stringliteral">"(-q means the program will not ask for missing information.)\n"</span>); } <span class="keyword">static</span> <span class="keywordtype">char</span> *prompt (<span class="keyword">const</span> <span class="keywordtype">char</span> *prompt, <span class="keywordtype">char</span> *buffer, <span class="keywordtype">size_t</span> bufsz, <span class="keywordtype">int</span> required) { <span class="keywordtype">char</span> *cp, *bp; <span class="keywordflow">while</span> (1) { fprintf(stdout, <span class="stringliteral">"%s> "</span>, prompt); <span class="keywordflow">if</span> ( fgets(buffer, bufsz, stdin) == NULL ) { <span class="keywordflow">if</span> (ferror(stdin)) { perror(<span class="stringliteral">"fgets"</span>); } <span class="keywordflow">else</span> { fprintf(stderr, <span class="stringliteral">"EOF on stdin\n"</span>); } <span class="keywordflow">return</span> NULL; } cp = strrchr(buffer, <span class="charliteral">'\n'</span>); <span class="keywordflow">if</span> ( cp != NULL ) *cp = <span class="charliteral">'\0'</span>; bp = buffer; <span class="keywordflow">while</span> ( bp != cp ) { <span class="keywordflow">if</span> ( *bp != <span class="charliteral">' '</span> && *bp != <span class="charliteral">'\t'</span> ) <span class="keywordflow">return</span> bp; bp++; } <span class="keywordflow">if</span> (! required) <span class="keywordflow">return</span> bp; } } <span class="keyword">static</span> <span class="keywordtype">int</span> add_track_to_album(<a name="_a3"></a><a class="code" href="structLIBMTP__album__struct.html">LIBMTP_album_t</a> *albuminfo, <a name="_a4"></a><a class="code" href="structLIBMTP__track__struct.html">LIBMTP_track_t</a> *trackmeta) { <a class="code" href="structLIBMTP__album__struct.html">LIBMTP_album_t</a> *album; <a class="code" href="structLIBMTP__album__struct.html">LIBMTP_album_t</a> *found_album = NULL; <span class="keywordtype">int</span> ret; <span class="comment">/* Look for the album */</span> album = <a name="a5"></a><a class="code" href="group__albums.html#gaf5286f0ef2b670357415e874c0b4ddef">LIBMTP_Get_Album_List</a>(device); <span class="keywordflow">while</span>(album != NULL) { <span class="keywordflow">if</span> ((album-><a name="a6"></a><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a> != NULL && album-><a name="a7"></a><a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a> != NULL && !strcmp(album-><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>, albuminfo-><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>) && !strcmp(album-><a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a>, albuminfo-><a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a>)) || (album-><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a> != NULL && album-><a name="a8"></a><a class="code" href="structLIBMTP__album__struct.html#adc7e7d63735fd0ae4bc2b021e8d5de97">composer</a> != NULL && !strcmp(album-><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>, albuminfo-><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>) && !strcmp(album-><a class="code" href="structLIBMTP__album__struct.html#adc7e7d63735fd0ae4bc2b021e8d5de97">composer</a>, albuminfo-><a class="code" href="structLIBMTP__album__struct.html#adc7e7d63735fd0ae4bc2b021e8d5de97">composer</a>))) { <span class="comment">/* Disconnect this album for later use */</span> found_album = album; album = album-><a name="a9"></a><a class="code" href="structLIBMTP__album__struct.html#a110324cda7d476290b7de3aead13a583">next</a>; found_album-><a class="code" href="structLIBMTP__album__struct.html#a110324cda7d476290b7de3aead13a583">next</a> = NULL; } <span class="keywordflow">else</span> { <a class="code" href="structLIBMTP__album__struct.html">LIBMTP_album_t</a> *tmp; tmp = album; album = album-><a class="code" href="structLIBMTP__album__struct.html#a110324cda7d476290b7de3aead13a583">next</a>; <a name="a10"></a><a class="code" href="group__albums.html#ga59eeda2ae84ce07f2e69134d322c6c14">LIBMTP_destroy_album_t</a>(tmp); } } <span class="keywordflow">if</span> (found_album != NULL) { uint32_t *tracks; tracks = (uint32_t *)malloc((found_album-><a name="a11"></a><a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a>+1) * <span class="keyword">sizeof</span>(uint32_t)); printf(<span class="stringliteral">"Album \"%s\" found: updating...\n"</span>, found_album-><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>); <span class="keywordflow">if</span> (!tracks) { printf(<span class="stringliteral">"failed malloc in add_track_to_album()\n"</span>); <span class="keywordflow">return</span> 1; } found_album-><a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a>++; <span class="keywordflow">if</span> (found_album-><a name="a12"></a><a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a> != NULL) { memcpy(tracks, found_album-><a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a>, found_album-><a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a> * <span class="keyword">sizeof</span>(uint32_t)); free(found_album-><a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a>); } tracks[found_album-><a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a>-1] = trackmeta-><a name="a13"></a><a class="code" href="structLIBMTP__track__struct.html#a794e60bb22d9dd93b2f4cd7bb935f10b">item_id</a>; found_album-><a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a> = tracks; ret = <a name="a14"></a><a class="code" href="group__albums.html#gaa450fa92015dc62ae770fd3792f33311">LIBMTP_Update_Album</a>(device, found_album); <a class="code" href="group__albums.html#ga59eeda2ae84ce07f2e69134d322c6c14">LIBMTP_destroy_album_t</a>(found_album); } <span class="keywordflow">else</span> { uint32_t *trackid; trackid = (uint32_t *)malloc(<span class="keyword">sizeof</span>(uint32_t)); *trackid = trackmeta-><a class="code" href="structLIBMTP__track__struct.html#a794e60bb22d9dd93b2f4cd7bb935f10b">item_id</a>; albuminfo-><a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a> = trackid; albuminfo-><a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a> = 1; albuminfo-><a name="a15"></a><a class="code" href="structLIBMTP__album__struct.html#a583729ede11c6fcf9c1968b0d594c423">storage_id</a> = trackmeta-><a name="a16"></a><a class="code" href="structLIBMTP__track__struct.html#a17f3721dfe5fe4b17d6cd8071f96fbda">storage_id</a>; printf(<span class="stringliteral">"Album doesn't exist: creating...\n"</span>); ret = <a name="a17"></a><a class="code" href="group__albums.html#ga588192a48fdfc772dfe02a9c54b94109">LIBMTP_Create_New_Album</a>(device, albuminfo); <span class="comment">/* albuminfo will be destroyed later by caller */</span> } <span class="keywordflow">if</span> (ret != 0) { printf(<span class="stringliteral">"Error creating or updating album.\n"</span>); printf(<span class="stringliteral">"(This could be due to that your device does not support albums.)\n"</span>); <a name="a18"></a><a class="code" href="group__basic.html#ga682c81a83fa04b2caf5c962db1eaff82">LIBMTP_Dump_Errorstack</a>(device); <a name="a19"></a><a class="code" href="group__basic.html#ga6c05b927310ac830c149ae3eeae94047">LIBMTP_Clear_Errorstack</a>(device); } <span class="keywordflow">else</span> { printf(<span class="stringliteral">"success!\n"</span>); } <span class="keywordflow">return</span> ret; } <span class="keywordtype">int</span> sendtrack_function(<span class="keywordtype">char</span> * from_path, <span class="keywordtype">char</span> * to_path, <span class="keywordtype">char</span> *partist, <span class="keywordtype">char</span> *palbumartist, <span class="keywordtype">char</span> *ptitle, <span class="keywordtype">char</span> *pgenre, <span class="keywordtype">char</span> *palbum, <span class="keywordtype">char</span> *pcomposer, uint16_t tracknum, uint16_t length, uint16_t year, uint32_t storageid, uint16_t quiet) { <span class="keywordtype">char</span> *filename, *parent; <span class="keywordtype">char</span> artist[80], albumartist[80], title[80], genre[80], album[80], composer[80]; <span class="keywordtype">char</span> num[80]; uint64_t filesize; uint32_t parent_id = 0; <span class="keyword">struct </span>stat sb; <a class="code" href="structLIBMTP__track__struct.html">LIBMTP_track_t</a> *trackmeta; <a class="code" href="structLIBMTP__album__struct.html">LIBMTP_album_t</a> *albuminfo; <span class="keywordtype">int</span> ret; printf(<span class="stringliteral">"Sending track %s to %s\n"</span>, from_path, to_path); trackmeta = <a name="a20"></a><a class="code" href="group__tracks.html#gab16e9e4e09fc35622bdf9b74250c1010">LIBMTP_new_track_t</a>(); albuminfo = <a name="a21"></a><a class="code" href="group__albums.html#ga5083754634934f2bfe304e66dd679d31">LIBMTP_new_album_t</a>(); parent = dirname(strdup(to_path)); filename = basename(strdup(to_path)); parent_id = parse_path (parent,files,folders); <span class="keywordflow">if</span> (parent_id == -1) { printf(<span class="stringliteral">"Parent folder could not be found, skipping\n"</span>); <span class="keywordflow">return</span> 1; } <span class="keywordflow">if</span> ( stat(from_path, &sb) == -1 ) { fprintf(stderr, <span class="stringliteral">"%s: "</span>, from_path); perror(<span class="stringliteral">"stat"</span>); <span class="keywordflow">return</span> 1; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (S_ISREG (sb.st_mode)) { filesize = sb.st_size; trackmeta->filetype = find_filetype (from_path); <span class="keywordflow">if</span> (!<a name="a22"></a><a class="code" href="group__types.html#ga09a6cd06f954d3bf468e4d7b1c8a3c26">LIBMTP_FILETYPE_IS_TRACK</a>(trackmeta->filetype)) { printf(<span class="stringliteral">"Not a valid track codec: \"%s\"\n"</span>, <a name="a23"></a><a class="code" href="group__files.html#ga9d920e6a6a80d9497076798c0f54ce34">LIBMTP_Get_Filetype_Description</a>(trackmeta->filetype)); <span class="keywordflow">return</span> 1; } <span class="keywordflow">if</span> ((ptitle == NULL) && (quiet == 0)) { <span class="keywordflow">if</span> ( (ptitle = prompt(<span class="stringliteral">"Title"</span>, title, 80, 0)) != NULL ) <span class="keywordflow">if</span> (!strlen(ptitle)) ptitle = NULL; } <span class="keywordflow">if</span> ((palbum == NULL) && (quiet == 0)) { <span class="keywordflow">if</span> ( (palbum = prompt(<span class="stringliteral">"Album"</span>, album, 80, 0)) != NULL ) <span class="keywordflow">if</span> (!strlen(palbum)) palbum = NULL; } <span class="keywordflow">if</span> ((palbumartist == NULL) && (quiet == 0)) { <span class="keywordflow">if</span> ( (palbumartist = prompt(<span class="stringliteral">"Album artist"</span>, albumartist, 80, 0)) != NULL ) <span class="keywordflow">if</span> (!strlen(palbumartist)) palbumartist = NULL; } <span class="keywordflow">if</span> ((partist == NULL) && (quiet == 0)) { <span class="keywordflow">if</span> ( (partist = prompt(<span class="stringliteral">"Artist"</span>, artist, 80, 0)) != NULL ) <span class="keywordflow">if</span> (!strlen(partist)) partist = NULL; } <span class="keywordflow">if</span> ((pcomposer == NULL) && (quiet == 0)) { <span class="keywordflow">if</span> ( (pcomposer = prompt(<span class="stringliteral">"Writer or Composer"</span>, composer, 80, 0)) != NULL ) <span class="keywordflow">if</span> (!strlen(pcomposer)) pcomposer = NULL; } <span class="keywordflow">if</span> ((pgenre == NULL) && (quiet == 0)) { <span class="keywordflow">if</span> ( (pgenre = prompt(<span class="stringliteral">"Genre"</span>, genre, 80, 0)) != NULL ) <span class="keywordflow">if</span> (!strlen(pgenre)) pgenre = NULL; } <span class="keywordflow">if</span> ((tracknum == 0) && (quiet == 0)) { <span class="keywordtype">char</span> *pnum; <span class="keywordflow">if</span> ( (pnum = prompt(<span class="stringliteral">"Track number"</span>, num, 80, 0)) == NULL ) tracknum = 0; <span class="keywordflow">else</span> tracknum = strtoul(pnum, 0, 10); } <span class="keywordflow">if</span> ((year == 0) && (quiet == 0)) { <span class="keywordtype">char</span> *pnum; <span class="keywordflow">if</span> ( (pnum = prompt(<span class="stringliteral">"Year"</span>, num, 80, 0)) == NULL ) year = 0; <span class="keywordflow">else</span> year = strtoul(pnum, 0, 10); } <span class="keywordflow">if</span> ((length == 0) && (quiet == 0)) { <span class="keywordtype">char</span> *pnum; <span class="keywordflow">if</span> ( (pnum = prompt(<span class="stringliteral">"Length"</span>, num, 80, 0)) == NULL ) length = 0; <span class="keywordflow">else</span> length = strtoul(pnum, 0, 10); } printf(<span class="stringliteral">"Sending track:\n"</span>); printf(<span class="stringliteral">"Codec: %s\n"</span>, <a class="code" href="group__files.html#ga9d920e6a6a80d9497076798c0f54ce34">LIBMTP_Get_Filetype_Description</a>(trackmeta->filetype)); <span class="keywordflow">if</span> (ptitle) { printf(<span class="stringliteral">"Title: %s\n"</span>, ptitle); trackmeta->title = strdup(ptitle); } <span class="keywordflow">if</span> (palbum) { printf(<span class="stringliteral">"Album: %s\n"</span>, palbum); trackmeta->album = strdup(palbum); albuminfo-><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a> = strdup(palbum); } <span class="keywordflow">if</span> (palbumartist) { printf(<span class="stringliteral">"Album artist: %s\n"</span>, palbumartist); albuminfo-><a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a> = strdup(palbumartist); } <span class="keywordflow">if</span> (partist) { printf(<span class="stringliteral">"Artist: %s\n"</span>, partist); trackmeta->artist = strdup(partist); <span class="keywordflow">if</span> (palbumartist == NULL) albuminfo-><a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a> = strdup(partist); } <span class="keywordflow">if</span> (pcomposer) { printf(<span class="stringliteral">"Writer or Composer: %s\n"</span>, pcomposer); trackmeta->composer = strdup(pcomposer); albuminfo-><a class="code" href="structLIBMTP__album__struct.html#adc7e7d63735fd0ae4bc2b021e8d5de97">composer</a> = strdup(pcomposer); } <span class="keywordflow">if</span> (pgenre) { printf(<span class="stringliteral">"Genre: %s\n"</span>, pgenre); trackmeta->genre = strdup(pgenre); albuminfo-><a name="a24"></a><a class="code" href="structLIBMTP__album__struct.html#aeb73b165ca2e8f7b33cbfc6ef55e98e2">genre</a> = strdup(pgenre); } <span class="keywordflow">if</span> (year > 0) { <span class="keywordtype">char</span> tmp[80]; printf(<span class="stringliteral">"Year: %d\n"</span>, year); snprintf(tmp, <span class="keyword">sizeof</span>(tmp)-1, <span class="stringliteral">"%4d0101T0000.0"</span>, year); tmp[<span class="keyword">sizeof</span>(tmp)-1] = <span class="charliteral">'\0'</span>; trackmeta->date = strdup(tmp); } <span class="keywordflow">if</span> (tracknum > 0) { printf(<span class="stringliteral">"Track no: %d\n"</span>, tracknum); trackmeta->tracknumber = tracknum; } <span class="keywordflow">if</span> (length > 0) { printf(<span class="stringliteral">"Length: %d\n"</span>, length); <span class="comment">// Multiply by 1000 since this is in milliseconds</span> trackmeta->duration = length * 1000; } <span class="comment">// We should always have this</span> <span class="keywordflow">if</span> (filename != NULL) { trackmeta->filename = strdup(filename); } trackmeta->filesize = filesize; trackmeta->parent_id = parent_id; { <span class="keywordtype">int</span> rc; <span class="keywordtype">char</span> *desc = NULL; <a name="_a25"></a><a class="code" href="structLIBMTP__devicestorage__struct.html">LIBMTP_devicestorage_t</a> *pds = NULL; <span class="keywordflow">if</span> ( 0 != (rc=<a name="a26"></a><a class="code" href="group__basic.html#ga7a72804e7a444ca4f185f078369c41b1">LIBMTP_Get_Storage</a>(device, LIBMTP_STORAGE_SORTBY_NOTSORTED)) ) { perror(<span class="stringliteral">"LIBMTP_Get_Storage()"</span>); exit(-1); } <span class="keywordflow">for</span> (pds = device-><a name="a27"></a><a class="code" href="structLIBMTP__mtpdevice__struct.html#ae6750437e5c4cd467287ed9bcaa404ab">storage</a>; pds != NULL; pds = pds-><a name="a28"></a><a class="code" href="structLIBMTP__devicestorage__struct.html#ae663c1b5a8f3af8e7ecc11f865a8ed96">next</a>) { <span class="keywordflow">if</span> (pds-><a name="a29"></a><a class="code" href="structLIBMTP__devicestorage__struct.html#aee248c7a17f31d4864a67a5960e008ad">id</a> == storageid) { desc = strdup(pds-><a name="a30"></a><a class="code" href="structLIBMTP__devicestorage__struct.html#a7b72e5c878678138b6301d2fe141e34d">StorageDescription</a>); <span class="keywordflow">break</span>; } } <span class="keywordflow">if</span> (NULL != desc) { printf(<span class="stringliteral">"Storage ID: %s (%u)\n"</span>, desc, storageid); free(desc); } <span class="keywordflow">else</span> printf(<span class="stringliteral">"Storage ID: %u\n"</span>, storageid); trackmeta->storage_id = storageid; } printf(<span class="stringliteral">"Sending track...\n"</span>); ret = <a name="a31"></a><a class="code" href="group__tracks.html#ga5b5757877ee841f75fb94506073aa507">LIBMTP_Send_Track_From_File</a>(device, from_path, trackmeta, progress, NULL); printf(<span class="stringliteral">"\n"</span>); <span class="keywordflow">if</span> (ret != 0) { printf(<span class="stringliteral">"Error sending track.\n"</span>); <a class="code" href="group__basic.html#ga682c81a83fa04b2caf5c962db1eaff82">LIBMTP_Dump_Errorstack</a>(device); <a class="code" href="group__basic.html#ga6c05b927310ac830c149ae3eeae94047">LIBMTP_Clear_Errorstack</a>(device); } <span class="keywordflow">else</span> { printf(<span class="stringliteral">"New track ID: %d\n"</span>, trackmeta->item_id); } <span class="comment">/* Add here add to album call */</span> <span class="keywordflow">if</span> (palbum) ret = add_track_to_album(albuminfo, trackmeta); <a class="code" href="group__albums.html#ga59eeda2ae84ce07f2e69134d322c6c14">LIBMTP_destroy_album_t</a>(albuminfo); <a name="a32"></a><a class="code" href="group__tracks.html#gafeb0d51f0d25ef2389b786f8d319e88f">LIBMTP_destroy_track_t</a>(trackmeta); <span class="keywordflow">return</span> 0; } <span class="keywordflow">return</span> 0; } <span class="keywordtype">void</span> sendtrack_command (<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) { <span class="keywordtype">int</span> opt; <span class="keyword">extern</span> <span class="keywordtype">int</span> optind; <span class="keyword">extern</span> <span class="keywordtype">char</span> *optarg; <span class="keywordtype">char</span> *partist = NULL; <span class="keywordtype">char</span> *palbumartist = NULL; <span class="keywordtype">char</span> *pcomposer = NULL; <span class="keywordtype">char</span> *ptitle = NULL; <span class="keywordtype">char</span> *pgenre = NULL; <span class="keywordtype">char</span> *pcodec = NULL; <span class="keywordtype">char</span> *palbum = NULL; uint16_t tracknum = 0; uint16_t length = 0; uint16_t year = 0; uint16_t quiet = 0; uint32_t storageid = 0; <span class="keywordflow">while</span> ( (opt = getopt(argc, argv, <span class="stringliteral">"qD:t:a:A:w:l:c:g:n:d:y:s:"</span>)) != -1 ) { <span class="keywordflow">switch</span> (opt) { <span class="keywordflow">case</span> <span class="charliteral">'t'</span>: ptitle = strdup(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'a'</span>: partist = strdup(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'A'</span>: palbumartist = strdup(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'w'</span>: pcomposer = strdup(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'l'</span>: palbum = strdup(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'c'</span>: pcodec = strdup(optarg); <span class="comment">// FIXME: DSM check for MP3, WAV or WMA</span> <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'g'</span>: pgenre = strdup(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'n'</span>: tracknum = atoi(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'s'</span>: storageid = (uint32_t) strtoul(optarg, NULL, 0); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'d'</span>: length = atoi(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'y'</span>: year = atoi(optarg); <span class="keywordflow">break</span>; <span class="keywordflow">case</span> <span class="charliteral">'q'</span>: quiet = 1; <span class="keywordflow">break</span>; <span class="keywordflow">default</span>: sendtrack_usage(); } } argc -= optind; argv += optind; <span class="keywordflow">if</span> ( argc != 2 ) { printf(<span class="stringliteral">"You need to pass a filename and destination.\n"</span>); sendtrack_usage(); <span class="keywordflow">return</span>; } checklang(); printf(<span class="stringliteral">"%s,%s,%s,%s,%s,%s,%s,%s,%d%d,%d,%u,%d\n"</span>,argv[0],argv[1],partist,palbumartist,ptitle,pgenre,palbum,pcomposer,tracknum, length, year, storageid, quiet); sendtrack_function(argv[0],argv[1],partist,palbumartist,ptitle,pgenre,palbum,pcomposer, tracknum, length, year, storageid, quiet); } </pre></div> </div> <hr size="1"/><address style="text-align: right;"><small>Generated by <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address> </body> </html>