info.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:7k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * info.c : Playlist info management
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2004 VideoLAN
  5.  * $Id: info.c 7997 2004-06-18 11:35:45Z sigmunau $
  6.  *
  7.  * Authors: Cl閙ent Stenac <zorglub@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include <stdlib.h>                                      /* free(), strtol() */
  24. #include <stdio.h>                                              /* sprintf() */
  25. #include <string.h>                                            /* strerror() */
  26. #include <vlc/vlc.h>
  27. #include <vlc/input.h>
  28. #include "vlc_playlist.h"
  29. /**
  30.  * Get one special info
  31.  * Must be entered with playlist lock
  32.  *
  33.  * param p_playlist the playlist to get the info from
  34.  * param i_pos position of the item on
  35.  *              which we want the info ( -1 for current )
  36.  * param psz_cat the category in which the info is stored
  37.  * param psz_name the name of the info
  38.  * return the info value if any, an empty string else
  39.  */
  40. char * playlist_GetInfo( playlist_t *p_playlist, int i_pos,
  41.                          const char *psz_cat, const char *psz_name )
  42. {
  43.     playlist_item_t *p_item;
  44.     char *psz_buffer;
  45.     /* Sanity check */
  46.     if( p_playlist == NULL) return strdup("");
  47.     p_item = playlist_ItemGetByPos( p_playlist, i_pos );
  48.     if( !p_item ) return strdup("");
  49.     vlc_mutex_lock( &p_item->input.lock );
  50.     psz_buffer = playlist_ItemGetInfo( p_item , psz_cat, psz_name );
  51.     vlc_mutex_unlock( &p_item->input.lock );
  52.     return psz_buffer;
  53. }
  54. /**
  55.  *  Get one special info, from an item (no need for p_playlist)
  56.  *
  57.  * param p_item the item on which we want the info
  58.  * param psz_cat the category in which the info is stored
  59.  * param psz_name the name of the info
  60.  * return the info value if any, an empty string else
  61. */
  62. char * playlist_ItemGetInfo( playlist_item_t *p_item,
  63.                              const char * psz_cat, const char *psz_name )
  64. {
  65.      int i, j;
  66.      for( i = 0 ; i< p_item->input.i_categories ; i++ )
  67.      {
  68.          info_category_t *p_category = p_item->input.pp_categories[i];
  69.          if( strcmp( p_category->psz_name , psz_cat ) ) continue;
  70.          for( j = 0 ; j< p_category->i_infos ; j++ )
  71.          {
  72.              if( !strcmp( p_category->pp_infos[j]->psz_name, psz_name) )
  73.              {
  74.                  return strdup( p_category->pp_infos[j]->psz_value );
  75.              }
  76.          }
  77.      }
  78.      return strdup("");
  79. }
  80. /**
  81.  * Get one info category (no p_playlist). Create it if it does not exist
  82.  *
  83.  * param p_item the playlist item to get the category from
  84.  * param psz_cat the category we want
  85.  * return the info category.
  86.  */
  87. info_category_t * playlist_ItemGetCategory( playlist_item_t *p_item,
  88.                                             const char *psz_cat )
  89. {
  90.     int i;
  91.     /* Search the category */
  92.     for( i = 0 ; i< p_item->input.i_categories ; i++ )
  93.     {
  94.         if( !strncmp( p_item->input.pp_categories[i]->psz_name, psz_cat,
  95.                       strlen(psz_cat) ) )
  96.         {
  97.             return p_item->input.pp_categories[i];
  98.         }
  99.     }
  100.     /* We did not find the category, create it */
  101.     return playlist_ItemCreateCategory( p_item, psz_cat );
  102. }
  103. /**
  104.  * Create one info category for an item ( no p_playlist required )
  105.  *
  106.  * param p_item the item to create category for
  107.  * param psz_cat the category we want to create
  108.  * return the info category.
  109.  */
  110. info_category_t * playlist_ItemCreateCategory( playlist_item_t *p_item,
  111.        const char *psz_cat )
  112. {
  113.     info_category_t *p_cat;
  114.     int i;
  115.     for( i = 0 ; i< p_item->input.i_categories ; i++)
  116.     {
  117.         if( !strcmp( p_item->input.pp_categories[i]->psz_name,psz_cat ) )
  118.         {
  119.             return p_item->input.pp_categories[i];
  120.         }
  121.     }
  122.     if( ( p_cat = malloc( sizeof( info_category_t) ) ) == NULL )
  123.     {
  124.         return NULL;
  125.     }
  126.     p_cat->psz_name = strdup( psz_cat);
  127.     p_cat->i_infos = 0;
  128.     p_cat->pp_infos = NULL;
  129.     INSERT_ELEM( p_item->input.pp_categories, p_item->input.i_categories,
  130.                  p_item->input.i_categories, p_cat );
  131.     return p_cat;
  132. }
  133. /**
  134.  * Add an info item
  135.  *
  136.  * param p_playlist the playlist
  137.  * param i_item the position of the item on which we want
  138.  *               the info ( -1 for current )
  139.  * param psz_cat the category we want to put the info into
  140.  *                (gets created if needed)
  141.  * param psz_name the name of the info
  142.  * param psz_format printf-style info
  143.  * return VLC_SUCCESS
  144.  */
  145. int playlist_AddInfo( playlist_t *p_playlist, int i_item,
  146.                       const char * psz_cat, const char *psz_name,
  147.                       const char * psz_format, ...)
  148. {
  149.     va_list args;
  150.     int i_ret;
  151.     playlist_item_t *p_item;
  152.     char *psz_value;
  153.     /* Sanity check */
  154.     if( p_playlist == NULL) return VLC_EGENERIC;
  155.     p_item = playlist_ItemGetByPos( p_playlist, i_item );
  156.     if( !p_item ) return VLC_ENOOBJ;
  157.     va_start( args, psz_format );
  158.     vasprintf( &psz_value, psz_format, args );
  159.     va_end( args );
  160.     vlc_mutex_lock( &p_item->input.lock );
  161.     i_ret = playlist_ItemAddInfo( p_item, psz_cat, psz_name, psz_value );
  162.     vlc_mutex_unlock( &p_item->input.lock );
  163.     free( psz_value );
  164.     return i_ret;
  165. }
  166. /**
  167.  *  Add info to one item ( no need for p_playlist )
  168.  *
  169.  * param p_item the item for which we add the info
  170.  * param psz_cat the category in which the info is stored
  171.  * param psz_name the name of the info
  172.  * param psz_format printf-style info
  173.  * return VLC_SUCCESS on success
  174. */
  175. int playlist_ItemAddInfo( playlist_item_t *p_item,
  176.                           const char *psz_cat, const char *psz_name,
  177.                           const char *psz_format, ... )
  178. {
  179.     va_list args;
  180.     int i;
  181.     int i_new = VLC_TRUE;
  182.     info_t *p_info = NULL;
  183.     info_category_t *p_cat;
  184.     /* Find or create the category */
  185.     p_cat = playlist_ItemGetCategory( p_item, psz_cat );
  186.     if( p_cat == NULL) return VLC_EGENERIC;
  187.     for( i = 0 ; i< p_cat->i_infos ; i++)
  188.     {
  189.         if( !strcmp( p_cat->pp_infos[i]->psz_name, psz_name ) )
  190.         {
  191.             /* This info is not new */
  192.             p_info = p_cat->pp_infos[i];
  193.             i_new = VLC_FALSE;
  194.             break;
  195.         }
  196.     }
  197.     /* New info, create it */
  198.     if( p_info == NULL )
  199.     {
  200.         if( ( p_info = malloc( sizeof( info_t) ) ) == NULL )
  201.         {
  202.             return VLC_EGENERIC;
  203.         }
  204.         p_info->psz_name = strdup( psz_name);
  205.     }
  206.     else
  207.     {
  208.         if( p_info->psz_value != NULL ) free( p_info->psz_value ) ;
  209.     }
  210.     va_start( args, psz_format );
  211.     vasprintf( &p_info->psz_value, psz_format, args );
  212.     va_end( args );
  213.     /* If this is new, insert it */
  214.     if( i_new == VLC_TRUE )
  215.     {
  216.         INSERT_ELEM( p_cat->pp_infos, p_cat->i_infos, p_cat->i_infos, p_info );
  217.     }
  218.     return VLC_SUCCESS;
  219. }