chxavsettingsdata.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:14k
源码类别:

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavsettingsdata.cpp
  3.  * ---------------------
  4.  *
  5.  * Synopsis:
  6.  * Data values associated with settings lists.
  7.  *
  8.  * Target:
  9.  * Symbian OS
  10.  *
  11.  *
  12.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  13.  *
  14.  ************************************************************************/
  15. // Symbian includes...
  16. #include <akntextsettingpage.h>
  17. // Includes from this project...
  18. #include "chxavmisc.h"
  19. #include "chxavsettingslist.h"
  20. #include "chxavsettingsview.h"
  21. #include "chxavconfignames.h"
  22. #include "chxavfileutil.h"
  23. #include "hxapihelp.h"
  24. #include "hxsym_debug.h"
  25. #include "chxavaccesspointsettingsitem.h"
  26. #include "realplayer.hrh"
  27. #include "chxavstringutils.h"
  28. namespace
  29. {
  30. const TUint MS_PER_SEC = 1000;
  31. const TUint BYTES_PER_KB = 1024;
  32. const TInt k_minUdpPortLimit = 6970;
  33. const TInt k_maxUdpPortLimit = 32000;//KMaxTUint16;
  34. static const TInt g_bwVals[] = 
  35. {
  36.     9050,
  37.     13400,
  38.     18100,
  39.     26800,
  40.     27150,
  41.     40200
  42. };
  43. static const TInt g_clipIntroVals[] =
  44. {
  45.     0, 5, 10, 20, 30, 45, 60
  46. };
  47. // ensure that 'lower <= val <= upper' is true for val
  48. template< typename T>
  49. inline
  50. void ConstrainWithinBounds(T lower, T& val, T upper)
  51. {
  52.     HX_ASSERT(lower <= upper);
  53.     val = min(upper, max(lower, val));
  54. }
  55. inline
  56. TInt ConvertBwToIndex(TInt val)
  57. {
  58.     return CHXAvUtil::GetThresholdIndex(val, g_bwVals, ARRAY_COUNT(g_bwVals));
  59. }
  60. inline
  61. TInt ConvertClipIntroTimeToIndex(TInt val)
  62. {
  63.     return CHXAvUtil::GetThresholdIndex(val, g_clipIntroVals, ARRAY_COUNT(g_clipIntroVals));
  64. }
  65. void EnableZeroLength(CAknSettingItem* pItem)
  66. {
  67.     TInt flags = pItem->SettingPageFlags();
  68.     pItem->SetSettingPageFlags( flags | CAknTextSettingPage::EZeroLengthAllowed);
  69. }
  70. } // locals
  71. CHXAvSettingsData::CHXAvSettingsData(IHXCommonClassFactory* pFactory, IHXPreferences* pPrefs)
  72. {
  73.     HX_ASSERT(pPrefs);
  74.     HX_ASSERT(pFactory);
  75.     m_prefs = pPrefs;
  76.     m_factory = pFactory;
  77. }
  78. /*
  79.  * UpdatePrefInt
  80.  * -------------
  81.  * Return if has value has changed or if id is not already found.
  82.  *
  83.  */
  84. bool 
  85. CHXAvSettingsData::UpdatePrefInt(const CHXString& id, TInt newVal)
  86. {
  87.     HX_ASSERT(m_prefs);
  88.    
  89.     INT32 oldVal;
  90.     // only write if value is new or is different from what is there
  91.     bool bFound = prefs::LookupINT32(m_prefs, id, oldVal);
  92.     if (!bFound || (oldVal != newVal))
  93.     {
  94.         prefs::Write(m_factory, m_prefs, id, newVal);
  95.         return true;
  96.     }
  97.     return false;
  98. }
  99. void CHXAvSettingsData::SetTextValue(const CHXString& id, TDes& buffer)
  100. {
  101.     CHXString strValue = prefs::GetString(m_prefs, id);
  102.     CHXAvStringUtils::StringToDes(strValue, buffer);
  103. }
  104. /*
  105.  * UpdatePrefString
  106.  * ----------------
  107.  * Return if has value has changed or if id is not already found.
  108.  *
  109.  */
  110. bool 
  111. CHXAvSettingsData::UpdatePrefString(const CHXString& id, const TDes& newVal)
  112. {
  113.     CHXString strNew;
  114.     CHXAvStringUtils::DesToString(newVal, strNew);
  115.     return UpdatePrefString(id, strNew); 
  116. }
  117. bool 
  118. CHXAvSettingsData::UpdatePrefString(const CHXString& id, const CHXString& strNew)
  119. {
  120.     HX_ASSERT(m_prefs);
  121.     CHXString strOld;
  122.     bool bFound = prefs::LookupString(m_prefs, id, strOld);
  123.     
  124.     // only write if value is new or is different from what is there
  125.     if (!bFound || (strOld != strNew) )
  126.     {
  127.         prefs::Write(m_factory, m_prefs, id, strNew);  
  128.         return true;
  129.     }
  130.     return false;
  131. }
  132. ////////////////////////////////////////////////////
  133. //
  134. void CHXAvSettingsDataVideo::InitValuesFromPreferencesL()
  135. {
  136. /*
  137.     There is a Quality preference used in the RV, MPEG4, and RA renderers.
  138.     Here is the meaning for RV renderer:
  139.     quality >= 4 - FRU and Post Filter
  140.     quality >= 3 - Deblocking of B-Frames
  141.     quality >= 2 - Full decoding of B-frames
  142.     quality >= 1 - Decode B-Frames.
  143.     Here is the meaning for MPEG 4 renderer:
  144.     quality >= 2 - Postfilter
  145.     FRU and B-Frames appear to always be off
  146. */
  147.     m_bAutoScaleVideo = prefs::GetBool(m_prefs, CHXAV_AutoScale, m_bAutoScaleVideo);
  148.     m_bPostFilterOn = prefs::GetBool(m_prefs, CHXAV_EnablePostFilter, m_bPostFilterOn);
  149. }
  150. void CHXAvSettingsDataVideo::UpdatePreferencesL()
  151. {
  152.     UpdatePrefInt(CHXAV_AutoScale, m_bAutoScaleVideo);
  153.     UpdatePrefInt(CHXAV_EnablePostFilter, m_bPostFilterOn);
  154. }
  155. CAknSettingItem* CHXAvSettingsDataVideo::CreateSettingItemL(TInt id)
  156. {
  157.     CAknSettingItem* pItem = 0;
  158.     switch(id)
  159.     {
  160.     case ESetPostFilter:
  161. pItem = new (ELeave) CAknBinaryPopupSettingItem(id, m_bPostFilterOn);
  162. break;
  163.     case ESetAutoScaleVideo:
  164. pItem = new (ELeave) CAknBinaryPopupSettingItem(id, m_bAutoScaleVideo);
  165. break;
  166.     default:
  167.         HX_ASSERT(false);
  168.     };
  169.     return pItem;
  170. }
  171. ////////////////////////////////////////////////////
  172. //
  173. void CHXAvSettingsDataPlayback::InitValuesFromPreferencesL()
  174. {
  175.     HX_ASSERT(m_prefs);
  176.     m_bLoopMode = prefs::GetBool(m_prefs, CHXAV_LoopMode, m_bLoopMode);
  177.     m_bShuffleMode = prefs::GetBool(m_prefs, CHXAV_ShuffleMode, m_bShuffleMode);
  178.     TInt secsClipIntro = prefs::GetINT32(m_prefs, CHXAV_ClipIntroSecs);
  179.     m_idxClipIntro = ConvertClipIntroTimeToIndex(secsClipIntro);
  180. }
  181. void CHXAvSettingsDataPlayback::UpdatePreferencesL()
  182. {
  183.     UpdatePrefInt(CHXAV_LoopMode, m_bLoopMode);
  184.     UpdatePrefInt(CHXAV_ShuffleMode, m_bShuffleMode);
  185.     HX_ASSERT(m_idxClipIntro < ARRAY_COUNT(g_clipIntroVals));
  186.     UpdatePrefInt(CHXAV_ClipIntroSecs, g_clipIntroVals[m_idxClipIntro]);
  187. }
  188. CAknSettingItem* CHXAvSettingsDataPlayback::CreateSettingItemL(TInt id)
  189. {
  190.     CAknSettingItem* pItem = 0;
  191.     switch(id)
  192.     {
  193.     case ESetLoopMode:
  194. pItem = new (ELeave) CAknBinaryPopupSettingItem(id, m_bLoopMode);
  195. break;
  196.     case ESetShuffleMode:
  197.         pItem = new (ELeave) CAknBinaryPopupSettingItem(id, m_bShuffleMode);
  198.         break;
  199.     case ESetClipIntroSecs:
  200.         pItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(id, m_idxClipIntro);
  201.         break;
  202.     default:
  203.         HX_ASSERT(false);
  204.     };
  205.     return pItem;
  206. }
  207. namespace
  208. {
  209. ////////////////////////////////////////////////////
  210. // port preference strings is in form "low-high[,low-high]" (we only allow one range however)
  211. void ParsePortRange(const CHXString& strPorts, TInt& minPort, TInt& maxPort)
  212. {
  213.     minPort = k_minUdpPortLimit;
  214.     maxPort = k_maxUdpPortLimit;
  215.     minPort = atoi(strPorts);
  216.     TInt idxDash = strPorts.Find("-");
  217.     HX_ASSERT(idxDash != -1);
  218.     if(-1 != idxDash)
  219.     {
  220.         CHXString strHigh = strPorts.Mid(idxDash + 1);
  221.         maxPort = atoi(strHigh);
  222.     }
  223. }
  224. } // ns anon
  225. ////////////////////////////////////////////////////
  226. //
  227. void CHXAvSettingsDataNetwork::InitValuesFromPreferencesL()
  228. {
  229.     //m_bUseManualBW = prefs::GetBool(m_prefs, CHXAV_ManualBandwidth, m_bUseManualBW);
  230.     
  231.     //XXXLCM
  232.     /*Bandwidth - Typical bitrate you are able to sustain
  233. MaxBandwidth - The highest bitrate that you want the player to try
  234.                to upshift to.
  235.                */
  236.     TInt maxDeliveryBW = 0;
  237.     maxDeliveryBW = prefs::GetINT32(m_prefs, CHXAV_MaxBandwidth, maxDeliveryBW);
  238.     m_idxNetworkBW = ConvertBwToIndex(maxDeliveryBW);
  239.     m_connectTimeOut = prefs::GetINT32(m_prefs, CHXAV_ConnTimeout, m_connectTimeOut);
  240.     ConstrainWithinBounds(10, m_connectTimeOut, 120);
  241.     m_serverTimeOut = prefs::GetINT32(m_prefs, CHXAV_ServerTimeout, m_serverTimeOut);
  242.     ConstrainWithinBounds(10, m_serverTimeOut, 120);
  243.     // ports
  244.     CHXString strPorts = prefs::GetString(m_prefs, CHXAV_UDPPort);
  245.     ParsePortRange(strPorts, m_minUdpPort, m_maxUdpPort);
  246.     ConstrainWithinBounds(k_minUdpPortLimit, m_minUdpPort, k_maxUdpPortLimit);
  247.     ConstrainWithinBounds(m_minUdpPort, m_maxUdpPort, k_maxUdpPortLimit);
  248.     // If the int value of the access point is 0, we use the string value....
  249.     m_idAccessPoint = prefs::GetINT32(m_prefs, CHXAV_AccessPoint, 0);
  250.     if (m_idAccessPoint == 0)
  251.     {
  252. CHXString strValue = prefs::GetString(m_prefs, CHXAV_AccessPointStr);
  253. // If the string value is not empty, convert it to integer using the accesspointdb...
  254. if (!strValue.IsEmpty())
  255. {
  256.             CHXAvAccessPointDB* pDb = new (ELeave) CHXAvAccessPointDB;
  257.             AUTO_PUSH_POP_DEL(pDb);
  258.             pDb->ConstructL();
  259.     m_idAccessPoint = pDb->GetIapIDFromNameL(strValue);
  260. }
  261.     }
  262. }
  263. void CHXAvSettingsDataNetwork::UpdatePreferencesL()
  264. {
  265.     //UpdatePrefInt(CHXAV_ManualBandwidth, m_bUseManualBW);
  266.     
  267.     // special case: prevent unwanted overwrite
  268.     if(m_bMaxDelivBWEdited) 
  269.     {
  270.         HX_ASSERT(m_idxNetworkBW < ARRAY_COUNT(g_bwVals));
  271.         UpdatePrefInt(CHXAV_MaxBandwidth, g_bwVals[m_idxNetworkBW]);
  272.         // XXXLCM set 'bandwidth' and max delivery bw the same
  273.         UpdatePrefInt(CHXAV_Bandwidth, g_bwVals[m_idxNetworkBW]);
  274.     }
  275.     UpdatePrefInt(CHXAV_ConnTimeout, m_connectTimeOut);
  276.     UpdatePrefInt(CHXAV_ServerTimeout, m_serverTimeOut);
  277.     // use 'server timeout' value specified by user to set (similar) 
  278.     // udp timeout as well. 
  279.     // Note: The UDPTimeout units are milliseconds instead of seconds
  280.     UpdatePrefInt(CHXAV_UDPTimeout, m_serverTimeOut * 1000);
  281.     UpdatePrefInt(CHXAV_AccessPoint, m_idAccessPoint);
  282.     
  283.     // ports (contrain to valid values)
  284.     ConstrainWithinBounds(k_minUdpPortLimit, m_minUdpPort, k_maxUdpPortLimit);
  285.     ConstrainWithinBounds(m_minUdpPort, m_maxUdpPort, k_maxUdpPortLimit);
  286.         
  287.     HX_ASSERT(m_maxUdpPort >= m_minUdpPort);
  288.     UpdatePrefInt(CHXAV_UseUDPPort, true);
  289.     CHXString strPort;
  290.     strPort.Format("%lu-%lu", m_minUdpPort, m_maxUdpPort);
  291.     UpdatePrefString(CHXAV_UDPPort, strPort);
  292. }
  293. CAknSettingItem* CHXAvSettingsDataNetwork::CreateSettingItemL(TInt id)
  294. {
  295.     CAknSettingItem* pItem = 0;
  296.     switch(id)
  297.     {
  298.     case ESetDefaultAccessPoint:
  299.         pItem = new (ELeave) CHXAvAccessPointSettingsItem(id, m_idAccessPoint);
  300.         break;
  301.     case ESetUseManualBW:
  302.         HX_ASSERT(false);
  303. //pItem = new (ELeave) CAknBinaryPopupSettingItem(id, m_bUseManualBW);
  304. break;
  305.     case ESetNetworkBandwidth:
  306.         pItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(id, m_idxNetworkBW);
  307.         break;
  308.     case ESetConnectTimeOut:
  309. pItem = new (ELeave) CAknSliderSettingItem(id, m_connectTimeOut);
  310. break;
  311.     case ESetServerTimeOut:
  312. pItem = new (ELeave) CAknSliderSettingItem(id, m_serverTimeOut);
  313. break;
  314.     case ESetMinUdpPort:
  315. pItem = new (ELeave) CAknIntegerEdwinSettingItem(id, m_minUdpPort);
  316. break;
  317.     case ESetMaxUdpPort:
  318. pItem = new (ELeave) CAknIntegerEdwinSettingItem(id, m_maxUdpPort);
  319. break;
  320.     default:
  321.         HX_ASSERT(false);
  322.     };
  323.     return pItem;
  324. }
  325. void CHXAvSettingsDataNetwork::EditItemL(CAknSettingItem* pItem)
  326. {
  327.     //
  328.     // special case to handle fact that debug tab 
  329.     // also allows you to edit the same value
  330.     //
  331.     if( pItem->Identifier() == ESetNetworkBandwidth)
  332.     {
  333.         m_bMaxDelivBWEdited = true;
  334.     }
  335. }
  336. ////////////////////////////////////////////////////
  337. //
  338. void CHXAvSettingsDataProxy::InitValuesFromPreferencesL()
  339. {
  340.     m_bUseProxy = prefs::GetBool(m_prefs, CHXAV_UseProxy, m_bUseProxy);
  341.     m_proxyPort = prefs::GetINT32(m_prefs, CHXAV_ProxyPort, m_proxyPort);
  342.  
  343.     m_spProxy = new (ELeave) TFileName;
  344.     SetTextValue(CHXAV_Proxy, *m_spProxy);
  345. }
  346. void CHXAvSettingsDataProxy::UpdatePreferencesL()
  347. {
  348.     UpdatePrefInt(CHXAV_UseProxy, m_bUseProxy);
  349.     UpdatePrefInt(CHXAV_ProxyPort, m_proxyPort);
  350.     UpdatePrefString(CHXAV_Proxy, *m_spProxy);
  351. }
  352. CAknSettingItem* CHXAvSettingsDataProxy::CreateSettingItemL(TInt id)
  353. {
  354.     CAknSettingItem* pItem = 0;
  355.     switch(id)
  356.     {
  357.     case ESetProxyHost:
  358. pItem = new (ELeave) CAknTextSettingItem(id, *m_spProxy);
  359.         EnableZeroLength(pItem);
  360. break;
  361.     case ESetProxyPort:
  362. pItem = new (ELeave) CAknIntegerEdwinSettingItem(id, m_proxyPort);
  363. break;
  364.     case ESetUseProxyHost:
  365. pItem = new (ELeave) CAknBinaryPopupSettingItem(id, m_bUseProxy);
  366. break;
  367.     default:
  368.         HX_ASSERT(false);
  369.     };
  370.     return pItem;
  371. }
  372. #if defined(HELIX_FEATURE_DPRINTF)
  373. #include "chxavcheckboxlistsettingitem.h"
  374. ////////////////////////////////////////////////////
  375. //
  376. void CHXAvSettingsDataDebug::InitValuesFromPreferencesL()
  377. {
  378.     //
  379.     // debug settings
  380.     //
  381.     m_debugMask = prefs::GetUINT32(m_prefs, CHXAV_DebugMask, 0);
  382.   
  383.     m_spLogSink = new (ELeave) TFileName;
  384.     SetTextValue(CHXAV_LogSink, *m_spLogSink);
  385. }
  386. void CHXAvSettingsDataDebug::UpdatePreferencesL()
  387. {
  388.     DPRINTF(SYMP_INFO, ("CHXAvSettingsDataDebug::UpdatePreferencesL()n"));
  389.     // logsink can be filename, disabled ("" or "none"), or "console"
  390.     _LIT(KSinkNone, "none");
  391.     _LIT(KSinkConsole, "console");
  392.     if( 0 == m_spLogSink->CompareF(KSinkNone) )
  393.     {
  394.         // set "none" to ""
  395.         m_spLogSink->Zero();
  396.     }
  397.     if( (m_spLogSink->Length() > 0) && (0 != m_spLogSink->CompareF(KSinkConsole)) )
  398.     {
  399.         TInt idxDrive = CHXAvFile::GetDriveIndex(*m_spLogSink);
  400.         if(-1 == idxDrive)
  401.         {
  402.             // make relative to c: drive so file is easy to find
  403.             m_spLogSink = CHXAvFile::AllocFileNameL(_L("c:\"), *m_spLogSink);
  404.         }
  405.     }
  406.     UpdatePrefInt(CHXAV_DebugMask, m_debugMask);
  407.     UpdatePrefString(CHXAV_LogSink, *m_spLogSink);
  408.     dbg::SetupDebug(m_prefs);
  409.     DPRINTF(SYMP_INFO, ("CHXAvSettingsDataDebug::UpdatePreferencesL(): updated log sink and maskn"));
  410. }
  411. CAknSettingItem* CHXAvSettingsDataDebug::CreateSettingItemL(TInt id)
  412. {
  413.     CAknSettingItem* pItem = 0;
  414.     switch(id)
  415.     {
  416.     case ESetDebugMask:
  417.         pItem = new (ELeave) CHXAvCheckBoxListSettingItem(id, m_debugMask );
  418.         break;
  419.     case ESetLogSink:
  420. pItem = new (ELeave) CAknTextSettingItem(id, *m_spLogSink);
  421.         EnableZeroLength(pItem);
  422. break;
  423.     default:
  424.         HX_ASSERT(false);
  425.     };
  426.     return pItem;
  427. }
  428. #endif