winamp/Src/Wasabi/api/service/svcs/svc_collection.h
2024-09-24 14:54:57 +02:00

227 lines
7.1 KiB
C++

#ifndef _SVC_COLLECTION_H
#define _SVC_COLLECTION_H
#include <bfc/dispatch.h>
#include <bfc/ptrlist.h>
#include <bfc/pair.h>
#include <api/xml/xmlreader.h>
#include <api/service/services.h>
class CollectionElement;
class svc_collectionI;
class NOVTABLE svc_collection : public Dispatchable
{
public:
static FOURCC getServiceType() { return WaSvc::COLLECTION; }
int testTag(const wchar_t *xmltag);
void addElement(const wchar_t *id, const wchar_t *includepath, int removalid, skin_xmlreaderparams *params);
void removeElement(int recored_value);
void removeAllElements();
int getNumElements();
int getNumElementsUnique();
CollectionElement *enumElement(int n, int *ancestor);
CollectionElement *enumElementUnique(int n, int *ancestor);
CollectionElement *getElement(const wchar_t *id, int *ancestor);
CollectionElement *getAncestor(CollectionElement *e);
enum
{
COLLECTION_TESTTAG=10,
COLLECTION_ADDELEMENT=20,
COLLECTION_REMOVEELEMENT=30,
COLLECTION_REMOVEALLELEMENTS=35,
COLLECTION_GETNUMELEMENTS=40,
COLLECTION_GETNUMELEMENTSUNIQUE=50,
COLLECTION_ENUMELEMENT=60,
COLLECTION_ENUMELEMENTUNIQUE=70,
COLLECTION_GETELEMENT=80,
};
};
inline int svc_collection::testTag(const wchar_t *xmltag) {
return _call(COLLECTION_TESTTAG, 0, xmltag);
}
inline void svc_collection::addElement(const wchar_t *id, const wchar_t *includepath, int incrementalremovalid, skin_xmlreaderparams *params) {
_voidcall(COLLECTION_ADDELEMENT, id, includepath, incrementalremovalid, params);
}
inline void svc_collection::removeElement(int removalid) {
_voidcall(COLLECTION_REMOVEELEMENT, removalid);
}
inline void svc_collection::removeAllElements() {
_voidcall(COLLECTION_REMOVEALLELEMENTS);
}
inline int svc_collection::getNumElements() {
return _call(COLLECTION_GETNUMELEMENTS, 0);
}
inline int svc_collection::getNumElementsUnique() {
return _call(COLLECTION_GETNUMELEMENTSUNIQUE, 0);
}
inline CollectionElement *svc_collection::enumElement(int n, int *ancestor) {
return _call(COLLECTION_ENUMELEMENT, (CollectionElement *)NULL, n, ancestor);
}
inline CollectionElement *svc_collection::enumElementUnique(int n, int *ancestor) {
return _call(COLLECTION_ENUMELEMENTUNIQUE, (CollectionElement *)NULL, n, ancestor);
}
inline CollectionElement *svc_collection::getElement(const wchar_t *id, int *ancestor) {
return _call(COLLECTION_GETELEMENT, (CollectionElement *)NULL, id, ancestor);
}
class SortPairString {
public:
static int compareItem(Pair<StringW, StringW> *p1, Pair<StringW, StringW> *p2) {
return WCSICMP(p1->a, p2->a);
}
static int compareAttrib(const wchar_t *attrib, Pair<StringW, StringW> *item) {
return WCSICMP(attrib, item->a);
}
};
class CollectionElement : public Dispatchable {
public:
const wchar_t *getId();
const wchar_t *getParamValue(const wchar_t *param, CollectionElement **item=NULL);
int getParamValueInt(const wchar_t *param);
const wchar_t *getIncludePath(const wchar_t *param=NULL);
CollectionElement *getAncestor();
enum {
COLLECTIONELEMENT_GETID=10,
COLLECTIONELEMENT_GETPARAMVALUE=20,
COLLECTIONELEMENT_GETPARAMVALUEINT=30,
COLLECTIONELEMENT_GETANCESTOR=40,
COLLECTIONELEMENT_GETINCLUDEPATH=50,
};
};
inline const wchar_t *CollectionElement::getId() {
return _call(COLLECTIONELEMENT_GETID, (const wchar_t *)NULL);
}
inline const wchar_t *CollectionElement::getParamValue(const wchar_t *param, CollectionElement **item) {
return _call(COLLECTIONELEMENT_GETPARAMVALUE, (const wchar_t *)NULL, param, item);
}
inline int CollectionElement::getParamValueInt(const wchar_t *param) {
return _call(COLLECTIONELEMENT_GETPARAMVALUEINT, 0, param);
}
inline CollectionElement *CollectionElement::getAncestor() {
return _call(COLLECTIONELEMENT_GETANCESTOR, (CollectionElement *)NULL);
}
inline const wchar_t *CollectionElement::getIncludePath(const wchar_t *param) {
return _call(COLLECTIONELEMENT_GETINCLUDEPATH, (const wchar_t *)NULL, param);
}
class CollectionElementI : public CollectionElement {
public:
CollectionElementI(svc_collectionI *collectionI, const wchar_t *id, skin_xmlreaderparams *params, int seccount, const wchar_t *includepath);
virtual ~CollectionElementI();
virtual const wchar_t *getId();
virtual const wchar_t *getParamValue(const wchar_t *param, CollectionElement **item=NULL);
virtual int getParamValueInt(const wchar_t *param);
virtual CollectionElement *getAncestor();
const wchar_t *getIncludePath(const wchar_t *param=NULL); // null returns last override's include path
int getSecCount();
protected:
RECVS_DISPATCH;
PtrListQuickSorted < Pair < StringW, StringW >, SortPairString > params;
StringW id;
int seccount;
svc_collectionI *collection;
StringW path;
};
class SortCollectionElementsI {
public:
static int compareItem(CollectionElementI *p1, CollectionElementI *p2) {
int r = WCSICMP(p1->getId(), p2->getId());
if (r == 0) {
if (p1->getSecCount() < p2->getSecCount()) return -1;
if (p1->getSecCount() > p2->getSecCount()) return 1;
return 0;
}
return r;
}
static int compareAttrib(const wchar_t *attrib, CollectionElementI *item) {
return WCSICMP(attrib, item->getId());
}
};
// derive from this one
class svc_collectionI : public svc_collection {
public:
svc_collectionI();
virtual ~svc_collectionI();
virtual int testTag(const wchar_t *xmltag)=0;
virtual void addElement(const wchar_t *id, const wchar_t *includepath, int incrementalremovalid, skin_xmlreaderparams *params);
virtual void removeElement(int removalid);
virtual void removeAllElements();
virtual int getNumElements();
virtual int getNumElementsUnique();
virtual CollectionElement *enumElement(int n, int *ancestor);
virtual CollectionElement *enumElementUnique(int n, int *ancestor);
virtual CollectionElement *getElement(const wchar_t *id, int *ancestor);
virtual CollectionElement *getAncestor(CollectionElement *e);
protected:
RECVS_DISPATCH;
PtrListQuickMultiSorted < CollectionElementI, SortCollectionElementsI > elements;
int count;
};
#include <api/service/servicei.h>
template <class T>
class CollectionCreator : public waServiceFactoryTSingle<svc_collection, T> {};
template <wchar_t TAG[]>
class CollectionSvc : public svc_collectionI {
public:
int testTag(const wchar_t *xmltag) {
if (!WCSICMP(xmltag, TAG)) return 1;
return 0;
}
static const char *getServiceName() { return StringPrintf("Collection Service for \"%S\"", TAG); }
};
template <class T>
class CollectionSvc2 : public svc_collectionI {
public:
int testTag(const wchar_t *xmltag) {
if (STRCASEEQL(xmltag, T::collection_getXmlTag())) return 1;
return 0;
}
static const char *getServiceName() { return StringPrintf("Collection Service for \"%S\"", T::collection_getXmlTag()); }
};
#include <api/service/svc_enum.h>
#include <bfc/string/StringW.h>
class CollectionSvcEnum : public SvcEnumT<svc_collection>
{
public:
CollectionSvcEnum(const wchar_t *xmltag) : tag(xmltag) {}
protected:
virtual int testService(svc_collection *svc) {
return (svc->testTag(tag));
}
private:
StringW tag;
};
#endif