var_text.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * var_text.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: e692433d5e3d5ee1c6edab725520e00c666538ca $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teulière <ipkiss@via.ecp.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #include "var_text.hpp"
  25. #include "../src/vlcproc.hpp"
  26. #include "../src/var_manager.hpp"
  27. #include "../vars/time.hpp"
  28. #include "../vars/volume.hpp"
  29. const string VarText::m_type = "text";
  30. VarText::VarText( intf_thread_t *pIntf, bool substVars ): Variable( pIntf ),
  31.     m_text( pIntf, "" ), m_lastText( pIntf, "" ), m_substVars( substVars )
  32. {
  33. }
  34. VarText::~VarText()
  35. {
  36.     if( m_substVars )
  37.     {
  38.         // Remove the observers
  39.         delObservers();
  40.     }
  41. }
  42. const UString VarText::get() const
  43. {
  44.     if( !m_substVars )
  45.     {
  46.         // Do not substitute "$X" variables
  47.         return m_text;
  48.     }
  49.     uint32_t pos;
  50.     VlcProc *pVlcProc = VlcProc::instance( getIntf() );
  51.     // Fill a temporary UString object, and replace the escape characters
  52.     // ($H for help, $T for current time, $L for time left, $D for duration,
  53.     // $V for volume)
  54.     UString temp( m_text );
  55.     // $H is processed first, in case the help string contains other variables
  56.     // to replace. And it is replaced only once, in case one of these other
  57.     // variables is $H...
  58.     if( (pos = temp.find( "$H" )) != UString::npos )
  59.     {
  60.         VarManager *pVarManager = VarManager::instance( getIntf() );
  61.         temp.replace( pos, 2, pVarManager->getHelpText().get() );
  62.     }
  63.     while( (pos = temp.find( "$T" )) != UString::npos )
  64.     {
  65.         temp.replace( pos, 2,
  66.                       pVlcProc->getTimeVar().getAsStringCurrTime().c_str() );
  67.     }
  68.     while( (pos = temp.find( "$t" )) != UString::npos )
  69.     {
  70.         temp.replace( pos, 2,
  71.                       pVlcProc->getTimeVar().getAsStringCurrTime(true).c_str() );
  72.     }
  73.     while( (pos = temp.find( "$L" )) != UString::npos )
  74.     {
  75.         temp.replace( pos, 2,
  76.                       pVlcProc->getTimeVar().getAsStringTimeLeft().c_str() );
  77.     }
  78.     while( (pos = temp.find( "$l" )) != UString::npos )
  79.     {
  80.         temp.replace( pos, 2,
  81.                       pVlcProc->getTimeVar().getAsStringTimeLeft(true).c_str() );
  82.     }
  83.     while( (pos = temp.find( "$D" )) != UString::npos )
  84.     {
  85.         temp.replace( pos, 2,
  86.                       pVlcProc->getTimeVar().getAsStringDuration().c_str() );
  87.     }
  88.     while( (pos = temp.find( "$d" )) != UString::npos )
  89.     {
  90.         temp.replace( pos, 2,
  91.                       pVlcProc->getTimeVar().getAsStringDuration(true).c_str() );
  92.     }
  93.     while( (pos = temp.find( "$V" )) != UString::npos )
  94.     {
  95.         temp.replace( pos, 2,
  96.                       pVlcProc->getVolumeVar().getAsStringPercent().c_str() );
  97.     }
  98.     while( (pos = temp.find( "$N" )) != UString::npos )
  99.     {
  100.         temp.replace( pos, 2, pVlcProc->getStreamNameVar().get() );
  101.     }
  102.     while( (pos = temp.find( "$F" )) != UString::npos )
  103.     {
  104.         temp.replace( pos, 2, pVlcProc->getStreamURIVar().get() );
  105.     }
  106.     while( (pos = temp.find( "$B" )) != UString::npos )
  107.     {
  108.         temp.replace( pos, 2, pVlcProc->getStreamBitRateVar().get() );
  109.     }
  110.     while( (pos = temp.find( "$S" )) != UString::npos )
  111.     {
  112.         temp.replace( pos, 2, pVlcProc->getStreamSampleRateVar().get() );
  113.     }
  114.     return temp;
  115. }
  116. void VarText::set( const UString &rText )
  117. {
  118.     // Avoid an infinite loop
  119.     if( rText == m_text )
  120.     {
  121.         return;
  122.     }
  123.     m_text = rText;
  124.     if( m_substVars )
  125.     {
  126.         // Stop observing other variables
  127.         delObservers();
  128.         VlcProc *pVlcProc = VlcProc::instance( getIntf() );
  129.         VarManager *pVarManager = VarManager::instance( getIntf() );
  130.         // Observe needed variables
  131.         if( m_text.find( "$H" ) != UString::npos )
  132.         {
  133.             pVarManager->getHelpText().addObserver( this );
  134.         }
  135.         if( m_text.find( "$T" ) != UString::npos ||
  136.             m_text.find( "$t" ) != UString::npos )
  137.         {
  138.             pVlcProc->getTimeVar().addObserver( this );
  139.         }
  140.         if( m_text.find( "$L" ) != UString::npos ||
  141.             m_text.find( "$l" ) != UString::npos )
  142.         {
  143.             pVlcProc->getTimeVar().addObserver( this );
  144.         }
  145.         if( m_text.find( "$D" ) != UString::npos ||
  146.             m_text.find( "$d" ) != UString::npos )
  147.         {
  148.             pVlcProc->getTimeVar().addObserver( this );
  149.         }
  150.         if( m_text.find( "$V" ) != UString::npos )
  151.         {
  152.             pVlcProc->getVolumeVar().addObserver( this );
  153.         }
  154.         if( m_text.find( "$N" ) != UString::npos )
  155.         {
  156.             pVlcProc->getStreamNameVar().addObserver( this );
  157.         }
  158.         if( m_text.find( "$F" ) != UString::npos )
  159.         {
  160.             pVlcProc->getStreamURIVar().addObserver( this );
  161.         }
  162.         if( m_text.find( "$B" ) != UString::npos )
  163.         {
  164.             pVlcProc->getStreamBitRateVar().addObserver( this );
  165.         }
  166.         if( m_text.find( "$S" ) != UString::npos )
  167.         {
  168.             pVlcProc->getStreamSampleRateVar().addObserver( this );
  169.         }
  170.     }
  171.     notify();
  172. }
  173. void VarText::onUpdate( Subject<VarPercent> &rVariable, void *arg )
  174. {
  175.     UString newText = get();
  176.     // If the text has changed, notify the observers
  177.     if( newText != m_lastText )
  178.     {
  179.         m_lastText = newText;
  180.         notify();
  181.     }
  182. }
  183. void VarText::onUpdate( Subject<VarText> &rVariable, void *arg )
  184. {
  185.     UString newText = get();
  186.     // If the text has changed, notify the observers
  187.     if( newText != m_lastText )
  188.     {
  189.         m_lastText = newText;
  190.         notify();
  191.     }
  192. }
  193. void VarText::delObservers()
  194. {
  195.     // Stop observing other variables
  196.     VlcProc *pVlcProc = VlcProc::instance( getIntf() );
  197.     pVlcProc->getTimeVar().delObserver( this );
  198.     pVlcProc->getVolumeVar().delObserver( this );
  199.     pVlcProc->getStreamNameVar().delObserver( this );
  200.     pVlcProc->getStreamURIVar().delObserver( this );
  201.     pVlcProc->getStreamBitRateVar().delObserver( this );
  202.     pVlcProc->getStreamSampleRateVar().delObserver( this );
  203.     VarManager *pVarManager = VarManager::instance( getIntf() );
  204.     pVarManager->getHelpText().delObserver( this );
  205. }