123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- #include "restvar.h"
- /////////////////////////////////////////////////////////////////////////////
- CRestVariable::CRestVariable(void *pData, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, CRest *pParent)
- : m_name(pszName), m_pszPath(NULL), m_nIndex(nIndex), m_vt(VT_Invalid), m_data({NULL}), m_pParent(pParent), m_nCbVarpath(0)
- {
- if(!pData || !hShm)
- {
- ASSERT(false);
- return;
- }
- m_data.pVoid = pData;
- m_hShm = hShm;
- if(rti == typeid(bool))
- {
- m_vt = VT_bool;
- }
- else if(rti == typeid(char))
- {
- #ifdef __CHAR_UNSIGNED__
- m_vt = VT_UI1;
- #else
- m_vt = VT_I1;
- #endif
- }
- else if(rti == typeid(signed char))
- {
- m_vt = VT_I1;
- }
- else if(rti == typeid(unsigned char))
- {
- m_vt = VT_UI1;
- }
- else if(rti == typeid(short))
- {
- m_vt = VT_I2;
- }
- else if(rti == typeid(unsigned short))
- {
- m_vt = VT_UI2;
- }
- else if(rti == typeid(int))
- {
- m_vt = VT_I4;
- }
- else if(rti == typeid(unsigned int))
- {
- m_vt = VT_UI4;
- }
- else if(rti == typeid(long))
- {
- if(sizeof(long) == sizeof(long long))
- {
- m_vt = VT_I8;
- }
- else
- {
- m_vt = VT_I4;
- }
- }
- else if(rti == typeid(unsigned long))
- {
- if(sizeof(unsigned long) == sizeof(unsigned long long))
- {
- m_vt = VT_UI8;
- }
- else
- {
- m_vt = VT_UI4;
- }
- }
- else if(rti == typeid(long long))
- {
- m_vt = VT_I8;
- }
- else if(rti == typeid(unsigned long long))
- {
- m_vt = VT_UI8;
- }
- else if(rti == typeid(float))
- {
- m_vt = VT_float;
- }
- else if(rti == typeid(double))
- {
- m_vt = VT_double;
- }
- else
- {
- ASSERT(false);
- }
- }
- CRestVariable::~CRestVariable(void)
- {
- }
- /////////////////////////////////////////////////////////////////////////////
- void CRestVariable::CreateMembersTable(CRestVarTable &vt)
- {
- vt.AddVar(static_cast<CRest*>(this));
- }
- void CRestVariable::InitPath(CRest *pParent, const char *pszMemberName, int nIndex)
- {
- CRest::CreatePath(pParent, pszMemberName, nIndex, m_path);
- m_pszPath = m_path.c_str();
- m_nCbVarpath = m_path.length();
- }
- void CRestVariable::GetValue(int nReqIndex, json_t *pjtMap)
- {
- json_array_append_new(pjtMap, GetValue(nReqIndex));
- }
- json_t* CRestVariable::GetValue(int nReqIndex)
- {
- json_t *pjtVal = NULL;
- Lock();
-
- switch(m_vt)
- {
- case VT_bool:
- pjtVal = json_boolean(*m_data.pBool);
- break;
- case VT_I1:
- pjtVal = json_integer((json_int_t)*m_data.pI1);
- break;
- case VT_UI1:
- pjtVal = json_integer((json_int_t)*m_data.pUI1);
- break;
- case VT_I2:
- pjtVal = json_integer((json_int_t)*m_data.pI2);
- break;
- case VT_UI2:
- pjtVal = json_integer((json_int_t)*m_data.pUI2);
- break;
- case VT_I4:
- pjtVal = json_integer((json_int_t)*m_data.pI4);
- break;
- case VT_UI4:
- pjtVal = json_integer((json_int_t)*m_data.pUI4);
- break;
- case VT_I8:
- pjtVal = json_integer((json_int_t)*m_data.pI8);
- break;
- case VT_UI8:
- pjtVal = json_integer((json_int_t)*m_data.pUI8);
- break;
- case VT_float:
- pjtVal = json_real((double)*m_data.pFloat);
- break;
- case VT_double:
- pjtVal = json_real(*m_data.pDouble);
- break;
- default:
- ASSERT(false);
- break;
- }
- Unlock();
- if(pjtVal)
- return CreateValueObject(nReqIndex, m_pszPath, m_nIndex, json_typeof(pjtVal), m_name.c_str(), pjtVal);
- else
- return CreateStatusObject(nReqIndex, -1, "Unexpected Error!", m_pszPath);
- }
- json_t* CRestVariable::SetValue(int nReqIndex, json_t *pjtVal)
- {
- if(!pjtVal)
- return CreateStatusObject(nReqIndex, -1, "Unexpected error!", GetPath());
- json_int_t jInt;
- double jReal;
- int nCode = 0;
- const char *pszMsg = NULL;
- int nType = json_typeof(pjtVal);
-
- switch(nType)
- {
- case JSON_INTEGER:
- jInt = json_integer_value(pjtVal);
- switch(m_vt)
- {
- case VT_bool:
- Lock();
- *m_data.pBool = !!jInt;
- Unlock();
- break;
- case VT_I1:
- Lock();
- *m_data.pI1 = (signed char)jInt;
- Unlock();
- break;
- case VT_UI1:
- Lock();
- *m_data.pUI1 = (unsigned char)jInt;
- Unlock();
- break;
- case VT_I2:
- Lock();
- *m_data.pI2 = (signed short)jInt;
- Unlock();
- break;
- case VT_UI2:
- Lock();
- *m_data.pUI2 = (unsigned short)jInt;
- Unlock();
- break;
- case VT_I4:
- Lock();
- *m_data.pI4 = (signed int)jInt;
- Unlock();
- break;
- case VT_UI4:
- Lock();
- *m_data.pUI4 = (unsigned int)jInt;
- Unlock();
- break;
- case VT_I8:
- Lock();
- *m_data.pI8 = (signed long long)jInt;
- Unlock();
- break;
- case VT_UI8:
- Lock();
- *m_data.pUI8 = (unsigned long long)jInt;
- Unlock();
- break;
- case VT_float:
- Lock();
- *m_data.pFloat = (float)jInt;
- Unlock();
- break;
- case VT_double:
- Lock();
- *m_data.pDouble = (double)jInt;
- Unlock();
- break;
- default:
- nCode = 1;
- pszMsg = "Cannot assign JSON integer value! Variable is not an integer or real type!";
- break;
- }
- break;
- case JSON_REAL:
- jReal = json_real_value(pjtVal);
- switch(m_vt)
- {
- case VT_float:
- Lock();
- *m_data.pFloat = (float)jReal;
- Unlock();
- break;
- case VT_double:
- Lock();
- *m_data.pDouble = jReal;
- Unlock();
- break;
- default:
- nCode = 2;
- pszMsg = "Cannot assign JSON real value! Variable is not of type real!";
- break;
- }
- break;
- case JSON_TRUE:
- case JSON_FALSE:
- switch(m_vt)
- {
- case VT_bool:
- Lock();
- *m_data.pBool = (nType == JSON_TRUE);
- Unlock();
- break;
- default:
- nCode = 3;
- pszMsg = "Cannot assign JSON bool value! Variable is not of type bool!";
- break;
- }
- break;
- default:
- nCode = 4;
- pszMsg = "Cannot assign incompatible JSON type!";
- break;
- }
- return CreateStatusObject(nReqIndex, nCode, pszMsg, GetPath());
- }
- /////////////////////////////////////////////////////////////////////////////
- void CRestVariable::Lock(void)
- {
- ::GfaIpcLockSHM(m_hShm);
- }
- void CRestVariable::Unlock(void)
- {
- ::GfaIpcUnlockSHM(m_hShm);
- }
|