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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #include "hxresult.h"
  37. #include "hxcom.h"
  38. #include "ihxpckts.h"
  39. #include "hxfiles.h"
  40. #include "hxcore.h"
  41. #include "hxprefs.h"
  42. #include "hxengin.h"
  43. #include "pref.h"
  44. #include "playpref.h"
  45. #include "hxpref.h"
  46. #include "hxheap.h"
  47. #ifdef _DEBUG
  48. #undef HX_THIS_FILE
  49. static const char HX_THIS_FILE[] = __FILE__;
  50. #endif
  51. BEGIN_INTERFACE_LIST( HXPreferences )
  52. INTERFACE_LIST_ENTRY_SIMPLE( IHXPreferences );
  53. #ifndef _UNIX
  54. INTERFACE_LIST_ENTRY_SIMPLE( IHXPreferences2 );
  55. #endif
  56. INTERFACE_LIST_ENTRY_SIMPLE( IHXPreferences3 );
  57. END_INTERFACE_LIST
  58. #ifdef _UNIX
  59. #define     PREF_COMMIT_TIMEOUT     0
  60. class HXPreferencesCallback : public IHXCallback
  61. {
  62. public:
  63.     /*
  64.      * IUnknown methods
  65.      */
  66.     STDMETHOD(QueryInterface) (THIS_
  67. REFIID riid,
  68. void** ppvObj)
  69.     {
  70. if (IsEqualIID(riid, IID_IUnknown))
  71. {
  72.     AddRef();
  73.     *ppvObj = (IUnknown*)this;
  74.     return HXR_OK;
  75. }
  76. else if (IsEqualIID(riid, IID_IHXCallback))
  77. {
  78.     AddRef();
  79.     *ppvObj = (IHXCallback*)this;
  80.     return HXR_OK;
  81. }
  82. *ppvObj = NULL;
  83. return HXR_NOINTERFACE;
  84.     };
  85.     STDMETHOD_(ULONG32,AddRef) (THIS)
  86.     {
  87. return InterlockedIncrement(&m_lRefCount);
  88.     };
  89.     STDMETHOD_(ULONG32,Release) (THIS)
  90.     {
  91. if (InterlockedDecrement(&m_lRefCount) > 0)
  92. {
  93.     return m_lRefCount;
  94. }
  95. delete this;
  96. return 0;
  97.     };
  98.     /*
  99.      *  IHXCallback methods
  100.      */
  101.     
  102.     STDMETHOD(Func) (THIS)
  103.     {
  104. m_CallbackHandle = 0;
  105. return m_pPreferences->CommitPrefs();
  106.     }
  107.     void Close()
  108.     {
  109. if (m_CallbackHandle && m_pScheduler)
  110. {
  111.     m_pScheduler->Remove(m_CallbackHandle);
  112.     m_CallbackHandle = 0;
  113. }
  114. HX_RELEASE(m_pScheduler);
  115.     };
  116.     BOOL IsPending() {return (m_CallbackHandle != 0); };
  117.     void
  118.     ScheduleCallback()
  119.     {
  120. HX_ASSERT(m_CallbackHandle == 0);
  121. if (m_pScheduler && !m_CallbackHandle)
  122. {
  123.     m_CallbackHandle = m_pScheduler->RelativeEnter(this, PREF_COMMIT_TIMEOUT);
  124. }
  125.     }
  126.     HXPreferencesCallback(HXPreferences* pPreferences, IUnknown* pContext)
  127.     {
  128. m_lRefCount = 0;
  129. m_pPreferences = pPreferences;
  130. m_pScheduler = 0;
  131. m_CallbackHandle = 0;
  132. if (pContext)
  133. {
  134.     HX_VERIFY(HXR_OK == 
  135. pContext->QueryInterface(IID_IHXScheduler, (void**) &m_pScheduler));
  136.   }
  137.     };
  138.     ~HXPreferencesCallback()
  139.     {
  140. Close();
  141.     };
  142.     INT32     m_lRefCount;
  143.     CallbackHandle  m_CallbackHandle;
  144.     IHXScheduler*  m_pScheduler;
  145.     HXPreferences* m_pPreferences;
  146. };
  147. #endif
  148. HXPreferences::HXPreferences() :
  149.     m_pPref(0),
  150.     m_nProdMajorVer(0),
  151.     m_nProdMinorVer(0),
  152.     m_bCommon(TRUE),
  153.     m_pContext(0)
  154. #ifdef _UNIX
  155.     ,m_pCallback(NULL)
  156. #endif
  157. {
  158. }
  159. HXPreferences::~HXPreferences()
  160. {
  161.     Close();
  162. }
  163. void
  164. HXPreferences::Close()
  165. {
  166. #ifdef _UNIX
  167.     if (m_pCallback)
  168.     {
  169. m_pCallback->Close();
  170. HX_RELEASE(m_pCallback);
  171.     }
  172. #endif
  173.     HX_RELEASE(m_pContext);
  174.     HX_DELETE(m_pPref);
  175. }
  176. HX_RESULT
  177. HXPreferences::SetContext(IUnknown* pContext)
  178. {
  179.     m_pContext = pContext;
  180.     if (m_pContext)
  181.     {
  182. m_pContext->AddRef();
  183.     }
  184. #ifdef _UNIX
  185.     if (m_pContext && !m_pCallback)
  186.     {
  187. m_pCallback = new HXPreferencesCallback(this, m_pContext);
  188.         if(!m_pCallback)
  189.         {
  190.             return HXR_OUTOFMEMORY;
  191.         }
  192. m_pCallback->AddRef();
  193.     }
  194. #endif
  195.     return HXR_OK;
  196. }
  197. #if defined(_UNIX) || defined(_CARBON)
  198. HX_RESULT
  199. HXPreferences::CommitPrefs()
  200. {
  201.     HX_RESULT theErr = HXR_OK;
  202.     if (m_pPref)
  203.     {
  204. theErr = m_pPref->commit_prefs();
  205.     }
  206.     return theErr;
  207. }
  208. #endif
  209. /*
  210.  * HXPreferences methods
  211.  */
  212. /************************************************************************
  213.  * Method:
  214.  * IHXPreferences::Init
  215.  * Purpose:
  216.  * TBD
  217.  */
  218. STDMETHODIMP HXPreferences::Open(const char* pCompanyName, const char* pProductName, 
  219. ULONG32 nProdMajorVer, ULONG32 nProdMinorVer)
  220. {
  221.     m_CompanyName = pCompanyName;
  222.     m_ProductName = pProductName;
  223.     m_nProdMajorVer = nProdMajorVer;
  224.     m_nProdMinorVer = nProdMinorVer;
  225.     
  226.     m_pPref = CPlayerPref::open_pref(pCompanyName, pProductName, nProdMajorVer, nProdMinorVer);
  227.     
  228.     if (!m_pPref)
  229.     {
  230. return HXR_UNEXPECTED;
  231.     }
  232.     m_bCommon = m_pPref->IsCommonPref();
  233.     return HXR_OK;
  234. }
  235. STDMETHODIMP HXPreferences::OpenShared(const char* pCompanyName)
  236. {
  237.     m_CompanyName = pCompanyName;
  238.     m_ProductName = HX_PRODUCTNAME_SHARED;
  239.     m_nProdMajorVer = 0;
  240.     m_nProdMinorVer = 0;
  241.     
  242.     m_pPref = CPlayerPref::open_shared_pref(pCompanyName);
  243.     if (!m_pPref)
  244.     {
  245. return HXR_UNEXPECTED;
  246.     }
  247.     m_bCommon = m_pPref->IsCommonPref();
  248.     return HXR_OK;
  249. }
  250. STDMETHODIMP HXPreferences::OpenSharedUser(const char* pCompanyName)
  251. {
  252.     m_CompanyName = pCompanyName;
  253.     m_ProductName = HX_PRODUCTNAME_SHARED;
  254.     m_nProdMajorVer = 0;
  255.     m_nProdMinorVer = 0;
  256.     
  257.     m_pPref = CPlayerPref::open_shared_user_pref(pCompanyName);
  258.     if (!m_pPref)
  259.     {
  260. return HXR_UNEXPECTED;
  261.     }
  262.     m_bCommon = m_pPref->IsCommonPref();
  263.     return HXR_OK;
  264. }
  265. STDMETHODIMP HXPreferences::OpenUserPref(const char* pCompanyName, const char* pProductName, 
  266. ULONG32 nProdMajorVer, ULONG32 nProdMinorVer)
  267. {
  268.     m_CompanyName = pCompanyName;
  269.     m_ProductName = pProductName;
  270.     m_nProdMajorVer = nProdMajorVer;
  271.     m_nProdMinorVer = nProdMinorVer;
  272.     
  273.     m_pPref = CPlayerPref::open_pref(pCompanyName, pProductName, nProdMajorVer, nProdMinorVer, FALSE);
  274.     if (!m_pPref)
  275.     {
  276. return HXR_UNEXPECTED;
  277.     }
  278.     m_bCommon = m_pPref->IsCommonPref();
  279.     return HXR_OK;
  280. }
  281. /************************************************************************
  282.  * Method:
  283.  * IHXPreferences::ReadPref
  284.  * Purpose:
  285.  * TBD
  286.  */
  287. STDMETHODIMP HXPreferences::ReadPref(const char* pPrefKey, IHXBuffer*& pBuffer)
  288. {
  289.     return m_pPref->read_pref(pPrefKey, pBuffer);
  290. }
  291. /************************************************************************
  292.  * Method:
  293.  * IHXPreferences::WritePref
  294.  * Purpose:
  295.  * TBD
  296.  */
  297. STDMETHODIMP HXPreferences::WritePref(const char* pPrefKey, IHXBuffer* pBuffer)
  298. {
  299.     HX_RESULT theErr = HXR_FAIL;
  300.     if( m_pPref )
  301.     {
  302.         theErr = m_pPref->write_pref(pPrefKey, pBuffer);
  303.     }
  304. #ifdef _UNIX
  305.     if (m_pCallback && !m_pCallback->IsPending())
  306.     {
  307. m_pCallback->ScheduleCallback();
  308.     }
  309. #endif
  310.     return theErr;
  311. }
  312. /************************************************************************
  313.  * Method:
  314.  * IHXPreferences::DeletePref
  315.  * Purpose:
  316.  * TBD
  317.  */
  318. STDMETHODIMP HXPreferences::DeletePref(const char* pPrefKey)
  319. {
  320.     HX_RESULT theErr = m_pPref->delete_pref(pPrefKey);
  321. #ifdef _UNIX
  322.     if (m_pCallback && !m_pCallback->IsPending())
  323.     {
  324. m_pCallback->ScheduleCallback();
  325.     }
  326. #endif
  327.     return theErr;
  328. }
  329. /************************************************************************
  330.  * Method:
  331.  * IHXPreferences::GetPreferenceEnumerator
  332.  * Purpose:
  333.  * TBD
  334.  */
  335. STDMETHODIMP HXPreferences::GetPreferenceEnumerator(
  336. REF(IHXPreferenceEnumerator*) /*OUT*/ pEnum)
  337. {
  338.     pEnum = new HXPreferenceEnumerator(
  339. m_CompanyName, 
  340. m_ProductName, 
  341. m_nProdMajorVer, 
  342. m_nProdMinorVer,
  343. m_bCommon);
  344.     if (!pEnum)
  345. return HXR_FAIL;
  346.     pEnum->AddRef();
  347.     return HXR_OK;
  348. }
  349. STDMETHODIMP HXPreferences::ResetRoot(const char* pCompanyName, const char* pProductName, 
  350. int nProdMajorVer, int nProdMinorVer)
  351. {
  352.     if (m_pPref)
  353.     {
  354. delete m_pPref;
  355.     }
  356.     if(m_bCommon)
  357. return Open( pCompanyName, pProductName, nProdMajorVer, nProdMinorVer );
  358.     return OpenUserPref( pCompanyName, pProductName, nProdMajorVer, nProdMinorVer );
  359. }
  360. /***********************************************************************
  361. ****     HXPreferenceEnumerator     ****
  362. ***********************************************************************/
  363. HXPreferenceEnumerator::HXPreferenceEnumerator(
  364.     const char* pCompanyName, 
  365.     const char* pProductName, 
  366.     ULONG32 nProdMajorVer, 
  367.     ULONG32 nProdMinorVer,
  368.     BOOL bCommon)
  369. : m_lRefCount (0)
  370. , m_pPref(0)
  371. {
  372.     m_pPref = CPlayerPref::open_pref(pCompanyName, pProductName, nProdMajorVer, nProdMinorVer, bCommon);
  373. }
  374. HXPreferenceEnumerator::~HXPreferenceEnumerator()
  375. {
  376.     if (m_pPref)
  377.     {
  378. delete m_pPref;
  379. m_pPref = 0;
  380.     }
  381. }
  382. /*
  383.  * IUnknown methods
  384.  */
  385. /////////////////////////////////////////////////////////////////////////
  386. // Method:
  387. // IUnknown::QueryInterface
  388. // Purpose:
  389. // Implement this to export the interfaces supported by your 
  390. // object.
  391. //
  392. STDMETHODIMP HXPreferenceEnumerator::QueryInterface(REFIID riid, void** ppvObj)
  393. {
  394.     QInterfaceList qiList[] =
  395.         {
  396.             { GET_IIDHANDLE(IID_IHXPreferenceEnumerator), (IHXPreferenceEnumerator*)this },
  397.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXPreferenceEnumerator*)this },
  398.         };
  399.     
  400.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  401. }
  402. /////////////////////////////////////////////////////////////////////////
  403. // Method:
  404. // IUnknown::AddRef
  405. // Purpose:
  406. // Everyone usually implements this the same... feel free to use
  407. // this implementation.
  408. //
  409. STDMETHODIMP_(ULONG32) HXPreferenceEnumerator::AddRef()
  410. {
  411.     return InterlockedIncrement(&m_lRefCount);
  412. }
  413. /////////////////////////////////////////////////////////////////////////
  414. // Method:
  415. // IUnknown::Release
  416. // Purpose:
  417. // Everyone usually implements this the same... feel free to use
  418. // this implementation.
  419. //
  420. STDMETHODIMP_(ULONG32) HXPreferenceEnumerator::Release()
  421. {
  422.     if (InterlockedDecrement(&m_lRefCount) > 0)
  423.     {
  424. return m_lRefCount;
  425.     }
  426.     delete this;
  427.     return 0;
  428. }
  429. /************************************************************************
  430.  * Method:
  431.  * IHXPreferenceEnumerator::EndSubPref
  432.  * Purpose:
  433.  * TBD
  434.  */
  435. STDMETHODIMP HXPreferenceEnumerator::BeginSubPref (const char* szSubPref)
  436. {
  437.     return m_pPref->BeginSubPref(szSubPref);
  438. }
  439. /************************************************************************
  440.  * Method:
  441.  * IHXPreferenceEnumerator::EndSubPref
  442.  * Purpose:
  443.  * TBD
  444.  */
  445. STDMETHODIMP HXPreferenceEnumerator::EndSubPref()
  446. {
  447.     return m_pPref->EndSubPref();
  448. }
  449. /************************************************************************
  450.  * Method:
  451.  * IHXPreferenceEnumerator::GetPrefKey
  452.  * Purpose:
  453.  * TBD
  454.  */
  455. STDMETHODIMP HXPreferenceEnumerator::GetPrefKey (UINT32 nIndex, REF(IHXBuffer*) pBuffer)
  456. {
  457.     return m_pPref->GetPrefKey(nIndex, pBuffer);
  458. }
  459. /************************************************************************
  460.  * Method:
  461.  * IHXPreferenceEnumerator::ReadPref
  462.  * Purpose:
  463.  * TBD
  464.  */
  465. STDMETHODIMP HXPreferenceEnumerator::ReadPref(const char* pPrefKey, IHXBuffer*& pBuffer)
  466. {
  467.     return m_pPref->read_pref(pPrefKey, pBuffer);
  468. }