Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > by-pkgid > 23fdeec2afeeb035357795bcffb419c6 > files > 70

libmtp-doc-1.0.2-1mdv2010.1.x86_64.rpm

<!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&nbsp;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;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 &quot;config.h&quot;</span>
<span class="preprocessor">#include &quot;common.h&quot;</span>
<span class="preprocessor">#include &quot;util.h&quot;</span>
<span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<span class="preprocessor">#include &lt;limits.h&gt;</span>
<span class="preprocessor">#include &lt;string.h&gt;</span>
<span class="preprocessor">#include &lt;libgen.h&gt;</span>
<span class="preprocessor">#include &lt;sys/stat.h&gt;</span>
<span class="preprocessor">#include &lt;sys/types.h&gt;</span>
<span class="preprocessor">#include &lt;fcntl.h&gt;</span>
<span class="preprocessor">#ifdef HAVE_LANGINFO_H</span>
<span class="preprocessor"></span><span class="preprocessor">#include &lt;langinfo.h&gt;</span>
<span class="preprocessor">#endif</span>
<span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="libmtp_8h.html">libmtp.h</a>&quot;</span>
<span class="preprocessor">#include &quot;pathutils.h&quot;</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">&quot;usage: sendtr [ -D debuglvl ] [ -q ]\n&quot;</span>);
  fprintf(stderr, <span class="stringliteral">&quot;-t &lt;title&gt; -a &lt;artist&gt; -A &lt;Album artist&gt; -w &lt;writer or composer&gt;\n&quot;</span>);
  fprintf(stderr, <span class="stringliteral">&quot;    -l &lt;album&gt; -c &lt;codec&gt; -g &lt;genre&gt; -n &lt;track number&gt; -y &lt;year&gt;\n&quot;</span>);
  fprintf(stderr, <span class="stringliteral">&quot;       -d &lt;duration in seconds&gt; -s &lt;storage_id&gt; &lt;local path&gt; &lt;remote path&gt;\n&quot;</span>);
  fprintf(stderr, <span class="stringliteral">&quot;(-q means the program will not ask for missing information.)\n&quot;</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">&quot;%s&gt; &quot;</span>, prompt);
    <span class="keywordflow">if</span> ( fgets(buffer, bufsz, stdin) == NULL ) {
      <span class="keywordflow">if</span> (ferror(stdin)) {
        perror(<span class="stringliteral">&quot;fgets&quot;</span>);
      } <span class="keywordflow">else</span> {
        fprintf(stderr, <span class="stringliteral">&quot;EOF on stdin\n&quot;</span>);
      }
      <span class="keywordflow">return</span> NULL;
    }
    
    cp = strrchr(buffer, <span class="charliteral">&#39;\n&#39;</span>);
    <span class="keywordflow">if</span> ( cp != NULL ) *cp = <span class="charliteral">&#39;\0&#39;</span>;
    
    bp = buffer;
    <span class="keywordflow">while</span> ( bp != cp ) {
      <span class="keywordflow">if</span> ( *bp != <span class="charliteral">&#39; &#39;</span> &amp;&amp; *bp != <span class="charliteral">&#39;\t&#39;</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-&gt;<a name="a6"></a><a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a> != NULL &amp;&amp;
        album-&gt;<a name="a7"></a><a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a> != NULL &amp;&amp;
        !strcmp(album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>, albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>) &amp;&amp;
        !strcmp(album-&gt;<a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a>, albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a>)) ||
          (album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a> != NULL &amp;&amp;
        album-&gt;<a name="a8"></a><a class="code" href="structLIBMTP__album__struct.html#adc7e7d63735fd0ae4bc2b021e8d5de97">composer</a> != NULL &amp;&amp;
        !strcmp(album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>, albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>) &amp;&amp;
        !strcmp(album-&gt;<a class="code" href="structLIBMTP__album__struct.html#adc7e7d63735fd0ae4bc2b021e8d5de97">composer</a>, albuminfo-&gt;<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-&gt;<a name="a9"></a><a class="code" href="structLIBMTP__album__struct.html#a110324cda7d476290b7de3aead13a583">next</a>;
      found_album-&gt;<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-&gt;<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-&gt;<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">&quot;Album \&quot;%s\&quot; found: updating...\n&quot;</span>, found_album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a>);
    <span class="keywordflow">if</span> (!tracks) {
      printf(<span class="stringliteral">&quot;failed malloc in add_track_to_album()\n&quot;</span>);
      <span class="keywordflow">return</span> 1;
    }
    found_album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a>++;
    <span class="keywordflow">if</span> (found_album-&gt;<a name="a12"></a><a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a> != NULL) {
      memcpy(tracks, found_album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a>, found_album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a> * <span class="keyword">sizeof</span>(uint32_t));
      free(found_album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a>);
    }
    tracks[found_album-&gt;<a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a>-1] = trackmeta-&gt;<a name="a13"></a><a class="code" href="structLIBMTP__track__struct.html#a794e60bb22d9dd93b2f4cd7bb935f10b">item_id</a>;
    found_album-&gt;<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-&gt;<a class="code" href="structLIBMTP__track__struct.html#a794e60bb22d9dd93b2f4cd7bb935f10b">item_id</a>;
    albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#a36da4ae219a7792e838642a29735bf64">tracks</a> = trackid;
    albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#a6b02faa0b3740e67b1bc97dbbe12029b">no_tracks</a> = 1;
    albuminfo-&gt;<a name="a15"></a><a class="code" href="structLIBMTP__album__struct.html#a583729ede11c6fcf9c1968b0d594c423">storage_id</a> = trackmeta-&gt;<a name="a16"></a><a class="code" href="structLIBMTP__track__struct.html#a17f3721dfe5fe4b17d6cd8071f96fbda">storage_id</a>;
    printf(<span class="stringliteral">&quot;Album doesn&#39;t exist: creating...\n&quot;</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">&quot;Error creating or updating album.\n&quot;</span>);
    printf(<span class="stringliteral">&quot;(This could be due to that your device does not support albums.)\n&quot;</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">&quot;success!\n&quot;</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">&quot;Sending track %s to %s\n&quot;</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">&quot;Parent folder could not be found, skipping\n&quot;</span>);
    <span class="keywordflow">return</span> 1;
  }

  <span class="keywordflow">if</span> ( stat(from_path, &amp;sb) == -1 ) {
    fprintf(stderr, <span class="stringliteral">&quot;%s: &quot;</span>, from_path);
    perror(<span class="stringliteral">&quot;stat&quot;</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-&gt;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-&gt;filetype)) {
      printf(<span class="stringliteral">&quot;Not a valid track codec: \&quot;%s\&quot;\n&quot;</span>, <a name="a23"></a><a class="code" href="group__files.html#ga9d920e6a6a80d9497076798c0f54ce34">LIBMTP_Get_Filetype_Description</a>(trackmeta-&gt;filetype));
      <span class="keywordflow">return</span> 1;
    }
    
    <span class="keywordflow">if</span> ((ptitle == NULL) &amp;&amp; (quiet == 0)) {
       <span class="keywordflow">if</span> ( (ptitle = prompt(<span class="stringliteral">&quot;Title&quot;</span>, title, 80, 0)) != NULL ) 
         <span class="keywordflow">if</span> (!strlen(ptitle)) ptitle = NULL;
    }

    <span class="keywordflow">if</span> ((palbum == NULL) &amp;&amp; (quiet == 0)) {
      <span class="keywordflow">if</span> ( (palbum = prompt(<span class="stringliteral">&quot;Album&quot;</span>, album, 80, 0)) != NULL )
        <span class="keywordflow">if</span> (!strlen(palbum)) palbum = NULL;
    }

    <span class="keywordflow">if</span> ((palbumartist == NULL) &amp;&amp; (quiet == 0)) {
      <span class="keywordflow">if</span> ( (palbumartist = prompt(<span class="stringliteral">&quot;Album artist&quot;</span>, albumartist, 80, 0)) != NULL )
          <span class="keywordflow">if</span> (!strlen(palbumartist)) palbumartist = NULL;
    }

    <span class="keywordflow">if</span> ((partist == NULL) &amp;&amp; (quiet == 0)) {
        <span class="keywordflow">if</span> ( (partist = prompt(<span class="stringliteral">&quot;Artist&quot;</span>, artist, 80, 0)) != NULL )
          <span class="keywordflow">if</span> (!strlen(partist)) partist = NULL;
    }

    <span class="keywordflow">if</span> ((pcomposer == NULL) &amp;&amp; (quiet == 0)) {
      <span class="keywordflow">if</span> ( (pcomposer = prompt(<span class="stringliteral">&quot;Writer or Composer&quot;</span>, composer, 80, 0)) != NULL )
        <span class="keywordflow">if</span> (!strlen(pcomposer)) pcomposer = NULL;
    }

    <span class="keywordflow">if</span> ((pgenre == NULL) &amp;&amp; (quiet == 0)) {
      <span class="keywordflow">if</span> ( (pgenre = prompt(<span class="stringliteral">&quot;Genre&quot;</span>, genre, 80, 0)) != NULL )
        <span class="keywordflow">if</span> (!strlen(pgenre)) pgenre = NULL;
    }

    <span class="keywordflow">if</span> ((tracknum == 0) &amp;&amp; (quiet == 0)) {
      <span class="keywordtype">char</span> *pnum;
      <span class="keywordflow">if</span> ( (pnum = prompt(<span class="stringliteral">&quot;Track number&quot;</span>, num, 80, 0)) == NULL )
        tracknum = 0;
      <span class="keywordflow">else</span>
        tracknum = strtoul(pnum, 0, 10);
    }

    <span class="keywordflow">if</span> ((year == 0) &amp;&amp; (quiet == 0)) {
      <span class="keywordtype">char</span> *pnum;
      <span class="keywordflow">if</span> ( (pnum = prompt(<span class="stringliteral">&quot;Year&quot;</span>, num, 80, 0)) == NULL )
        year = 0;
      <span class="keywordflow">else</span>
        year = strtoul(pnum, 0, 10);
    }

    <span class="keywordflow">if</span> ((length == 0) &amp;&amp; (quiet == 0)) {
      <span class="keywordtype">char</span> *pnum;
      <span class="keywordflow">if</span> ( (pnum = prompt(<span class="stringliteral">&quot;Length&quot;</span>, num, 80, 0)) == NULL )
        length = 0;
      <span class="keywordflow">else</span>
        length = strtoul(pnum, 0, 10);
    }
    
    printf(<span class="stringliteral">&quot;Sending track:\n&quot;</span>);
    printf(<span class="stringliteral">&quot;Codec:     %s\n&quot;</span>, <a class="code" href="group__files.html#ga9d920e6a6a80d9497076798c0f54ce34">LIBMTP_Get_Filetype_Description</a>(trackmeta-&gt;filetype));
    <span class="keywordflow">if</span> (ptitle) {
      printf(<span class="stringliteral">&quot;Title:     %s\n&quot;</span>, ptitle);
      trackmeta-&gt;title = strdup(ptitle);
    }
    <span class="keywordflow">if</span> (palbum) {
      printf(<span class="stringliteral">&quot;Album:     %s\n&quot;</span>, palbum);
      trackmeta-&gt;album = strdup(palbum);
      albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#a7b3a34bd30d6f25d5c740e8b85d7bba5">name</a> = strdup(palbum);
    }
    <span class="keywordflow">if</span> (palbumartist) {
      printf(<span class="stringliteral">&quot;Album artist:    %s\n&quot;</span>, palbumartist);
      albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a> = strdup(palbumartist);
    }
    <span class="keywordflow">if</span> (partist) {
      printf(<span class="stringliteral">&quot;Artist:    %s\n&quot;</span>, partist);
      trackmeta-&gt;artist = strdup(partist);
      <span class="keywordflow">if</span> (palbumartist == NULL)
      albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#ac310c8376aba3677471f9e3a46ce7152">artist</a> = strdup(partist);
    }

    <span class="keywordflow">if</span> (pcomposer) {
      printf(<span class="stringliteral">&quot;Writer or Composer:    %s\n&quot;</span>, pcomposer);
      trackmeta-&gt;composer = strdup(pcomposer);
      albuminfo-&gt;<a class="code" href="structLIBMTP__album__struct.html#adc7e7d63735fd0ae4bc2b021e8d5de97">composer</a> = strdup(pcomposer);
    }
    <span class="keywordflow">if</span> (pgenre) {
      printf(<span class="stringliteral">&quot;Genre:     %s\n&quot;</span>, pgenre);
      trackmeta-&gt;genre = strdup(pgenre);
      albuminfo-&gt;<a name="a24"></a><a class="code" href="structLIBMTP__album__struct.html#aeb73b165ca2e8f7b33cbfc6ef55e98e2">genre</a> = strdup(pgenre);
    }
    <span class="keywordflow">if</span> (year &gt; 0) {
      <span class="keywordtype">char</span> tmp[80];
      printf(<span class="stringliteral">&quot;Year:      %d\n&quot;</span>, year);
      snprintf(tmp, <span class="keyword">sizeof</span>(tmp)-1, <span class="stringliteral">&quot;%4d0101T0000.0&quot;</span>, year);
      tmp[<span class="keyword">sizeof</span>(tmp)-1] = <span class="charliteral">&#39;\0&#39;</span>;
      trackmeta-&gt;date = strdup(tmp);
    }
    <span class="keywordflow">if</span> (tracknum &gt; 0) {
      printf(<span class="stringliteral">&quot;Track no:  %d\n&quot;</span>, tracknum);
      trackmeta-&gt;tracknumber = tracknum;
    }
    <span class="keywordflow">if</span> (length &gt; 0) {
      printf(<span class="stringliteral">&quot;Length:    %d\n&quot;</span>, length);
      <span class="comment">// Multiply by 1000 since this is in milliseconds</span>
      trackmeta-&gt;duration = length * 1000;
    }
    <span class="comment">// We should always have this</span>
    <span class="keywordflow">if</span> (filename != NULL) {
      trackmeta-&gt;filename = strdup(filename);
    }
    trackmeta-&gt;filesize = filesize;
    trackmeta-&gt;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">&quot;LIBMTP_Get_Storage()&quot;</span>);
            exit(-1);
        }
        <span class="keywordflow">for</span> (pds = device-&gt;<a name="a27"></a><a class="code" href="structLIBMTP__mtpdevice__struct.html#ae6750437e5c4cd467287ed9bcaa404ab">storage</a>; pds != NULL; pds = pds-&gt;<a name="a28"></a><a class="code" href="structLIBMTP__devicestorage__struct.html#ae663c1b5a8f3af8e7ecc11f865a8ed96">next</a>)
        {
            <span class="keywordflow">if</span> (pds-&gt;<a name="a29"></a><a class="code" href="structLIBMTP__devicestorage__struct.html#aee248c7a17f31d4864a67a5960e008ad">id</a> == storageid)
            {
                desc = strdup(pds-&gt;<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">&quot;Storage ID: %s (%u)\n&quot;</span>, desc, storageid);
            free(desc);
        }
        <span class="keywordflow">else</span>
            printf(<span class="stringliteral">&quot;Storage ID: %u\n&quot;</span>, storageid);
        trackmeta-&gt;storage_id = storageid;
    }
      
    printf(<span class="stringliteral">&quot;Sending track...\n&quot;</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">&quot;\n&quot;</span>);
    <span class="keywordflow">if</span> (ret != 0) {
      printf(<span class="stringliteral">&quot;Error sending track.\n&quot;</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">&quot;New track ID: %d\n&quot;</span>, trackmeta-&gt;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">&quot;qD:t:a:A:w:l:c:g:n:d:y:s:&quot;</span>)) != -1 ) {
    <span class="keywordflow">switch</span> (opt) {
    <span class="keywordflow">case</span> <span class="charliteral">&#39;t&#39;</span>:
      ptitle = strdup(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;a&#39;</span>:
      partist = strdup(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;A&#39;</span>:
      palbumartist = strdup(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;w&#39;</span>:
      pcomposer = strdup(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;l&#39;</span>:
      palbum = strdup(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;c&#39;</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">&#39;g&#39;</span>:
      pgenre = strdup(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;n&#39;</span>:
      tracknum = atoi(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;s&#39;</span>:
      storageid = (uint32_t) strtoul(optarg, NULL, 0);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;d&#39;</span>:
      length = atoi(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;y&#39;</span>:
      year = atoi(optarg);
      <span class="keywordflow">break</span>;
    <span class="keywordflow">case</span> <span class="charliteral">&#39;q&#39;</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">&quot;You need to pass a filename and destination.\n&quot;</span>);
    sendtrack_usage();
    <span class="keywordflow">return</span>;
  }

  checklang();
  
  printf(<span class="stringliteral">&quot;%s,%s,%s,%s,%s,%s,%s,%s,%d%d,%d,%u,%d\n&quot;</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&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
</body>
</html>