hxpref.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:13k
源码类别:

Symbian

开发平台:

Visual C++

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