123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #include <precomp.h>
- #include "svc_collection.h"
- // an named xml overridable collection of objects
- #define CBCLASS svc_collectionI
- START_DISPATCH;
- CB(COLLECTION_TESTTAG, testTag);
- VCB(COLLECTION_ADDELEMENT, addElement);
- VCB(COLLECTION_REMOVEELEMENT, removeElement);
- VCB(COLLECTION_REMOVEALLELEMENTS, removeAllElements);
- CB(COLLECTION_GETNUMELEMENTS, getNumElements);
- CB(COLLECTION_GETNUMELEMENTSUNIQUE, getNumElementsUnique);
- CB(COLLECTION_ENUMELEMENT, enumElement);
- CB(COLLECTION_ENUMELEMENTUNIQUE, enumElementUnique);
- CB(COLLECTION_GETELEMENT, getElement);
- END_DISPATCH;
- #undef CBCLASS
- #define CBCLASS CollectionElementI
- START_DISPATCH;
- CB(COLLECTIONELEMENT_GETID, getId);
- CB(COLLECTIONELEMENT_GETPARAMVALUE, getParamValue);
- CB(COLLECTIONELEMENT_GETPARAMVALUEINT, getParamValueInt);
- CB(COLLECTIONELEMENT_GETINCLUDEPATH, getIncludePath);
- END_DISPATCH;
- #undef CBCLASS
- svc_collectionI::svc_collectionI() {
- count = 0;
- elements.setAutoSort(1);
- }
- svc_collectionI::~svc_collectionI() {
- }
- void svc_collectionI::addElement(const char *id, const char *includepath, int incrementalremovalid, skin_xmlreaderparams *params) {
- CollectionElementI *cei = new CollectionElementI(this, id, params, incrementalremovalid, includepath);
- elements.addItem(cei);
- }
- void svc_collectionI::removeElement(int removalid) {
- for (int i=0;i<elements.getNumItems();i++) {
- CollectionElementI *e = elements.enumItem(i);
- if (e->getSecCount() == removalid) {
- elements.removeItem(e);
- delete e;
- i--;
- }
- }
- }
- void svc_collectionI::removeAllElements() {
- elements.deleteAll();
- }
- int svc_collectionI::getNumElements() {
- return elements.getNumItems();
- }
- int svc_collectionI::getNumElementsUnique() {
- int i=0;
- int n=0;
- const char *previous = NULL;
- for (i=0;i<elements.getNumItems();i++) {
- const char *id = elements.enumItem(i)->getId();
- if (!STRCASEEQLSAFE(id, previous))
- n++;
- previous = id;
- }
- return n;
- }
- CollectionElement *svc_collectionI::enumElementUnique(int n, int *ancestor) {
- int i=0;
- int _n=-1;
- CollectionElement *e=NULL;
- CollectionElement *previous = NULL;
- elements.sort(1);
- for (i=0;i<elements.getNumItems();i++) {
- CollectionElement *c = elements.enumItem(i);
- if (!STRCASEEQLSAFE(c->getId(), previous ? previous->getId() : NULL)) {
- if (_n == n)
- break;
- _n++;
- }
- previous = c;
- }
- if (_n == n)
- e = previous;
- else
- e = NULL;
- if (ancestor != NULL) {
- if (e != NULL) {
- int pos=-1;
- elements.findItem(static_cast<CollectionElementI*>(e), &pos);
- if (pos > 0) {
- CollectionElement *f = elements.enumItem(pos-1);
- if (!STRCASEEQLSAFE(f ? f->getId() : NULL, e->getId())) *ancestor = -1;
- } else {
- *ancestor = -1;
- e = NULL;
- }
- } else
- *ancestor = -1;
- }
- return e;
- }
- CollectionElement *svc_collectionI::enumElement(int n, int *ancestor) {
- CollectionElement *e = elements.enumItem(n);
- if (ancestor != NULL) {
- CollectionElement *a = elements.enumItem(n-1);
- if (!STRCASEEQL(a->getId(), e->getId())) *ancestor = -1;
- *ancestor = n-1;
- }
- return e;
- }
- CollectionElement *svc_collectionI::getElement(const char *id, int *ancestor) {
- int pos=-1;
- CollectionElement *e = elements.findLastItem(id, &pos);
- if (ancestor != NULL) {
- CollectionElement *a = elements.enumItem(pos-1);
- if (!STRCASEEQL(a->getId(), e->getId())) *ancestor = -1;
- *ancestor = pos-1;
- }
- return e;
- }
- CollectionElement *svc_collectionI::getAncestor(CollectionElement *e) {
- int pos=-1;
- CollectionElementI *ei = static_cast<CollectionElementI *>(e);
- elements.findItem(ei, &pos);
- if (pos >= 0) {
- pos--;
- if (STRCASEEQL(elements.enumItem(pos)->getId(), e->getId())) return elements.enumItem(pos);
- }
- return NULL;
- }
- CollectionElementI::CollectionElementI(svc_collectionI *col, const char *_id, skin_xmlreaderparams *p, int _seccount, const char *_path) {
- id = _id;
- for (int i=0;i<p->getNbItems();i++) {
- Pair < String, String > *pr = new Pair < String, String >("","");
- pr->a = p->getItemName(i);
- pr->b = p->getItemValue(i);
- params.addItem(pr);
- }
- seccount = _seccount;
- collection = col;
- path = _path;
- }
- CollectionElementI::~CollectionElementI() {
- params.deleteAll();
- }
- const char *CollectionElementI::getId() {
- return id;
- }
- const char *CollectionElementI::getParamValue(const char *param, CollectionElement **item){
- CollectionElement *e = getAncestor();
- const char *a = e ? e->getParamValue(param) : NULL;
- Pair<String, String> *p = params.findItem(param);
- a = p ? p->b.getValue() : a;
- if (item && p != NULL) *item = this;
- return a;
- }
- int CollectionElementI::getParamValueInt(const char *param){
- const char *a = getParamValue(param);
- return ATOI(a);
- }
- int CollectionElementI::getSecCount() {
- return seccount;
- }
- CollectionElement *CollectionElementI::getAncestor() {
- return collection->getAncestor(this);
- }
- const char *CollectionElementI::getIncludePath(const char *param/* =NULL */) {
- if (param == NULL) return path;
- CollectionElement *i;
- if (!getParamValue(param, &i)) return NULL;
- if (i != NULL)
- return i->getIncludePath(NULL);
- return NULL;
- }
|