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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * playlist.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: playlist.cpp 8659 2004-09-07 21:16:49Z gbazin $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  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 <vlc/vlc.h>
  24. #include "playlist.hpp"
  25. #include "../utils/ustring.hpp"
  26. #include "charset.h"
  27. Playlist::Playlist( intf_thread_t *pIntf ): VarList( pIntf )
  28. {
  29.     // Get the playlist VLC object
  30.     m_pPlaylist = pIntf->p_sys->p_playlist;
  31.     // Try to guess the current charset
  32.     char *pCharset = (char*)malloc( 100 );
  33.     vlc_current_charset( &pCharset );
  34.     iconvHandle = vlc_iconv_open( "UTF-8", pCharset );
  35.     msg_Dbg( pIntf, "Using character encoding: %s", pCharset );
  36.     free( pCharset );
  37.     if( iconvHandle == (vlc_iconv_t)-1 )
  38.     {
  39.         msg_Warn( pIntf, "Unable to do requested conversion" );
  40.     }
  41.     buildList();
  42. }
  43. Playlist::~Playlist()
  44. {
  45.     if( iconvHandle != (vlc_iconv_t)-1 ) vlc_iconv_close( iconvHandle );
  46. }
  47. void Playlist::delSelected()
  48. {
  49.     // Remove the items from the VLC playlist
  50.     int index = 0;
  51.     ConstIterator it;
  52.     for( it = begin(); it != end(); it++ )
  53.     {
  54.         if( (*it).m_selected )
  55.         {
  56.             playlist_Delete( m_pPlaylist, index );
  57.         }
  58.         else
  59.         {
  60.             index++;
  61.         }
  62.     }
  63.     notify();
  64. }
  65. void Playlist::action( Elem_t *pItem )
  66. {
  67.     // Find the index of the item
  68.     int index = 0;
  69.     ConstIterator it;
  70.     for( it = begin(); it != end(); it++ )
  71.     {
  72.         if( &*it == pItem ) break;
  73.         index++;
  74.     }
  75.     // Item found ?
  76.     if( index < size() )
  77.     {
  78.         playlist_Goto( m_pPlaylist, index );
  79.     }
  80. }
  81. void Playlist::onChange()
  82. {
  83.     buildList();
  84.     notify();
  85. }
  86. void Playlist::buildList()
  87. {
  88.     clear();
  89.     vlc_mutex_lock( &m_pPlaylist->object_lock );
  90.     for( int i = 0; i < m_pPlaylist->i_size; i++ )
  91.     {
  92.         // Get the name of the playlist item
  93.         UString *pName = convertName( m_pPlaylist->pp_items[i]->input.psz_name );
  94.         // Is it the played stream ?
  95.         bool playing = (i == m_pPlaylist->i_index );
  96.         // Add the item in the list
  97.         m_list.push_back( Elem_t( UStringPtr( pName ), false, playing ) );
  98.     }
  99.     vlc_mutex_unlock( &m_pPlaylist->object_lock );
  100. }
  101. UString *Playlist::convertName( const char *pName )
  102. {
  103.     if( iconvHandle == (vlc_iconv_t)-1 )
  104.     {
  105.         return new UString( getIntf(), pName );
  106.     }
  107.     char *pNewName, *pBufferOut;
  108.     const char *pBufferIn;
  109.     size_t ret, inbytesLeft, outbytesLeft;
  110.     // Try to convert the playlist item into UTF8
  111.     pNewName = (char*)malloc( 6 * strlen( pName ) );
  112.     pBufferOut = pNewName;
  113.     pBufferIn = pName;
  114.     inbytesLeft = strlen( pName );
  115.     outbytesLeft = 6 * inbytesLeft;
  116.     // ICONV_CONST is defined in config.h
  117.     ret = vlc_iconv( iconvHandle, (char **)&pBufferIn, &inbytesLeft,
  118.                      &pBufferOut, &outbytesLeft );
  119.     *pBufferOut = '';
  120.     if( inbytesLeft )
  121.     {
  122.         msg_Warn( getIntf(), "Failed to convert the playlist item into UTF8" );
  123.         free( pNewName );
  124.         return new UString( getIntf(), pName );
  125.     }
  126.     else
  127.     {
  128.         UString *pString = new UString( getIntf(), pNewName );
  129.         free( pNewName );
  130.         return pString;
  131.     }
  132. }