Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cXObject.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cXObject_H
7 #define _INC_cXObject_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 #include "IXObject.h"
12 #include "../Scriptable/cScriptableObj.h"
13 #include "../Variant/cVarMap.h"
14 
15 #include "GrayCore/include/cHeap.h"
20 #include "GrayCore/include/IUnknown.h" // __IUnknown_INTERFACE_DEFINED__
21 
22 #ifdef _MSC_VER
23 #pragma warning(disable:4250) // disable "'GrayLib::cXObject': inherits 'Gray::cScriptableObj::Gray::cScriptableObj::s_GetByName' via dominance"
24 #endif
25 
26 namespace GrayLib
27 {
29 
31  typedef cScriptableProp cScriptableMethod; // Methods are really similar to Props.
33  class GRAYLIB_LINK cXObject;
34  class GRAYLIB_LINK cXObjDef;
35 
36 #define XOBJ_ROOT "Root" // There is usually a SymName object called "Root" cUID::k_ROOT
37 
38  // cXObjTypeDef
39 #ifdef _MSC_VER
40  enum XOBJTIDX_TYPE;
41 #else // __GNUC__
42  typedef int XOBJTIDX_TYPE;
43 #endif
44  const int k_XOBJTIDX_QTY = 128;
45 
46  typedef int XOBJ_WEIRD_t; // Object validation.
47  inline XOBJ_WEIRD_t XOBJ_WEIRD_CODE(int _Interface, int _CantFix, int _UniqueTestCode)
48  {
51  return ((((int)(_Interface)) << 12) | (((int)(_CantFix) << 8)) | ((int)(_UniqueTestCode)));
52  }
53 
55  {
58 
61 
65 
70  };
71 
73  : public cScriptableObj // also IScriptableObj
74  , public IXObject // also virtual IScriptableObj
75  , public cThreadLockableRef // assume also cRefBase
76  , public CObject // MFC compatible.
77  , public cHeapObject // always heap allocated
78  {
96 
97  typedef cScriptableObj SUPER_t;
98 
99  public:
101 
102  enum P_TYPE_
103  {
104 #define cXObjectProp(a,b,c,d) P_##a,
105 #include "cXObjectProps.tbl"
106 #undef cXObjectProp
108  };
109  static cScriptableProp sm_Props[P_QTY + 1];
110 
112  enum M_TYPE_
113  {
114 #define cXObjectMethod(a,b,c,d) M_##a,
115 #include "cXObjectMethods.tbl"
116 #undef cXObjectMethod
118  };
119  static cScriptableMethod sm_Methods[M_QTY + 1];
120 
121  // Can be used to override XObjDef m_pBaseDef props
123 
125 
126  protected:
129 
130  private:
131  UID_t m_nUID;
132  XObjState_TYPE m_eObjState;
133  cTimeInt m_timeSaved;
134 
135  public:
136  explicit cXObject(UID_t nUID = cUID::k_CLEAR, cXObjDef* pBaseDef = nullptr);
137  virtual ~cXObject();
138  virtual bool isValidCheck() const noexcept override;
139 
140  STDMETHOD_(XOBJTID_t, get_XObjTypeId)() const
141  {
145  return k_XOBJTID_DEFAULT;
146  }
147  const ATOMCHAR_t* get_XObjTypeName() const;
148 
149  virtual int get_BaseRefCount() const
150  {
154  return 0;
155  }
156 
157  //***********************************
158  // Identify it by UID
159  bool isValidUID() const noexcept
160  {
162  if (!cMem::IsValidApp(this))
163  return false;
164  return m_nUID != cUID::k_CLEAR ;
165  }
166 
167  UID_t get_UIDValue() const noexcept
168  {
169  return m_nUID;
170  }
171  UID_t get_HashCode() const noexcept
172  {
174  return m_nUID;
175  }
176  STDMETHOD_(HASHCODE_t, get_HashCodeX)() const noexcept override
177  {
179  return m_nUID;
180  }
181 
182  void put_UIDValuePrivate(UID_t dwIndex);
183  STDMETHOD_(void, put_UIDValue)(UID_t dwIndex);
184 
185  //***********************************
186  STDMETHOD_(cString, get_Name)() const override;
187  STDMETHOD(put_Name)(cString sName)
188  {
191  if (!sName.Compare(get_Name())) // always allowed to set to what it already is.
192  return S_OK;
193  return HRESULT_WIN32_C(ERROR_WRITE_FAULT);
194  }
195  STDMETHOD_(cString, get_NameDeco)() const
196  {
198  return get_Name();
199  }
200 
201  //***********************************
202  STDMETHOD_(cStringA, get_SymName)() const override;
203  STDMETHOD(put_SymName)(cAtomRef aSymName, bool bOverwrite = false);
204  HRESULT put_SymName2(cAtomRef aSymName);
205 
206  //***********************************
208  {
210  return(m_pBaseDef);
211  }
212  virtual bool put_BaseDef(cXObjDef* pDef)
213  {
215  m_pBaseDef = pDef;
216  return true;
217  }
218  STDMETHOD_(cAtomRef, get_BaseSymNameA)() const;
219 
220  //***********************************
222  {
224  return nullptr;
225  }
226  virtual cVariant get_ContainerVar() const;
227  STDMETHOD(put_ContainerVar)(const cVariant& vVal)
228  {
232  return E_NOTIMPL; // not supported i guess.
233  }
234  bool isMyContainer(const cXObject* pObjParent) const;
235 
236  //*******************************
237  // XObjState_TYPE = init, loading, deleted, bad,
238  void InitObjState(); // static objects can be re-used.
239  XObjState_TYPE get_ObjState() const noexcept
240  {
241  return m_eObjState;
242  }
243  bool put_ObjState(XObjState_TYPE eObjState);
244 
245  bool isObjStateLoading() const noexcept
246  {
248  return m_eObjState <= XObjState_Loading ;
249  }
250  bool isObjStateLoading1() const noexcept
251  {
253  return m_eObjState <= XObjState_Loading || m_eObjState == XObjState_Loaded1 ;
254  }
255  bool isObjStateLoaded() const noexcept
256  {
258  return m_eObjState >= XObjState_Loaded ;
259  }
260  bool isObjStateModified() const noexcept
261  {
262  return m_eObjState == XObjState_Modified ;
263  }
264  bool isObjStateDisposed() const noexcept;
265  bool isObjStateBad() const noexcept;
266 
267  STDMETHOD(SetObjStateLoaded)();
268  void SetObjStateBad();
269  void SetObjStateModified();
270  void ClearObjStateModified();
271 
272  const cTimeInt& get_TimeSaved() const noexcept
273  {
275  return m_timeSaved;
276  }
277  void put_TimeSaved(cTimeInt timeSaved)
278  {
280  m_timeSaved = timeSaved;
281  }
282  void UpdateTimeSaved();
283 
284  //************************************************
286  virtual cVarTuplePtr FindTagA(cAtomRef aTagName) const;
287  cVarTuplePtr FindTag(const ATOMCHAR_t* pszTagName) const;
288  void s_WritePropsTags(IScriptableSetter& Update);
289 
290  //***********************************
293  STDMETHOD(s_PropPut)(const cScriptableProp* pProp, const cVariant& vVal) override;
294  STDMETHOD(s_PropGet)(const cScriptableProp* pProp, OUT cVariant& vValRet) override;
295  STDMETHOD(s_Invoke)(const cScriptableMethod* pMethod, const cVariant& vArgs, OUT cVariant& vValRet) override;
296  STDMETHOD(s_GetByName)(const ATOMCHAR_t* pszPropName, OUT cVariant& rvValRet) override;
297  // s_Put // put to m_TagMap
298 
299  STDMETHOD(s_TagPut)(const ATOMCHAR_t* pszTagName, const cVariant& vValSet);
300  STDMETHOD(s_TagGet)(const ATOMCHAR_t* pszTagName, OUT cVariant& vValRet);
301  STDMETHOD(s_LoadProps)(IScriptableEnumerator& rProps);
302 
303  STDMETHOD(s_EventSinkAdd)(cXObjDef* pXObjDef, bool bRemove = false)
304  {
306  UNREFERENCED_PARAMETER(pXObjDef);
307  UNREFERENCED_PARAMETER(bRemove);
308  return HRESULT_WIN32_C(ERROR_NOT_SUPPORTED);
309  }
310 
311 
312  //*******************************
314  cStringA s_PropGetDumpStr(const cScriptableProp* pProp, XOBJ_DUMP_MASK_t uFlags = 0);
315  HRESULT s_DumpKeys(cStreamOutput& rout, XOBJ_DUMP_MASK_t uFlags, const cScriptableProp* const* ppProps, ITERATE_t iQty);
316  HRESULT s_DumpHelp(cStreamOutput& rout, const cVariant& vArgs);
317 
319  virtual HRESULT DisposeThis();
320  virtual XOBJ_WEIRD_t IsWeird() const;
321  virtual XOBJ_WEIRD_t FixWeird();
322  virtual size_t GetHeapStats(OUT ITERATE_t& iAllocCount) const;
323 
326 
328  STDMETHOD(QueryInterface)( /* [in] */ const IID& riid, /* [iid_is][out] */ void** ppvObject) override;
329  };
330 
332 };
333 #endif // _INC_cXObject_H
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define HRESULT_WIN32_C(x)
a constant LSTATUS/error_status_t with no check, unlike HRESULT_FROM_WIN32()
Definition: HResult.h:79
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
#define UNREFERENCED_REFERENCE(x)
Definition: SysTypes.h:318
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define CSCRIPT_CLASS_DEF0(TYPE)
Definition: cScriptableInterface.h:271
Definition: cScriptContext.h:24
Definition: cScriptableObj.h:26
Definition: cScriptableInterface.h:97
static const UID_t k_CLEAR
Hard coded UID_t values.
Definition: cUID.h:32
Definition: cVarMap.h:109
Definition: cVariant.h:26
Definition: cXObjDef.h:17
Definition: cXObject.h:78
bool isObjStateLoaded() const noexcept
Definition: cXObject.h:255
CHEAPOBJECT_IMPL
Definition: cXObject.h:127
cVarMap m_TagMap
attach extra tags here. (e.g. properties that don't apply to all instances. ASSUME NO OVERLAP with de...
Definition: cXObject.h:122
cXObjDef * get_BaseDef() const
Definition: cXObject.h:207
STDMETHOD_(void, put_UIDValue)(UID_t dwIndex)
UID_t get_UIDValue() const noexcept
Definition: cXObject.h:167
virtual bool put_BaseDef(cXObjDef *pDef)
Definition: cXObject.h:212
IUNKNOWN_DISAMBIG_R(cThreadLockableRef)
STDMETHOD_(cString, get_Name)() const override
UID_t get_HashCode() const noexcept
Definition: cXObject.h:171
XObjState_TYPE get_ObjState() const noexcept
Definition: cXObject.h:239
STDMETHOD_(cString, get_NameDeco)() const
Definition: cXObject.h:195
STDMETHOD_(cStringA, get_SymName)() const override
bool isValidUID() const noexcept
Definition: cXObject.h:159
bool isObjStateLoading() const noexcept
Definition: cXObject.h:245
static ITERATE_t sm_iLoadingCount
are we loading ? LoadXObject() reentrant ?
Definition: cXObject.h:124
STDMETHOD_(cAtomRef, get_BaseSymNameA)() const
shortcut for symbolic name for get_BaseDef()
void put_TimeSaved(cTimeInt timeSaved)
Definition: cXObject.h:277
bool isObjStateLoading1() const noexcept
Definition: cXObject.h:250
cRefPtr< cXObjDef > m_pBaseDef
This XObject is based on a template of other XObject/XObjDef. overloads it's props via m_TagMap.
Definition: cXObject.h:128
M_TYPE_
base methods that all objects have.
Definition: cXObject.h:113
@ M_QTY
Definition: cXObject.h:117
virtual int get_BaseRefCount() const
Definition: cXObject.h:149
bool isObjStateModified() const noexcept
Definition: cXObject.h:260
virtual cRefPtr< cXObject > get_ContainerObject() const
Definition: cXObject.h:221
STDMETHOD_(HASHCODE_t, get_HashCodeX)() const noexcept override
Definition: cXObject.h:176
P_TYPE_
Definition: cXObject.h:103
@ P_QTY
Definition: cXObject.h:107
Definition: cObject.h:67
Definition: cAtom.h:63
Definition: cHeapObject.h:38
Definition: cStream.h:126
Definition: cThreadLockRef.h:20
< similar to the MFC CTime and cTimeSpan, not as accurate or large ranged as COleDateTime
Definition: cTimeInt.h:101
Definition: IScriptableObj.h:38
Definition: IScriptableObj.h:62
Definition: IXObject.h:46
Definition: cMesh.h:22
cScriptableProp cScriptableMethod
Methods are really similar to Props.
Definition: cScriptableInterface.h:253
FOURCC XOBJTID_t
a unique FOURCC id for a type of XObject, 0=k_XOBJTID_NULL, MAKEFOURCC(a,b,c,d). Equiv to GUID for IU...
Definition: IXObject.h:42
const int k_XOBJTIDX_QTY
max cXObjTypeDef. NOT USED.
Definition: cXObject.h:44
cRefPtr< cXObject > cXObjectPtr
Definition: cXObject.h:331
UNITTEST2_PREDEF(cQuadtree)
XObjState_TYPE
Definition: cXObject.h:55
@ XObjState_Disposed
2=in the process of being deleted. DisposeThis has been completed.
Definition: cXObject.h:62
@ XObjState_Loaded1
6=Temporary state for checking the first load.
Definition: cXObject.h:67
@ XObjState_Modified
7=has been changed from its loaded state. Needs to be persisted/flushed out to database/file.
Definition: cXObject.h:68
@ XObjState_Loading
1=Loading params. created from program, script, import table or database, etc
Definition: cXObject.h:60
@ XObjState_Init
0=just initialize. No values loaded yet.
Definition: cXObject.h:59
@ XObjState_QTY
Definition: cXObject.h:69
@ XObjState_Disposing
3=in the process of cleaning up. DisposeThis has been called.
Definition: cXObject.h:63
@ XObjState_Bad
4=Def or file that could not be loaded. call DisposeThis later some time. Its in a not valid state.
Definition: cXObject.h:64
@ XObjState_Loaded
5=loaded OK.
Definition: cXObject.h:66
class __DECL_IMPORT cXObject
Definition: cXObject.h:33
XOBJ_WEIRD_t XOBJ_WEIRD_CODE(int _Interface, int _CantFix, int _UniqueTestCode)
Definition: cXObject.h:47
int XOBJ_WEIRD_t
Definition: cXObject.h:46
int XOBJTIDX_TYPE
enumerated cXObjTypeDef
Definition: cXObject.h:42
UINT XOBJ_DUMP_MASK_t
enum XOBJ_DUMP_MASK_
Definition: cScriptableInterface.h:51
const XOBJTID_t k_XOBJTID_DEFAULT
a default XObject created for scripting.
Definition: IXObject.h:44
HASHCODE32_t UID_t
Sort of the same as a HASHCODE_t. not the same as UIDINDEX_t.
Definition: cUID.h:18
int ITERATE_t
like size_t but signed
Definition: Index.h:28
UINT_PTR HASHCODE_t
could hold a pointer converted to a number? maybe 64 or 32 bit ? same as size_t.
Definition: GrayCore.h:116
char ATOMCHAR_t
the char form (UNICODE or not) for an atom. (for symbolic names)
Definition: StrConst.h:15
static bool IsValidApp(const void *pData) noexcept
Definition: cMem.h:42
Definition: IUnknown.h:34