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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * var_text.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: var_text.cpp 7715 2004-05-18 18:47:02Z ipkiss $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teuli鑢e <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., 59 Temple Place - Suite 330, Boston, MA  02111, 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. #include "../vars/stream.hpp"
  30. const string VarText::m_type = "text";
  31. VarText::VarText( intf_thread_t *pIntf ): Variable( pIntf ),
  32.     m_text( pIntf, "" ), m_lastText( pIntf, "" )
  33. {
  34. }
  35. VarText::~VarText()
  36. {
  37.     // Remove the observers
  38.     VlcProc *pVlcProc = VlcProc::instance( getIntf() );
  39.     pVlcProc->getTimeVar().delObserver( this );
  40.     pVlcProc->getVolumeVar().delObserver( this );
  41.     pVlcProc->getStreamVar().delObserver( this );
  42.     VarManager *pVarManager = VarManager::instance( getIntf() );
  43.     pVarManager->getHelpText().delObserver( this );
  44. }
  45. const UString VarText::get() const
  46. {
  47.     uint32_t pos;
  48.     VlcProc *pVlcProc = VlcProc::instance( getIntf() );
  49.     // Fill a temporary UString object, and replace the escape characters
  50.     // ($H for help, $T for current time, $L for time left, $D for duration,
  51.     // $V for volume)
  52.     UString temp( m_text );
  53.     // $H is processed first, in case the help string contains other variables
  54.     // to replace. And it is replaced only once, in case one of these other
  55.     // variables is $H...
  56.     if( (pos = temp.find( "$H" )) != UString::npos )
  57.     {
  58.         VarManager *pVarManager = VarManager::instance( getIntf() );
  59.         // We use .getRaw() to avoid replacing the $H recursively!
  60.         temp.replace( pos, 2, pVarManager->getHelpText().getRaw() );
  61.     }
  62.     while( (pos = temp.find( "$T" )) != UString::npos )
  63.     {
  64.         temp.replace( pos, 2,
  65.                       pVlcProc->getTimeVar().getAsStringCurrTime().c_str() );
  66.     }
  67.     while( (pos = temp.find( "$L" )) != UString::npos )
  68.     {
  69.         temp.replace( pos, 2,
  70.                       pVlcProc->getTimeVar().getAsStringTimeLeft().c_str() );
  71.     }
  72.     while( (pos = temp.find( "$D" )) != UString::npos )
  73.     {
  74.         temp.replace( pos, 2,
  75.                       pVlcProc->getTimeVar().getAsStringDuration().c_str() );
  76.     }
  77.     while( (pos = temp.find( "$V" )) != UString::npos )
  78.     {
  79.         temp.replace( pos, 2,
  80.                       pVlcProc->getVolumeVar().getAsStringPercent().c_str() );
  81.     }
  82.     while( (pos = temp.find( "$N" )) != UString::npos )
  83.     {
  84.         temp.replace( pos, 2,
  85.                       pVlcProc->getStreamVar().getAsStringName().c_str() );
  86.     }
  87.     while( (pos = temp.find( "$F" )) != UString::npos )
  88.     {
  89.         temp.replace( pos, 2,
  90.                       pVlcProc->getStreamVar().getAsStringFullName().c_str() );
  91.     }
  92.     return temp;
  93. }
  94. void VarText::set( const UString &rText )
  95. {
  96.     // Avoid an infinite loop
  97.     if( rText == m_text )
  98.     {
  99.         return;
  100.     }
  101.     // Stop observing other variables
  102.     VlcProc *pVlcProc = VlcProc::instance( getIntf() );
  103.     pVlcProc->getTimeVar().delObserver( this );
  104.     pVlcProc->getVolumeVar().delObserver( this );
  105.     pVlcProc->getStreamVar().delObserver( this );
  106.     VarManager *pVarManager = VarManager::instance( getIntf() );
  107.     pVarManager->getHelpText().delObserver( this );
  108.     m_text = rText;
  109.     // Observe needed variables
  110.     if( m_text.find( "$H" ) != UString::npos )
  111.     {
  112.         pVarManager->getHelpText().addObserver( this );
  113.     }
  114.     if( m_text.find( "$T" ) != UString::npos )
  115.     {
  116.         pVlcProc->getTimeVar().addObserver( this );
  117.     }
  118.     if( m_text.find( "$L" ) != UString::npos )
  119.     {
  120.         pVlcProc->getTimeVar().addObserver( this );
  121.     }
  122.     if( m_text.find( "$D" ) != UString::npos )
  123.     {
  124.         pVlcProc->getTimeVar().addObserver( this );
  125.     }
  126.     if( m_text.find( "$V" ) != UString::npos )
  127.     {
  128.         pVlcProc->getVolumeVar().addObserver( this );
  129.     }
  130.     if( m_text.find( "$N" ) != UString::npos )
  131.     {
  132.         pVlcProc->getStreamVar().addObserver( this );
  133.     }
  134.     if( m_text.find( "$F" ) != UString::npos )
  135.     {
  136.         pVlcProc->getStreamVar().addObserver( this );
  137.     }
  138.     notify();
  139. }
  140. void VarText::onUpdate( Subject<VarPercent> &rVariable )
  141. {
  142.     UString newText = get();
  143.     // If the text has changed, notify the observers
  144.     if( newText != m_lastText )
  145.     {
  146.         m_lastText = newText;
  147.         notify();
  148.     }
  149. }
  150. void VarText::onUpdate( Subject<VarText> &rVariable )
  151. {
  152.     UString newText = get();
  153.     // If the text has changed, notify the observers
  154.     if( newText != m_lastText )
  155.     {
  156.         m_lastText = newText;
  157.         notify();
  158.     }
  159. }