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

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * hxsym_hxapihelp.cpp
  3.  * -------------
  4.  *
  5.  * Synopsis:
  6.  *  helpers to simplify working with helix api interfaces
  7.  *
  8.  *
  9.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  10.  *
  11.  ************************************************************************/
  12. #include "hxtypes.h"
  13. #include "hxcom.h"
  14. #include "hxresult.h"
  15. #include "hxcomm.h" //IHXBuffer
  16. #include "ihxpckts.h" //IHXValues
  17. #include "hxmon.h" //IHXRegistry
  18. #include "hxprefs.h" //IHXPreferences
  19. #include "chxmapstringtostring.h"
  20. #include "comptr_traits.h"
  21. #include "comptr.h"
  22. #include "chxavmisc.h"
  23. #include "hxsym_debug.h"
  24. #include "hxapihelp.h"
  25. //////////////////////////////////
  26. // read property name into a string object
  27. bool reg::GetPropName(IHXRegistry* pReg, UINT32 idKey, CHXString& strName)
  28. {
  29.     HX_ASSERT(pReg);
  30.     comptr<IHXBuffer> buffer;
  31.     HX_RESULT hr = pReg->GetPropName(idKey, buffer.AsRef());
  32.     if( SUCCEEDED(hr) )
  33.     {
  34.         strName = reinterpret_cast<const char*>(buffer->GetBuffer());
  35.     }
  36.     return SUCCEEDED(hr);
  37. }
  38. //////////////////////////////////
  39. // read registry base.key into a string object
  40. bool reg::GetString(IHXRegistry* pReg, const char* pszBase, const char* pszKey, CHXString& strValue, bool bIsBuffer)
  41. {
  42.     HX_ASSERT(pReg);
  43.     HX_ASSERT(pszBase);
  44.     HX_ASSERT(pszKey);
  45.     comptr<IHXBuffer> buffer;
  46.     CHXString strFullKey(pszBase);
  47.     strFullKey += '.';
  48.     strFullKey += pszKey;
  49.     HX_RESULT hr;
  50.     if( bIsBuffer )
  51.     {
  52.         hr = pReg->GetBufByName(static_cast<const char*>(strFullKey), buffer.AsRef());
  53.     }
  54.     else
  55.     {
  56.         hr = pReg->GetStrByName(static_cast<const char*>(strFullKey), buffer.AsRef());
  57.     }
  58.     if( SUCCEEDED(hr) )
  59.     {
  60.         strValue = reinterpret_cast<const char*>(buffer->GetBuffer());
  61.     }
  62.     return SUCCEEDED(hr);
  63. }
  64. //
  65. // Add string as string property; make readable as both string and buffer property
  66. // 
  67. HX_RESULT reg::AddString(IHXRegistry* pReg, 
  68.                             IHXCommonClassFactory* pFactory,
  69.                             const char* pszBaseKey, 
  70.                             const char* pszKey, 
  71.                             const char* pszVal)
  72. {
  73.     HX_ASSERT_VALID_PTR(pReg);
  74.     HX_ASSERT_VALID_PTR(pFactory);
  75.     HX_ASSERT_VALID_PTR(pszKey);
  76.     HX_ASSERT_VALID_PTR(pszBaseKey);
  77.     HX_ASSERT_VALID_PTR(pszVal);
  78.     CHXString strKey;
  79.     strKey.Format("%s.%s", pszBaseKey, pszKey);
  80.     comptr<IHXBuffer> buffer;
  81.     HX_RESULT hr = buf::Create(pFactory, pszVal, buffer.AsRef());
  82.     if( FAILED(hr) )
  83.     {
  84.         return HR_CHECK(hr);
  85.     }
  86.     comptr<IHXRegistryAltStringHandling> setter;
  87.     if(setter.From(pReg))
  88.     {
  89.         UINT32 id = pReg->AddStr(strKey, buffer);
  90.         if( id )
  91.         {
  92.         setter->SetStringAccessAsBufferById( id );
  93.         hr = HXR_OK;
  94.         }
  95.     }
  96.     else
  97.     {
  98.         hr = pReg->AddBuf(strKey, buffer); // older server
  99.     }
  100.     return HR_CHECK(hr);
  101. }
  102. ////////////////////////////
  103. //
  104. // scan through psz, verifying that second string comprises a valid
  105. // key prefix of the first (case insensitive) if it does, return 
  106. // new position after prefix; else return NULL
  107. //
  108. // example:
  109. //
  110. //  ScanPastKeyPrefix("foo.bar.woo", "foo") 
  111. //
  112. // returns pointer to "bar.woo"
  113. //
  114. //   ScanPastKeyPrefix("foo.bar.woo", "baz")
  115. //
  116. // returns NULL pointer
  117. // 
  118. const char* reg::ScanPastKeyPrefix( const char* psz, const char* pszPrefix)
  119. {
  120.     HX_ASSERT_VALID_PTR(pszPrefix);
  121.     HX_ASSERT_VALID_PTR(psz);
  122.     UINT32 idx = 0;
  123.     for( ; pszPrefix[idx];  ++idx )
  124.     {
  125.         //
  126.         // scan through part of key that should match the key 
  127.         // for our reg entry; do lower case comparison.
  128.         //
  129.         char ch = psz[idx];
  130.         if( 'A' <= ch && ch <= 'Z' )
  131.         {
  132.             ch -= 'A' - 'a';
  133.         }
  134.         char chPrefix = pszPrefix[idx];
  135.         if( 'A' <= chPrefix && chPrefix <= 'Z' )
  136.         {
  137.             chPrefix -= 'A' - 'a';
  138.         }
  139.         if( ch != chPrefix )
  140.         {
  141.             // bad key
  142.             // PN_TRACE("string '%s' doesn't begin with prefix '%s'n", psz, pszPrefix);
  143.             return NULL;
  144.         }
  145.     }
  146.     if( psz[idx++] != '.' )
  147.     {
  148. // should have ended on a dot
  149. // PN_TRACE("string '%s': string '%s' is not a valid key prefixn", psz, pszPrefix);
  150. return NULL;
  151.     }
  152.     return psz + idx;
  153. }
  154. ////////////////////////////
  155. //
  156. // Scan through registry key nodes; append strExtracted with key fragement we passed
  157. //
  158. // return new position ( null terminator if last key)
  159. //
  160. // example:
  161. //
  162. //  ScanKeyNodes("foo.bar.woo", 2, str) 
  163. //
  164. // yields "foo.bar" in str, returns pointer to "woo"
  165. // 
  166. const char* reg::ScanKeyNodes( const char* psz, UINT32 nNodeCount, CHXString& strExtracted )
  167. {
  168.     HX_ASSERT_VALID_PTR(psz);
  169.     UINT32 idx = 0;
  170.     while( nNodeCount-- )
  171.     {
  172.         // collect to dot or null
  173.         for( ; psz[idx] && psz[idx] != '.'; ++idx  )
  174.         {
  175.             strExtracted += psz[idx];
  176.         }
  177.         if( psz[idx] )
  178.         {
  179.             if( nNodeCount) 
  180.             {
  181.                 // add the dot since we're not finished
  182.                 strExtracted += psz[idx];
  183.             }
  184.             ++idx;
  185.         }
  186.         else
  187.         {
  188.             break;
  189.         }
  190.     }
  191.     return psz + idx;
  192. }
  193. HX_RESULT buf::Create(IHXCommonClassFactory* pFactory, const char* psz, IHXBuffer*& pbuffNew)
  194. {
  195.     HX_ASSERT_VALID_PTR(pFactory);
  196.     HX_ASSERT_VALID_PTR(psz);
  197.     HX_RESULT hr = pFactory->CreateInstance(IID_IHXBuffer, reinterpret_cast<void**>(&pbuffNew));
  198.     if(SUCCEEDED(hr))
  199.     {
  200.         hr = pbuffNew->Set( reinterpret_cast<const BYTE*>(psz), strlen(psz) + 1);
  201.         if(FAILED(hr))
  202.         {
  203.     // can't use buffer
  204.     HX_RELEASE(pbuffNew);
  205.         }
  206.     }
  207.     return hr;
  208. }
  209. //////////////////////////////////////////
  210. //
  211. // Get a bool from the IHXValues object, stored as a UINT32. Bool var
  212. // passed in is unmodified if key does not exist (or is of wrong type),
  213. // so you can pass in a default.
  214. //
  215. bool val::GetBool(IHXValues* pval, const char* pszKey, bool& b)
  216. {
  217.     HX_ASSERT_VALID_PTR(pval);
  218.     UINT32 n;
  219.     HX_RESULT hr = pval->GetPropertyULONG32(pszKey, n);
  220.     if( SUCCEEDED(hr) )
  221.     {
  222.         b = (n != 0);
  223.     }
  224.     return SUCCEEDED(hr);
  225. }
  226. //////////////////////////////////////////
  227. //
  228. // Get a CHXString from the IHXValues object. String is unmodified if
  229. // key does not exist (or is of wrong type), so you can pass in a default.
  230. //
  231. bool val::GetString(IHXValues* pval, const char* pszKey, CHXString& strVal, ValType type)
  232. {
  233.     HX_ASSERT_VALID_PTR(pval);
  234.     comptr<IHXBuffer> buffer;
  235.     HX_RESULT (STDMETHODCALLTYPE IHXValues::*pfnGetProp)(const char*, REF(IHXBuffer*)) =
  236.     (type == string) ? &IHXValues::GetPropertyCString : &IHXValues::GetPropertyBuffer;
  237.     HX_RESULT hr = (pval->*pfnGetProp)(pszKey, buffer.AsRef());
  238.     if( SUCCEEDED(hr) )
  239.     {
  240.         strVal = reinterpret_cast<const char*>(buffer->GetBuffer());   
  241.         strVal.TrimLeft();
  242.         strVal.TrimRight();
  243.     }
  244.     return SUCCEEDED(hr);
  245. }
  246. //////////////////////////////////////////
  247. //
  248. bool val::GetUINT32(IHXValues* pval, const char* pszKey, UINT32& out)
  249. {
  250.     HX_ASSERT_VALID_PTR(pval);
  251.     ULONG32 n;
  252.     HX_RESULT hr = pval->GetPropertyULONG32(pszKey, n);
  253.     if( SUCCEEDED(hr) )
  254.     {
  255.         out = n;
  256.         return true;
  257.     }
  258.     return false;
  259. }
  260. //////////////////////////////////////////
  261. //
  262. // gets UINT16, checking that value is in range
  263. //
  264. bool val::GetUINT16(IHXValues* pval, const char* pszKey, UINT16& out)
  265. {
  266.     UINT32 n;
  267.     HX_RESULT hr = GetUINT32(pval, pszKey, n);
  268.     if( SUCCEEDED(hr) )
  269.     {
  270.         HX_ASSERT(n <= 0xffff);
  271.         if( n <= 0xffff )
  272.         {
  273.             // good - in range
  274.             out = UINT16(n);
  275.         }  
  276.         else
  277.         {
  278.             hr = HXR_FAIL;
  279.         }
  280.     }
  281.     return SUCCEEDED(hr);
  282. }
  283. void val::GetStringProps(IHXValues* pval, ValType type, CHXMapStringToString& props)
  284. {
  285.     typedef HX_RESULT (STDMETHODCALLTYPE IHXValues::*PFN_GetFirstProp)(const char*&, IHXBuffer*&);
  286.     typedef HX_RESULT (STDMETHODCALLTYPE IHXValues::*PFN_GetNextProp)(const char*&, IHXBuffer*&);
  287.     PFN_GetFirstProp pfnGetFirst;
  288.     PFN_GetNextProp pfnGetNext;
  289.     switch( type )
  290.     {
  291.         case buffer:
  292.     pfnGetFirst = &IHXValues::GetFirstPropertyBuffer;
  293.     pfnGetNext = &IHXValues::GetNextPropertyBuffer;
  294.     break;
  295.         case string:
  296.     pfnGetFirst = &IHXValues::GetFirstPropertyCString;
  297.     pfnGetNext = &IHXValues::GetNextPropertyCString;
  298.     break;
  299.         default:
  300.     HX_ASSERT(false);
  301.     }
  302.     const char* pszPropName = NULL;
  303.     comptr<IHXBuffer> buffer;
  304.     HX_RESULT hr = (pval->*pfnGetFirst)(pszPropName, buffer.AsRef());
  305.     while( SUCCEEDED(hr) )
  306.     {
  307.         props[ CHXString(pszPropName) ] = CHXString(reinterpret_cast<const char*>(buffer->GetBuffer())); 
  308.         buffer.Reset();
  309.         hr = (pval->*pfnGetNext)(pszPropName, buffer.AsRef());
  310.     }
  311. }
  312. void prefs::Write(IHXCommonClassFactory* pFactory, IHXPreferences* pPrefs, const char* pKey, const char* pszVal)
  313. {
  314.     HX_ASSERT(pFactory);
  315.     HX_ASSERT(pPrefs);
  316.     comptr<IHXBuffer> buffer;
  317.     buf::Create(pFactory, pszVal, buffer.AsRef());
  318.     pPrefs->WritePref(pKey, buffer);
  319. }
  320. void prefs::Write(IHXCommonClassFactory* pFactory, IHXPreferences* pPrefs, const char* pKey, UINT32 val)
  321. {
  322.     HX_ASSERT(pFactory);
  323.     HX_ASSERT(pPrefs);
  324.     comptr<IHXBuffer> buffer;
  325.     CHXString strVal;
  326.     strVal.Format("%lu", val);
  327.     buf::Create(pFactory, strVal, buffer.AsRef());
  328.     pPrefs->WritePref(pKey, buffer);
  329. }
  330. //////////////////////////////////////////////
  331. // these all return 'true' if pref exists (in which
  332. // case out param is set to the retrieved value)
  333. //
  334. bool prefs::LookupString(IHXPreferences* pPrefs, const char* pKey, CHXString& strOut)
  335. {
  336.     comptr<IHXBuffer> buffer;
  337.     HX_RESULT hr = pPrefs->ReadPref(pKey, buffer.AsRef());
  338.     if( SUCCEEDED(hr) )
  339.     {
  340.         strOut = reinterpret_cast<const char*>(buffer->GetBuffer());
  341.         return true;
  342.     }
  343.     return false;
  344. }
  345. bool prefs::LookupBool(IHXPreferences* pPrefs, const char* pKey, bool& bValOut)
  346. {
  347.     CHXString str;
  348.     if( LookupString(pPrefs, pKey, str) )
  349.     {
  350.         if (!str.IsEmpty())
  351.         {
  352.     bValOut = (atoi(str) != 0);
  353.         }
  354.         else
  355.         {
  356.             // define "key=" (no val) as "key=0"
  357.             bValOut = false;
  358.         }
  359.         return true;
  360.     }
  361.     
  362.     return false;
  363. }
  364.       
  365. bool prefs::LookupUINT32(IHXPreferences* pPrefs, const char* pKey, UINT32& valOut)
  366. {
  367.     CHXString str;
  368.     if(LookupString(pPrefs, pKey, str))
  369.     {
  370.         if (!str.IsEmpty())
  371.         {
  372.     valOut = strtoul(str, 0, 10);
  373.         } 
  374.         else
  375.         {
  376.             // define "key=" (no val) as "key=0"
  377.             valOut = 0;
  378.         }
  379.         return true;
  380.     } 
  381.     return false;
  382. }
  383. bool prefs::LookupINT32(IHXPreferences* pPrefs, const char* pKey, INT32& valOut)
  384. {
  385.     CHXString str;
  386.     if(LookupString(pPrefs, pKey, str))
  387.     {
  388.         if (!str.IsEmpty())
  389.         {
  390.     valOut = atoi(str);
  391.         } 
  392.         else
  393.         {
  394.             // define "key=" (no val) as "key=0"
  395.             valOut = 0;
  396.         }
  397.         return true;
  398.     } 
  399.     return false;
  400. }
  401. ////////////////////////////////////////////////////////////////////////
  402. // these all return value from prefs, or default value if not found 
  403. //
  404. CHXString  prefs::GetString(IHXPreferences* pPrefs, const char* pKey, const char* pszDefault)
  405. {
  406.     CHXString str;
  407.     if(!LookupString(pPrefs, pKey, str))
  408.     {
  409.         str = pszDefault;
  410.     }
  411.     return str;
  412. }
  413. bool prefs::GetBool(IHXPreferences* pPrefs, const char* pKey, bool bDefaultValue)
  414. {
  415.     bool bVal;
  416.     if(!LookupBool(pPrefs, pKey, bVal))
  417.     {
  418.         bVal = bDefaultValue;
  419.     }
  420.     return bVal;
  421. }
  422. UINT32 prefs::GetUINT32(IHXPreferences* pPrefs, const char* pKey, UINT32 defaultValue)
  423. {
  424.     UINT32 val;
  425.     if(!LookupUINT32(pPrefs, pKey, val))
  426.     {
  427.         val = defaultValue;
  428.     }
  429.     return val;
  430. }
  431. INT32 prefs::GetINT32(IHXPreferences* pPrefs, const char* pKey, INT32 defaultValue)
  432. {
  433.     INT32 val;
  434.     if(!LookupINT32(pPrefs, pKey, val))
  435.     {
  436.         val = defaultValue;
  437.     }
  438.     return val;
  439. }