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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: pref.cpp,v 1.9.32.3 2004/07/09 01:48:16 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.    
  50. #include "hxtypes.h"
  51. #include "hxwintyp.h"
  52. #include "hxresult.h"
  53. #include "hxcom.h"
  54. #include "hxprefs.h"
  55. #include "pref.h"
  56. #include "hxassert.h"
  57. #include "hxbuffer.h"
  58. #include "hxstring.h"
  59. #include "hxstrutl.h"
  60. //#include "hlxclib/stdio.h"
  61. #include "hlxclib/stdlib.h"
  62. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  63. #if defined(_CARBON) || defined(_MAC_UNIX)
  64. #include "platform/mac/mac_pref_cf.h"
  65. #else
  66. #include "mac_pref.h"
  67. #endif
  68. #elif defined(_UNIX) && !defined(_MAC_UNIX)
  69. #include "unix_pref.h"
  70. #elif defined(_WIN32) || defined(_WINDOWS)
  71. #include "win_pref.h"
  72. #elif defined(_SYMBIAN)
  73. #include "symbian_pref.h"
  74. #elif defined(_OPENWAVE)
  75. #include "openwave_pref.h"
  76. #else
  77. #error Undefined platform!
  78. #endif
  79. #include "hxheap.h"
  80. #ifdef _DEBUG
  81. #undef HX_THIS_FILE
  82. static const char HX_THIS_FILE[] = __FILE__;
  83. #endif
  84. //  call open_pref() to automatically create the correct platform specific preference 
  85. //  object. If open_pref() returns NULL, an error occurred and the CPref object was 
  86. //  not created. Call last_error to get the error 
  87. CPref * CPref::open_pref(const char* pCompanyName, const char* pProductName, int nProdMajorVer, int nProdMinorVer, BOOL bCommon)
  88. {
  89.     CPref * pPref = NULL;
  90. #if   defined (_CARBON) || defined(_MAC_UNIX)
  91. pPref = CMacPref::open_pref(pCompanyName, pProductName, nProdMajorVer, nProdMinorVer, bCommon);
  92. #elif   defined (_MACINTOSH)
  93. pPref = CMacPref::open_pref(pCompanyName, pProductName, nProdMajorVer, nProdMinorVer);
  94. #elif defined( _UNIX)
  95. pPref = ( CPref *) CUnixPref::open_pref(pCompanyName, pProductName, nProdMajorVer, nProdMinorVer);
  96.         
  97. #elif defined(_SYMBIAN)
  98. pPref = ( CPref *) CSymbianPref::open_pref( pCompanyName,
  99.                                                     pProductName,
  100.                                                     nProdMajorVer,
  101.                                                     nProdMinorVer);
  102. #elif defined(_OPENWAVE)
  103. pPref = ( CPref *) COpenwavePref::open_pref( pCompanyName,
  104.                                                      pProductName,
  105.                                                      nProdMajorVer,
  106.                                                      nProdMinorVer);
  107. #elif defined( _WIN32 ) || defined( _WINDOWS )
  108. pPref = CWinPref::open_pref(pCompanyName, pProductName, nProdMajorVer, nProdMinorVer, bCommon);
  109. #endif
  110. if (pPref)
  111. {
  112. pPref->m_bIsCommonPref = bCommon;
  113. }
  114. return pPref;
  115. }
  116. CPref* CPref::open_shared_pref(const char* pCompanyName)
  117. {
  118.     // Major and Minor version numbers are not used for a shared preference since it is shared among all products
  119.     return CPref::open_pref(pCompanyName,HX_PRODUCTNAME_SHARED,0,0);
  120. }
  121. CPref* CPref::open_shared_user_pref(const char* pCompanyName)
  122. {
  123.     // Major and Minor version numbers are not used for a shared preference since it is shared among all products
  124.     return CPref::open_pref(pCompanyName,HX_PRODUCTNAME_SHARED,0,0,false);
  125. }
  126. //  Constructor NOTE: use open_pref() to create an instance of this class 
  127. CPref::CPref() :
  128.     m_pPrefTable(NULL), m_bIsCommonPref(FALSE)
  129. {
  130. mLastError = HXR_OK;
  131. }   
  132. //      class destructor 
  133. CPref::~CPref(void)
  134. {
  135.     HX_DELETE(m_pPrefTable);
  136. }
  137. void CPref::SetupPrefTable(PrefTableEntry* pPrefTable,INT32 nTableEntries)
  138.     // Cleanup existing pref table
  139.     HX_DELETE(m_pPrefTable);
  140.     // Create new pref table
  141.     m_pPrefTable = new CPrefTable(pPrefTable,nTableEntries,this);
  142.     HX_ASSERT(m_pPrefTable);
  143. }
  144. CPrefTable::CPrefTable(PrefTableEntry* pPrefTable,INT32 nTableEntries,CPref* pPrefs) :
  145.     m_pPrefTable(pPrefTable),
  146.     m_nTableEntries(nTableEntries),
  147.     m_pCPref(pPrefs),
  148.     m_pIHXPrefs(NULL)
  149. {
  150. }
  151. CPrefTable::CPrefTable(PrefTableEntry* pPrefTable,INT32 nTableEntries,IHXPreferences* pPrefs) :
  152.     m_pPrefTable(pPrefTable),
  153.     m_nTableEntries(nTableEntries),
  154.     m_pCPref(NULL),
  155.     m_pIHXPrefs(pPrefs)
  156. {
  157.     if (m_pIHXPrefs)
  158. m_pIHXPrefs->AddRef();
  159. }
  160. CPrefTable::~CPrefTable()
  161. {
  162.     HX_RELEASE(m_pIHXPrefs);
  163. }
  164. HX_RESULT CPrefTable::RemoveIndexedPref(INT32 nPrefKey)
  165. {
  166.     // Index is out of table range if this is false
  167.     HX_ASSERT(nPrefKey >= 0 && nPrefKey < m_nTableEntries);
  168.     // Need to call SetupPrefTable() if this is false
  169.     HX_ASSERT(m_pPrefTable);
  170.     // Index is out of table range
  171.     if (nPrefKey < 0 || nPrefKey >= m_nTableEntries)
  172. return HXR_INVALID_PARAMETER;
  173.     // Need to call SetupPrefTable()
  174.     if (!m_pPrefTable || !m_pCPref)
  175. return HXR_UNEXPECTED;
  176.     return m_pCPref->remove_indexed_pref(m_pPrefTable[nPrefKey].szPrefName);
  177. }
  178. HX_RESULT CPrefTable::RemovePref(INT32 nPrefKey)
  179. {
  180.     // Index is out of table range if this is false
  181.     HX_ASSERT(nPrefKey >= 0 && nPrefKey < m_nTableEntries);
  182.     // Need to call SetupPrefTable() if this is false
  183.     HX_ASSERT(m_pPrefTable);
  184.     // Index is out of table range
  185.     if (nPrefKey < 0 || nPrefKey >= m_nTableEntries)
  186. return HXR_INVALID_PARAMETER;
  187.     // Need to call SetupPrefTable()
  188.     if (!m_pPrefTable || !m_pCPref)
  189. return HXR_UNEXPECTED;
  190.     return m_pCPref->remove_pref(m_pPrefTable[nPrefKey].szPrefName);
  191. }
  192. BOOL CPrefTable::ReadPoints(const char* pBuffer,HXxPoint* pt,int nNumPoints)
  193. {
  194.     // If this is false something is really messed up
  195.     HX_ASSERT(pBuffer);
  196.     HX_ASSERT(pt);
  197.     const char* szSeperators = ",";
  198.     char szBufferCopy[MAX_PREF_SIZE]; /* Flawfinder: ignore */
  199.     char* pToken= NULL;
  200.     
  201.     SafeStrCpy(szBufferCopy, pBuffer, MAX_PREF_SIZE);
  202.    // Establish string and get the first token: 
  203.    pToken = strtok( szBufferCopy, szSeperators );
  204.    int i = 0;
  205.    while( pToken != NULL )
  206.    {
  207. // Store x value
  208. pt[i].x = atol(pToken);
  209. // Get next token and store y value
  210. pToken = strtok( NULL, szSeperators );
  211. pt[i].y = atol(pToken);
  212. // Get next token and continue
  213. i++;
  214. pToken = strtok( NULL, szSeperators );
  215.    }
  216.    return (i == nNumPoints) ? TRUE : FALSE;
  217. }
  218. HX_RESULT CPrefTable::ReadPrefColor(INT32 nPrefKey,HXxColor& color,INT32 nIndex)
  219. {
  220.     HX_RESULT theErr = HXR_OK;
  221.     INT32 lValue = 0;
  222.     theErr = ReadPrefInt(nPrefKey,lValue,nIndex);
  223.     color = (HXxColor) lValue;
  224.     return theErr;
  225. }
  226. HX_RESULT CPrefTable::ReadPref(INT32 nPrefKey,INT32 nIndex,IHXBuffer*& pBuffer)
  227. {
  228.     // Index is out of table range if this is false
  229.     HX_ASSERT(nPrefKey >= 0 && nPrefKey < m_nTableEntries);
  230.     // Need to call SetupPrefTable() if this is false
  231.     HX_ASSERT(m_pPrefTable);
  232.     // Index is out of table range
  233.     if (nPrefKey < 0 || nPrefKey >= m_nTableEntries)
  234. return HXR_INVALID_PARAMETER;
  235.     // Need to call SetupPrefTable()
  236.     if (!m_pPrefTable || (!m_pCPref && !m_pIHXPrefs))
  237. return HXR_UNEXPECTED;
  238.     // If we have an indexed pref append index number to pref
  239.     if (nIndex > 0)
  240.     {
  241.         char szIndexedPref[MAX_PREF_NAME]; /* Flawfinder: ignore */
  242. SafeSprintf(szIndexedPref,MAX_PREF_NAME,"%s%ld",m_pPrefTable[nPrefKey].szPrefName,nIndex);
  243. return (m_pCPref ? m_pCPref->read_pref(szIndexedPref,pBuffer) : m_pIHXPrefs->ReadPref(szIndexedPref,pBuffer));
  244.     }
  245.     // otherwise just read in this pref
  246.     else
  247. return (m_pCPref ? m_pCPref->read_pref(m_pPrefTable[nPrefKey].szPrefName,pBuffer) : m_pIHXPrefs->ReadPref(m_pPrefTable[nPrefKey].szPrefName,pBuffer));
  248. }
  249. BOOL CPrefTable::IsPrefSet(INT32 nPrefKey,INT32 nIndex)
  250. {
  251.     CHXBuffer* pBuffer = NULL;
  252.     HX_RESULT result;
  253.     // Try to read the pref
  254.     result = ReadPref(nPrefKey,nIndex,(IHXBuffer*&)pBuffer);
  255.     // Don't need buffer anymore
  256.     HX_RELEASE(pBuffer);
  257.     return SUCCEEDED(result) ? TRUE : FALSE;
  258. }
  259. HX_RESULT CPrefTable::ReadPrefInt(INT32 nPrefKey,INT32& nValue,INT32 nIndex)
  260. {
  261.     CHXBuffer* pBuffer = NULL;
  262.     HX_RESULT result;
  263.     // Default return value
  264.     nValue = 0;
  265.     // Try to read the pref
  266.     result = ReadPref(nPrefKey,nIndex,(IHXBuffer*&)pBuffer);
  267.     // Convert the preference to an integer 
  268.     if (result == HXR_OK)
  269. nValue = atol((const char*)pBuffer->GetBuffer());
  270.     // Pref doesn't exist convert default value to integer
  271.     // Added the invalid parameter check to insure the index in valid range RBP 8/20/01 
  272.     else if (HXR_INVALID_PARAMETER != result && HXR_UNEXPECTED != result)
  273.     {
  274. if(NULL != m_pPrefTable[nPrefKey].pDefaultValue)
  275. {
  276.     nValue = atol(m_pPrefTable[nPrefKey].pDefaultValue);
  277. }
  278. else
  279. {
  280.     return result;
  281. }
  282.     }
  283.     else
  284. return HXR_FAIL;
  285.     // Don't need buffer anymore
  286.     if (pBuffer)
  287. pBuffer->Release();
  288.     return HXR_OK;
  289. }
  290. HX_RESULT CPrefTable::ReadPrefRect(INT32 nPrefKey,HXxRect& rect,INT32 nIndex)
  291. {
  292.     CHXBuffer* pBuffer = NULL;
  293.     HX_RESULT result;
  294.     // Try to read the pref
  295.     result = ReadPref(nPrefKey,nIndex,(IHXBuffer*&)pBuffer);
  296.     // Convert the preference to a rect
  297.     HXxPoint ptArray[2];
  298.     if (result == HXR_OK)
  299.     {
  300. if (ReadPoints((const char*)pBuffer->GetBuffer(),ptArray,2))
  301. {
  302.     rect.left = ptArray[0].x;
  303.     rect.top = ptArray[0].y;
  304.     rect.right = ptArray[1].x;
  305.     rect.bottom = ptArray[1].y;
  306.     // Don't need buffer anymore
  307.     if (pBuffer)
  308. pBuffer->Release();
  309.     return HXR_OK;
  310. }
  311.     }
  312.     if (m_pPrefTable[nPrefKey].pDefaultValue)
  313.     {
  314. ReadPoints(m_pPrefTable[nPrefKey].pDefaultValue,ptArray,2);
  315. rect.left = ptArray[0].x;
  316. rect.top = ptArray[0].y;
  317. rect.right = ptArray[1].x;
  318. rect.bottom = ptArray[1].y;
  319.     }
  320.     else
  321. return HXR_FAIL;
  322.     // Don't need buffer anymore
  323.     if (pBuffer)
  324. pBuffer->Release();
  325.     return HXR_OK;
  326. }
  327. HX_RESULT CPrefTable::ReadPrefSize(INT32 nPrefKey,HXxSize& size,INT32 nIndex)
  328. {
  329.     CHXBuffer* pBuffer = NULL;
  330.     HX_RESULT result;
  331.     // Try to read the pref
  332.     result = ReadPref(nPrefKey,nIndex,(IHXBuffer*&)pBuffer);
  333.     // Convert the preference to a size
  334.     HXxPoint ptArray;
  335.     if (result == HXR_OK)
  336.     {
  337. if (ReadPoints((const char*)pBuffer->GetBuffer(),&ptArray,1))
  338. {
  339.     size.cx = ptArray.x;
  340.     size.cy = ptArray.y;
  341.     // Don't need buffer anymore
  342.     if (pBuffer)
  343. pBuffer->Release();
  344.     return HXR_OK;
  345. }
  346.     }
  347.     if (m_pPrefTable[nPrefKey].pDefaultValue)
  348.     {
  349. ReadPoints(m_pPrefTable[nPrefKey].pDefaultValue,&ptArray,1);
  350. size.cx = ptArray.x;
  351. size.cy = ptArray.y;
  352.     }
  353.     else
  354. return HXR_FAIL;
  355.     // Don't need buffer anymore
  356.     if (pBuffer)
  357. pBuffer->Release();
  358.     return HXR_OK;
  359. }
  360. HX_RESULT CPrefTable::ReadPrefPoint(INT32 nPrefKey,HXxPoint& pt,INT32 nIndex)
  361. {
  362.     CHXBuffer* pBuffer = NULL;
  363.     HX_RESULT result;
  364.     // Try to read the pref
  365.     result = ReadPref(nPrefKey,nIndex,(IHXBuffer*&)pBuffer);
  366.     // Convert the preference to a size
  367.     HXxPoint ptArray;
  368.     if (result == HXR_OK)
  369.     {
  370. if (ReadPoints((const char*)pBuffer->GetBuffer(),&ptArray,1))
  371. {
  372.     pt.x = ptArray.x;
  373.     pt.y = ptArray.y;
  374.     // Don't need buffer anymore
  375.     if (pBuffer)
  376. pBuffer->Release();
  377.     return HXR_OK;
  378. }
  379.     }
  380.     if (m_pPrefTable[nPrefKey].pDefaultValue)
  381.     {
  382. ReadPoints(m_pPrefTable[nPrefKey].pDefaultValue,&ptArray,1);
  383. pt.x = ptArray.x;
  384. pt.y = ptArray.y;
  385.     }
  386.     else
  387. return HXR_FAIL;
  388.     // Don't need buffer anymore
  389.     if (pBuffer)
  390. pBuffer->Release();
  391.     return HXR_OK;
  392. }
  393. HX_RESULT CPrefTable::ReadPrefString(INT32 nPrefKey,char* szString,INT32 nStrLen,INT32 nIndex)
  394. {
  395.     CHXBuffer* pBuffer = NULL;
  396.     HX_RESULT result;
  397.     if (!szString || !nStrLen)
  398. return HXR_INVALID_PARAMETER;
  399.     // Default return value
  400.     szString[0] = '';
  401.     // Try to read the pref
  402.     result = ReadPref(nPrefKey,nIndex,(IHXBuffer*&)pBuffer);
  403.     // Convert the preference to a string
  404.     if (result == HXR_OK)
  405.     {
  406. strncpy(szString,(const char*)pBuffer->GetBuffer(),(int)nStrLen);
  407.         szString[nStrLen-1] = '';
  408.     }
  409.     // Pref doesn't exist convert default value to integer
  410.     else if (m_pPrefTable[(int)nPrefKey].pDefaultValue)
  411.     {
  412. strncpy(szString,m_pPrefTable[nPrefKey].pDefaultValue,(int)nStrLen);
  413.         szString[nStrLen-1] = '';
  414.     }
  415.     else
  416. return HXR_FAIL;
  417.     // Don't need buffer anymore
  418.     if (pBuffer)
  419. pBuffer->Release();
  420.     return HXR_OK;
  421. }
  422.     
  423. HX_RESULT CPrefTable::ReadPrefBuffer(INT32 nPrefKey,IHXBuffer*& pBuffer,INT32 nIndex)
  424. {
  425.     HX_RESULT result;
  426.     // read_pref creates an IHXBuffer so this should be NULL
  427.     HX_ASSERT(!pBuffer);
  428.     // Try to read the pref
  429.     result = ReadPref(nPrefKey,nIndex,pBuffer);
  430.     // If the pref read failed try to create our own IMRABuffer and copy in the default pref
  431.     if (result != HXR_OK)
  432.     {
  433. if (m_pPrefTable[nPrefKey].pDefaultValue)
  434. {
  435.     pBuffer = new CHXBuffer;
  436.     if (!pBuffer)
  437. return HXR_OUTOFMEMORY;
  438.     pBuffer->AddRef();
  439.     pBuffer->Set((const UCHAR*)m_pPrefTable[nPrefKey].pDefaultValue,strlen(m_pPrefTable[nPrefKey].pDefaultValue)+1);
  440. }
  441. else
  442.     return HXR_FAIL;
  443.     }
  444.     return HXR_OK;
  445. }
  446. HX_RESULT CPrefTable::WritePref(INT32 nPrefKey,INT32 nIndex,IHXBuffer* pBuffer)
  447. {
  448.     // Index is out of table range if this is false
  449.     HX_ASSERT(nPrefKey >= 0 && nPrefKey < m_nTableEntries);
  450.     // Need to call SetupPrefTable() if this is false
  451.     HX_ASSERT(m_pPrefTable);
  452.     // Index is out of table range
  453.     if (nPrefKey < 0 || nPrefKey >= m_nTableEntries)
  454. return HXR_INVALID_PARAMETER;
  455.     // Need to call SetupPrefTable()
  456.     if (!m_pPrefTable || (!m_pCPref && !m_pIHXPrefs))
  457. return HXR_UNEXPECTED;
  458.     // If we have an indexed pref append index number to pref
  459.     if (nIndex > 0)
  460.     {
  461.         char szIndexedPref[MAX_PREF_NAME]; /* Flawfinder: ignore */
  462. SafeSprintf(szIndexedPref,MAX_PREF_NAME,"%s%ld",m_pPrefTable[nPrefKey].szPrefName,nIndex);
  463. return (m_pCPref ? m_pCPref->write_pref(szIndexedPref,pBuffer) : m_pIHXPrefs->WritePref(szIndexedPref,pBuffer));
  464.     }
  465.     else
  466. return (m_pCPref ? m_pCPref->write_pref(m_pPrefTable[nPrefKey].szPrefName,pBuffer) : m_pIHXPrefs->WritePref(m_pPrefTable[nPrefKey].szPrefName,pBuffer));
  467. }
  468. IHXBuffer* CPrefTable::CreateIHXBuffer(const char* szString)
  469. {
  470.     // Create new buffer
  471.     CHXBuffer* pBuffer = new CHXBuffer();
  472.     if (!pBuffer)
  473. return NULL;
  474.     // Addref and fill buffer
  475.     pBuffer->AddRef();
  476.     pBuffer->Set((const UCHAR*)szString,strlen(szString)+1);
  477.     return pBuffer;
  478. }
  479. HX_RESULT CPrefTable::WritePrefColor(INT32 nPrefKey,const HXxColor& color,INT32 nIndex)
  480. {
  481.     INT32 lValue = (INT32)color;
  482.     return WritePrefInt(nPrefKey,lValue,nIndex);
  483. }
  484. HX_RESULT CPrefTable::WritePrefInt(INT32 nPrefKey,INT32 nValue,INT32 nIndex)
  485. {
  486.     IHXBuffer* pBuffer = NULL;
  487.     char szBuff[MAX_INT_BUFFER]; /* Flawfinder: ignore */
  488.     
  489.     SafeSprintf(szBuff, sizeof(szBuff), "%ld", nValue);
  490.     // Create buffer and write pref
  491.     pBuffer = CreateIHXBuffer(szBuff);
  492.     HX_RESULT result = WritePref(nPrefKey,nIndex,pBuffer);
  493.     // Don't need buffer anymore
  494.     if (pBuffer)
  495. pBuffer->Release();
  496.     return result;
  497. }
  498. HX_RESULT CPrefTable::WritePrefRect(INT32 nPrefKey,const HXxRect& rect,INT32 nIndex)
  499. {
  500.     IHXBuffer* pBuffer = NULL;
  501.     char szBuff[MAX_RECT_BUFFER]; /* Flawfinder: ignore */
  502.     
  503.     SafeSprintf(szBuff, sizeof(szBuff), "%ld,%ld,%ld,%ld",
  504.                 rect.left, rect.top, rect.right, rect.bottom);
  505.     // Create buffer and write pref
  506.     pBuffer = CreateIHXBuffer(szBuff);
  507.     HX_RESULT result = WritePref(nPrefKey,nIndex,pBuffer);
  508.     // Don't need buffer anymore
  509.     if (pBuffer)
  510. pBuffer->Release();
  511.     return result;
  512. }
  513. HX_RESULT CPrefTable::WritePrefSize(INT32 nPrefKey,const HXxSize& size,INT32 nIndex)
  514. {
  515.     IHXBuffer* pBuffer = NULL;
  516.     char szBuff[MAX_SIZE_BUFFER]; /* Flawfinder: ignore */
  517.     
  518.     SafeSprintf(szBuff, sizeof(szBuff), "%ld,%ld", size.cx, size.cy);
  519.     // Create buffer and write pref
  520.     pBuffer = CreateIHXBuffer(szBuff);
  521.     HX_RESULT result = WritePref(nPrefKey,nIndex,pBuffer);
  522.     // Don't need buffer anymore
  523.     if (pBuffer)
  524. pBuffer->Release();
  525.     return result;
  526. }
  527. HX_RESULT CPrefTable::WritePrefPoint(INT32 nPrefKey,const HXxPoint& pt,INT32 nIndex)
  528. {
  529.     IHXBuffer* pBuffer = NULL;
  530.     char szBuff[MAX_POINT_BUFFER]; /* Flawfinder: ignore */
  531.     
  532.     SafeSprintf(szBuff, sizeof(szBuff), "%ld,%ld", pt.x, pt.y);
  533.     // Create buffer and write pref
  534.     pBuffer = CreateIHXBuffer(szBuff);
  535.     HX_RESULT result = WritePref(nPrefKey,nIndex,pBuffer);
  536.     // Don't need buffer anymore
  537.     if (pBuffer)
  538. pBuffer->Release();
  539.     return result;
  540. }
  541. HX_RESULT CPrefTable::WritePrefString(INT32 nPrefKey,const char* szString,INT32 nIndex)
  542. {
  543.     IHXBuffer* pBuffer = NULL;
  544.     // Create buffer and write pref
  545.     pBuffer = CreateIHXBuffer(szString);
  546.     HX_RESULT result = WritePref(nPrefKey,nIndex,pBuffer);
  547.     // Don't need buffer anymore
  548.     if (pBuffer)
  549. pBuffer->Release();
  550.     return result;
  551. }
  552. HX_RESULT CPrefTable::WritePrefBuffer(INT32 nPrefKey,IHXBuffer* pBuffer,INT32 nIndex)
  553. {
  554.     return WritePref(nPrefKey,nIndex,pBuffer);
  555. }
  556. HX_RESULT CPrefTable::BeginSubPref(INT32 nPrefKey)
  557. {
  558.     // Index is out of table range if this is false
  559.     HX_ASSERT(nPrefKey >= 0 && nPrefKey < m_nTableEntries);
  560.     // Need to call SetupPrefTable() if this is false
  561.     HX_ASSERT(m_pPrefTable);
  562.     // Index is out of table range
  563.     if (nPrefKey < 0 || nPrefKey >= m_nTableEntries)
  564. return HXR_INVALID_PARAMETER;
  565.     // Need to call SetupPrefTable()
  566.     if (!m_pPrefTable || !m_pCPref)
  567. return HXR_UNEXPECTED;
  568.     // Call BeginSubPref with the actual string
  569.     return m_pCPref->BeginSubPref(m_pPrefTable[nPrefKey].szPrefName);
  570. }
  571. ///////////////////////////////////////////////
  572. #ifdef PREFTESTING
  573. #include <stdio.h>
  574. #define INITGUID
  575. #include "hxcom.h"
  576. #include "ihxpckts.h"
  577. #include "pref.h"
  578. #include "playpref.h"
  579. #include "chxpckts.h"
  580. int main(int argc, char **argv)
  581. {
  582. CPref *mPref = 0;
  583. CHXBuffer* pinBuffer = 0;
  584. CHXBuffer* poutBuffer = 0;
  585. #ifdef _WINDOWS
  586. const char* pCompanyName = HXVER_COMPANY;
  587. const char* pProductName = HXVER_SDK_PRODUCT;
  588. int nMajVer = TARVER_MAJOR_VERSION;
  589. int nMinVer = TARVER_MINOR_VERSION;
  590. #else
  591. const char* pCompanyName = HXVER_COMPANY;
  592. const char* pProductName = HXVER_SDK_PRODUCT;
  593. int nMajVer = 6;
  594. int nMinVer = 0;
  595. #endif
  596. char * pComa = HXFindChar(pCompanyName, ',');
  597. if(pComa)
  598.         *pComa = 0;
  599. mPref = CPlayerPref::open_pref(pCompanyName,pProductName,nMajVer,nMinVer);
  600. pinBuffer = new CHXBuffer;
  601. if ( !pinBuffer )
  602. {
  603. printf("can't create CHXBuffern");
  604. exit(0);
  605. }
  606. char *svalue = 0;
  607. svalue = (char*) new char [ 10 ];
  608. strcpy(svalue, "IsADog"); /* Flawfinder: ignore */
  609. pinBuffer->AddRef();
  610. pinBuffer->Set((const unsigned char*) svalue, strlen(svalue) + 1);
  611. mPref->write_pref("Pushkin",pinBuffer);
  612. mPref->read_pref("Pushkin",poutBuffer);
  613. // printf("Pushkin is: %sn",(char*) (poutBuffer->GetBuffer()));
  614. if ( mPref ) 
  615. delete mPref;
  616. exit(0);
  617. }
  618. #endif