00001 00002 /* 00003 ***************************************************************************** 00004 * * 00005 * IMPINJ CONFIDENTIAL AND PROPRIETARY * 00006 * * 00007 * This source code is the sole property of Impinj, Inc. Reproduction or * 00008 * utilization of this source code in whole or in part is forbidden without * 00009 * the prior written consent of Impinj, Inc. * 00010 * * 00011 * (c) Copyright Impinj, Inc. 2007,2008. All rights reserved. * 00012 * * 00013 *****************************************************************************/ 00014 00015 00016 #include "ltkcpp_platform.h" 00017 #include "ltkcpp_base.h" 00018 00019 00020 namespace LLRP 00021 { 00022 00023 CElement::CElement(void) 00024 { 00025 m_pType = NULL; 00026 m_pParent = NULL; 00027 } 00028 00029 CElement::~CElement (void) 00030 { 00031 00032 for ( 00033 tListOfParameters::iterator elem = m_listAllSubParameters.begin(); 00034 elem != m_listAllSubParameters.end(); 00035 elem++) 00036 { 00037 delete *elem; 00038 } 00039 } 00040 00041 00042 void 00043 CElement::addSubParameterToAllList ( 00044 CParameter * pParameter) 00045 { 00046 if(NULL != pParameter) 00047 { 00048 m_listAllSubParameters.push_back(pParameter); 00049 } 00050 } 00051 00052 00053 void 00054 CElement::removeSubParameterFromAllList ( 00055 CParameter * pParameter) 00056 { 00057 if(NULL != pParameter) 00058 { 00059 m_listAllSubParameters.remove(pParameter); 00060 } 00061 } 00062 00063 void 00064 CElement::clearSubParameterList ( 00065 tListOfParameters * pParameterList) 00066 { 00067 for( 00068 tListOfParameters::iterator elem = pParameterList->begin(); 00069 elem != pParameterList->end(); 00070 elem++) 00071 { 00072 removeSubParameterFromAllList(*elem); 00073 delete *elem; 00074 } 00075 00076 pParameterList->clear(); 00077 } 00078 00079 int 00080 CElement::walk ( 00081 int (*pFunc)( 00082 const CElement * pElement, 00083 void * pArg), 00084 void * pArg, 00085 int iDepth, 00086 int nMaxDepth) const 00087 { 00088 int rc; 00089 00090 rc = (*pFunc)(this, pArg); 00091 if(0 != rc) 00092 { 00093 return rc; 00094 } 00095 00096 if(iDepth >= nMaxDepth) 00097 { 00098 return 0; 00099 } 00100 00101 for ( 00102 tListOfParameters::const_iterator elem = 00103 m_listAllSubParameters.begin(); 00104 elem != m_listAllSubParameters.end(); 00105 elem++) 00106 { 00107 (*elem)->walk(pFunc, pArg, iDepth+1, nMaxDepth); 00108 } 00109 00110 return 0; 00111 } 00112 00113 CMessage::CMessage(void) 00114 { 00115 m_MessageID = 0; 00116 } 00117 00118 00119 llrp_bool_t 00120 CParameter::isAllowedIn ( 00121 const CTypeDescriptor * pEnclosingTypeDescriptor) const 00122 { 00123 return FALSE; 00124 } 00125 00126 llrp_bool_t 00127 CParameter::isAllowedExtension ( 00128 const CTypeDescriptor * pEnclosingTypeDescriptor) 00129 { 00130 /* 00131 * If it is a generic Custom parameter allow it. 00132 */ 00133 if(!m_pType->m_bIsMessage && NULL == m_pType->m_pVendorDescriptor && 00134 1023u == m_pType->m_TypeNum) 00135 { 00136 return TRUE; 00137 } 00138 00139 /* 00140 * At this point checking specifically if it is allowed 00141 * is perfunctory. 00142 */ 00143 return isAllowedIn(pEnclosingTypeDescriptor); 00144 } 00145 00146 00147 }; /* namespace LLRP */