property.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:10k
源码类别:

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. #ifndef _PROPERTY_H
  36. #define _PROPERTY_H
  37. #include <string.h>
  38. #include "hxtypes.h"
  39. #include "hxcom.h"
  40. #include "ihxpckts.h"
  41. #include "hxbuffer.h"
  42. #include "hxmon.h"
  43. #include "key.h"
  44. #include "db_misc.h"
  45. #include "db_dict_abs.h"
  46. #include "watchlst.h"
  47. struct IHXPropWatchResponse;
  48. class PropWatch
  49. {
  50. public:
  51.     PropWatch() : m_pResponse(0){}
  52.     ~PropWatch() {}
  53.     IHXPropWatchResponse* m_pResponse;
  54. };
  55. class Property
  56. {
  57. private: 
  58.     Key*   _prop_name;
  59.     HXPropType  _prop_type;
  60.     // (in bytes) mainly for strings/binary blobs
  61.     INT32 _prop_size;
  62.     BOOL     _deleted;
  63.     BOOL _read_only;
  64.     union VALUE
  65.     {
  66. IHXBuffer* t_buf;
  67. INT32 t_int;
  68. INT32* t_iref;
  69. DB_implem* t_imp;
  70.     } _prop_val;
  71. public:
  72.     WatchList* m_pWatchList;
  73.     LONG32 m_lWatchCount;
  74.     Property();
  75.     Property(Key* n, HXPropType t);
  76.     Property(char* n, HXPropType t);
  77.     virtual ~Property();
  78.     // mutator methods
  79.     virtual HX_RESULT key_str(char* s);
  80.     virtual HX_RESULT type(const HXPropType t);
  81.     virtual HX_RESULT buf_val(IHXBuffer* v, HXPropType t = PT_BUFFER);
  82.     virtual HX_RESULT int_val(const INT32 v);
  83.     virtual HX_RESULT int_ref_val(INT32* v);
  84.     virtual HX_RESULT db_val(DB_implem* v);
  85.     // accessor methods
  86.     virtual const Key* get_key_obj() const;
  87.     virtual const char* get_key_str() const;
  88.     virtual int         get_key_str_len() const;
  89.     virtual void        get_type(HXPropType* t) const;
  90.     virtual HXPropType get_type() const;
  91.     virtual HX_RESULT        get_buf_val(IHXBuffer** v, 
  92.     HXPropType t = PT_BUFFER) const;
  93.     virtual const IHXBuffer* get_buf_val(HXPropType t = PT_BUFFER) const;
  94.     virtual HX_RESULT        get_int_val(INT32* v) const;
  95.     virtual INT32       get_int_val() const;
  96.     virtual HX_RESULT        get_int_ref_val(INT32* v) const;
  97.     virtual INT32     get_int_ref_val() const;
  98.     virtual HX_RESULT     get_db_val(DB_implem** v) const;
  99.     virtual const DB_implem*  get_db_val() const;
  100.     virtual void set_deleted(DB_implem* ldb, DB_node* d,
  101.             UINT32 h);
  102.     virtual BOOL is_deleted();
  103.     virtual void set_read_only(BOOL read_only);
  104.     virtual BOOL is_read_only();
  105.     virtual void SetStringAccessAsBufferById();
  106.     /*
  107.      * Make these public so that CommonRegistry can use them
  108.      */
  109.     DB_implem* _owner_db;
  110.     DB_node* _owner_node;
  111.     UINT32 _id;
  112.     BOOL     _alternate_string_access_ok;
  113.     HX_RESULT m_LastError;
  114. };
  115. inline
  116. Property::Property()
  117.          : _prop_name(0), _prop_type(PT_UNKNOWN), _prop_size(0),
  118.    _deleted(FALSE), _read_only(FALSE), _owner_db(0), 
  119.    _owner_node(0), _id(0), _alternate_string_access_ok(0), m_LastError(HXR_OK)
  120. {
  121.     _prop_val.t_int = 0x0000;
  122.     _prop_val.t_buf = 0;
  123.     m_pWatchList = new WatchList;
  124.     if(!m_pWatchList)
  125.     {
  126.         m_LastError = HXR_OUTOFMEMORY;
  127.     }
  128.     m_lWatchCount = 0;
  129. }
  130. inline
  131. Property::Property(Key* k, HXPropType t) 
  132.          : _prop_name(k), _prop_type(t), _prop_size(0), 
  133.    _deleted(FALSE), _read_only(FALSE), _owner_db(0), 
  134.    _owner_node(0), _id(0), m_LastError(HXR_OK)
  135. {
  136.     // XXX by default set the integer value to ZERO.
  137.     _prop_val.t_int = 0x0000;
  138.     _prop_val.t_buf = 0;
  139.     m_pWatchList = new WatchList;
  140.     if(!m_pWatchList)
  141.     {
  142.         m_LastError = HXR_OUTOFMEMORY;
  143.     }
  144.     m_lWatchCount = 0;
  145. }
  146. inline
  147. Property::Property(char* n, HXPropType t)
  148.          : _prop_name(new Key(n)), _prop_type(t), _prop_size(0),
  149.    _deleted(FALSE), _read_only(FALSE), _owner_db(0), 
  150.    _owner_node(0), _id(0), m_LastError(HXR_OK)
  151. {
  152.     // XXX by default set the integer value to ZERO.
  153.     _prop_val.t_int = 0x0000;
  154.     _prop_val.t_buf = 0;
  155.     m_pWatchList = new WatchList;
  156.     if(!m_pWatchList)
  157.     {
  158.         m_LastError = HXR_OUTOFMEMORY;
  159.     }
  160.     m_lWatchCount = 0;
  161. }
  162. inline
  163. Property::~Property()
  164. {
  165.     for (WatchList_iterator wli(m_pWatchList); *wli != 0; ++wli)
  166.     {
  167. WListElem* wle = *wli;
  168. PropWatch* pw = (PropWatch *)wle->data;
  169. delete pw;
  170. m_pWatchList->removeElem(wle);
  171. delete wle;
  172. m_lWatchCount--;
  173.     }
  174.     delete m_pWatchList;
  175.     delete _prop_name;
  176.     switch (_prop_type)
  177.     {
  178. case PT_COMPOSITE:
  179.     delete _prop_val.t_imp;
  180.     break;
  181. case PT_STRING:
  182.     if (_prop_val.t_buf)
  183. _prop_val.t_buf->Release();
  184.     break;
  185. case PT_BUFFER:
  186.     if (_prop_val.t_buf)
  187. _prop_val.t_buf->Release();
  188.     break;
  189. default:
  190.     break;
  191.     }
  192. }
  193. inline HX_RESULT
  194. Property::type(const HXPropType t)
  195. {
  196.     _prop_type = t;
  197.     return HXR_OK;
  198. }
  199. inline HX_RESULT
  200. Property::int_val(const INT32 v)
  201. {
  202.     if (_read_only)
  203.     {
  204. return HXR_FAIL;
  205.     }
  206.     else if (_prop_type != PT_INTEGER)
  207.     {
  208. _prop_val.t_int = 0;
  209. return HXR_FAIL;
  210.     }
  211.     else
  212.     {
  213. _prop_val.t_int = v;
  214. return HXR_OK;
  215.     }
  216. }
  217. inline HX_RESULT
  218. Property::int_ref_val(INT32* v)
  219. {
  220.     if (_read_only)
  221.     {
  222. return HXR_FAIL;
  223.     }
  224.     else if (_prop_type != PT_INTREF)
  225.     {
  226. _prop_val.t_iref = 0;
  227. return HXR_FAIL;
  228.     }
  229.     else
  230.     {
  231. _prop_val.t_iref = v;
  232. return HXR_OK;
  233.     }
  234. }
  235. inline HX_RESULT
  236. Property::buf_val(IHXBuffer* v, HXPropType t)
  237. {
  238.     HX_RESULT theErr = HXR_OK;
  239.     if (_read_only)
  240.     {
  241. return HXR_FAIL;
  242.     }
  243.     else if (_prop_type != t)
  244.     {
  245. theErr = HXR_FAIL;
  246. goto cleanup;
  247.     }
  248.   
  249.     if (_prop_val.t_buf)
  250.     {
  251. _prop_val.t_buf->Release();
  252. _prop_val.t_buf = 0;
  253.     }
  254.     if (!v)
  255.     {
  256. theErr = HXR_OK;
  257. goto cleanup;
  258.     }
  259.     _prop_val.t_buf = v;
  260.     v->AddRef();
  261. cleanup:
  262.     return theErr;
  263. }
  264. inline const Key*
  265. Property::get_key_obj() const
  266. {
  267.     return _prop_name;
  268. }
  269. inline const char*
  270. Property::get_key_str() const
  271. {
  272.     return _prop_name->get_key_str();
  273. }
  274. inline int
  275. Property::get_key_str_len() const
  276. {
  277.     return _prop_name->size();
  278. }
  279. inline void
  280. Property::get_type(HXPropType* t) const
  281. {
  282.     *t = _prop_type;
  283. }
  284. inline HXPropType
  285. Property::get_type() const
  286. {
  287.     return _prop_type;
  288. }
  289. inline HX_RESULT
  290. Property::get_buf_val(IHXBuffer** v, HXPropType t) const
  291. {
  292.     HX_RESULT theErr = HXR_OK;
  293.     *v = 0;
  294.     if (_prop_type != t)
  295.     {
  296. theErr = HXR_FAIL;
  297. goto cleanup;
  298.     }
  299.    
  300.     if (!_prop_val.t_buf)
  301.     {
  302. theErr = HXR_FAIL;
  303. goto cleanup;
  304.     }
  305.     _prop_val.t_buf->AddRef();
  306.     *v = _prop_val.t_buf;
  307. cleanup:
  308.     return theErr;
  309. }
  310. inline HX_RESULT
  311. Property::get_int_val(INT32* v) const
  312. {
  313.     if (_prop_type != PT_INTEGER)
  314.     {
  315. *v = 0;
  316. return HXR_FAIL;
  317.     }
  318.     else
  319.     {
  320. *v = _prop_val.t_int;
  321. return HXR_OK;
  322.     }
  323. }
  324. inline HX_RESULT
  325. Property::get_int_ref_val(INT32* v) const
  326. {
  327.     if (_prop_type != PT_INTREF)
  328.     {
  329. *v = 0;
  330. return HXR_FAIL;
  331.     }
  332.     else
  333.     {
  334. *v = *_prop_val.t_iref;
  335. return HXR_OK;
  336.     }
  337. }
  338. inline HX_RESULT
  339. Property::get_db_val(DB_implem** v) const
  340. {
  341.     if (_prop_type != PT_COMPOSITE)
  342.     {
  343. *v = 0;
  344. return HXR_FAIL;
  345.     }
  346.     else
  347.     {
  348. *v = _prop_val.t_imp;
  349. return HXR_OK;
  350.     }
  351. }
  352. inline INT32
  353. Property::get_int_val() const
  354. {
  355.     if (_prop_type != PT_INTEGER)
  356. return 0;
  357.     else
  358. return _prop_val.t_int;
  359. }
  360. inline const IHXBuffer*
  361. Property::get_buf_val(HXPropType t) const
  362. {
  363.     if (_prop_type != t)
  364. return 0;
  365.     
  366.     if (!_prop_val.t_buf)
  367. return 0;
  368.     _prop_val.t_buf->AddRef();
  369.     return _prop_val.t_buf;
  370. }
  371. inline INT32
  372. Property::get_int_ref_val() const
  373. {
  374.     if (_prop_type != PT_INTREF)
  375. return 0;
  376.     else
  377.     {
  378. return *_prop_val.t_iref;
  379.     }
  380. }
  381. inline const DB_implem*
  382. Property::get_db_val() const
  383. {
  384.     if (_prop_type != PT_COMPOSITE)
  385. return 0;
  386.     else
  387. return _prop_val.t_imp;
  388. }
  389. inline void
  390. Property::set_deleted(DB_implem* ldb, DB_node* d, UINT32 h)
  391. {
  392.     _owner_db = ldb;
  393.     _owner_node = d;
  394.     _id = h;
  395.     _deleted = TRUE;
  396. }
  397. inline BOOL
  398. Property::is_deleted()
  399. {
  400.     return _deleted;
  401. }
  402. inline void
  403. Property::set_read_only(BOOL read_only)
  404. {
  405.     _read_only = read_only;
  406. }
  407. inline BOOL
  408. Property::is_read_only()
  409. {
  410.     return _read_only;
  411. }
  412. inline void
  413. Property::SetStringAccessAsBufferById()
  414. {
  415.     _alternate_string_access_ok = TRUE;
  416. }
  417. #endif // _PROPERTY_H