30 #ifndef INC_CINOSCONTAINER_H
31 #define INC_CINOSCONTAINER_H
39 #define ER_INOS_CONTAINER_OK 0x00000000 // command ok
40 #define ER_INOS_CONTAINER_REJECTED 0x00000001 // command rejected
41 #define ER_INOS_CONTAINER_FAILED 0x00000002 // command failed
42 #define ER_INOS_CONTAINER_TYPE_UNKNOWN 0x00000003 // command type unknown
43 #define ER_INOS_CONTAINER_CHECK_FAILED 0x00000004 // command check failed
52 #include <cinoseventlogger.h>
113 CINOSContainer(
const char* apName,
const char* apElementBases,
void* apParent);
121 void SetBase(
const char* apElementBases);
128 uint32
Create(
const char* apName);
130 uint32
Create(
const char* apName,
const char* apType);
132 uint32
Create(
const char* apName,
const char* apType,
const char* apParam);
134 uint32
Destroy(
const char* apName);
137 uint32
Check(
const char* apType,
const char* apParam);
140 virtual void Add(T* apEntity);
142 virtual void Remove(T* apEntity,
bool abDelete=
true);
145 virtual T*
Find(
const char* apName);
147 virtual T*
GetAt(uint32 auIndex);
151 typedef int(*tForEach)(T&,
void *);
152 virtual void ForEach( tForEach cond,
void *args );
153 template <
typename F>
154 void ForEach( F cond );
210 typedef void* (*TCreateEntity)(
const char* apName,
const char* apParam);
211 typedef bool (*TCheckCheckTarget)(
const char* apParam);
223 friend class CINOSHwTarget;
232 TCreateEntity m_pCreate;
234 TCheckCheckTarget m_pCheck;
245 const char* apType,
const char* apBase, TCheckCheckTarget apCheck=0);
247 static void* GetInstance(
const char* apName,
const char* apType,
248 const char* apParam,
const char* apAllowedBases = NULL);
250 static uint32 Check(
const char* apType,
const char* apParam,
const char* apAllowedBases = NULL);
263 : CINCOObject(&m_cName[0], apData, 0, defCharObjectOwnBitmap),
264 m_bIsFolder(abIsFolder)
267 inos_strncpy(m_cName, apName,
sizeof(m_cName));
271 virtual bool IsContainerFolder()
override {
return m_bIsFolder; };
280 const char* apElementBases)
301 const char* apElementBases,
void* apParent)
326 T* entity = m_pEntities->GetAt(0);
328 Destroy(entity->GetName());
329 entity = m_pEntities->GetAt(0);
343 m_pParent = apParent;
349 inos_strncpy(m_cBase, apElementBases,
sizeof(m_cBase));
355 ASSERT_ALWAYS(m_pEntity &&
"INCOObject not created. Did you forget to call GetRegister?");
356 CINCOObject* obj = m_pEntity;
357 char* name = (
char *) apEntity->GetName();
360 char* p = strchr(name,
'.');
367 CINCOItem* tmp = obj->Find(name);
368 if (tmp && (tmp->GetType() == defType_Object)){
370 obj = (CINCOObject*) tmp;
375 obj->Add(o, m_iOrder++);
383 ASSERT_ALWAYS(obj->Find(name) == NULL &&
"It is not allowed to add a container element with a name that is already used as parent of another container element.")
387 obj->Add(o, m_iOrder++);
388 apEntity->GetRegister(o);
391 m_pEntities->Add(apEntity);
402 inos_strncpy(cName, apEntity->GetName(),
sizeof(cName));
403 char* p = strrchr(cName,
'.');
409 CINCOObject* obj = (CINCOObject *) m_pEntity->Find(cName);
411 CINCOObject* sub = (CINCOObject *) obj->Find(++p);
412 bool bDelete = sub && sub->IsContainerFolder()
413 && sub->GetBinaryTree()->GetItemsInContainer() == 0;
415 obj->Remove(p, bDelete);
417 if (obj->GetBinaryTree()->mItemsInContainer){
423 p = strrchr(cName,
'.');
426 m_pEntity->Remove(cName);
440 m_pEntity->Remove((
char *) apEntity->GetName(),
false);
444 m_pEntities->Remove(apEntity, abDelete);
450 return m_pEntities->Find(apName);
456 return m_pEntities->GetAt(auIndex);
462 return (uint32)m_pEntities->GetItemsInContainer();
467 m_pEntities->ForEach(cond, args);
472 m_pEntities->ForEach(cond);
478 m_pHookObj = apObject;
479 m_pHookMtd = apMethod;
485 return Create(apName, m_cBase);
494 return Create(apName, apType, 0);
500 const char* apType,
const char* apParam)
503 if (!apName || !*apName){
505 return ER_INOS_CONTAINER_FAILED;
510 if (apParam && strstr(apParam,
"NoD")){
515 T* ent = m_pEntities->Find(apName);
531 ent = (T*) CINOSContainerEntityRegister::GetInstance(apName, apType,
538 ent->PostCreate(m_pParent);
540 if (m_pHookObj && m_pHookMtd){
542 INOSCallClassMember(m_pHookObj, m_pHookMtd, (uintptr) ent);
549 return ER_INOS_CONTAINER_FAILED;
558 if (!apName || !*apName){
560 return ER_INOS_CONTAINER_FAILED;
564 T* ent = m_pEntities->Find(apName);
567 bool bDeleteSelf =
false;
568 if (!ent->PreDestroy(bDeleteSelf)){
570 return ER_INOS_CONTAINER_REJECTED;
573 Remove(ent, !bDeleteSelf);
578 uint32 l = (uint32)strlen(apName);
583 T* ent = m_pEntities->GetAt(i);
585 if (strncmp(apName, ent->GetName(), l)==0){
588 bool bDeleteSelf =
false;
589 if (!ent->PreDestroy(bDeleteSelf)){
591 return ER_INOS_CONTAINER_REJECTED;
594 Remove(ent, !bDeleteSelf);
613 return ER_INOS_CONTAINER_FAILED;
627 return CINOSContainerEntityRegister::Check(apType, apParam, m_cBase);
643 m_pRegister =
new CINCOObject((
char*) &m_cName[0],
this, 0, defCharObjectOwnBitmap);
644 m_pRegister->Add(
new CINCOuint32((
char*) &m_cName[0], &m_pEntities->mItemsInContainer,
645 0,0,
"", defCharShowDec | defCharReadOnly));
649 m_pEntity =
new CINCOObject(
"Entity", 0);
650 m_pRegister->Add(m_pEntity);
652 m_pCmd =
new CINCOObject(
"Cmd", 0);
653 m_pRegister->Add(m_pCmd);
656 CINCOObject* cmdCreate =
new CINCOObject(
"Create", 0);
657 cmdCreate->Add(
new CINCOProcedure(REG_TYP_CLS_FCT_NAME_OVLD(Create,
659 cmdCreate->Add(
new CINCOstring(
"Name", m_ceName,
sizeof(m_ceName)), 0);
660 m_pCmd->Add(cmdCreate);
662 cmdCreate =
new CINCOObject(
"Create", 0);
663 cmdCreate->Add(
new CINCOProcedure(REG_TYP_CLS_FCT_NAME_OVLD(Create,
665 cmdCreate->Add(
new CINCOstring(
"Name", m_ceName,
sizeof(m_ceName)), 0);
666 cmdCreate->Add(
new CINCOstring(
"Type", m_ceType,
sizeof(m_ceType)), 1);
667 m_pCmd->Add(cmdCreate);
669 cmdCreate =
new CINCOObject(
"Create", 0);
670 cmdCreate->Add(
new CINCOProcedure(REG_TYP_CLS_FCT_NAME_OVLD(Create,
671 CINOSContainer<T>,
this, uint32, Create,(
const char*,
const char*,
const char*))), 0);
672 cmdCreate->Add(
new CINCOstring(
"Name", m_ceName,
sizeof(m_ceName)), 0);
673 cmdCreate->Add(
new CINCOstring(
"Type", m_ceType,
sizeof(m_ceType)), 1);
674 cmdCreate->Add(
new CINCOstring(
"Param", m_ceParam,
sizeof(m_ceParam)), 2);
675 m_pCmd->Add(cmdCreate);
678 CINCOObject* cmdDestroy =
new CINCOObject(
"Destroy", 0);
679 m_pCmd->Add(cmdDestroy);
680 cmdDestroy->Add(
new CINCOProcedure(REG_TYP_CLS_FCT_NAME_OVLD(Destroy,
682 cmdDestroy->Add(
new CINCOstring(
"Name", m_ceName,
sizeof(m_ceName)), 0);
685 m_pProp=
new CINCOObject(
"Prop", 0);
686 m_pRegister->Add(m_pProp);
687 m_pProp->Add(
new CINCOstring(
"Base", m_cBase,
sizeof(m_cBase)), 0);
692 m_pEntity = m_pRegister;
720 #define INOS_CONTAINER_CLASS(aClass,aType,aBase) \
721 void* Create##aClass(const char* apName, const char* apParam) \
722 { return new aClass(apName, apParam);}; \
723 static CINOSContainerEntityRegister l_##aClass##Create(Create##aClass, aType, aBase);
724 #define INOS_CONTAINER_CLASS_CHECK(aClass,aType,aBase) \
725 void* Create##aClass(const char* apName, const char* apParam) \
726 { return new aClass(apName, apParam);}; \
727 static CINOSContainerEntityRegister l_##aClass##Create(Create##aClass, aType, aBase, &aClass::CheckTarget);
737 #define INOS_CONTAINER_CLASS_MI(aClass,aBaseClass,aType,aBase) \
738 template <typename T> \
739 void* Create##aClass(const char* apName, const char* apParam) \
741 { return static_cast<T*>(new aClass(apName, apParam));}; \
742 static CINOSContainerEntityRegister l_##aClass##Create(Create##aClass<aBaseClass>, aType, aBase);
748 #endif // INC_CINOSCONTAINER_H