44 lines
1.1 KiB
C
44 lines
1.1 KiB
C
|
#ifndef _SVC_CACHE_H
|
||
|
#define _SVC_CACHE_H
|
||
|
|
||
|
#include <api/service/svc_enum.h>
|
||
|
#include <bfc/ptrlist.h>
|
||
|
|
||
|
/**
|
||
|
This is a caching version of SvcEnum. Upon creation, it enumerates all
|
||
|
service factories in the family and keeps them in a list. Then you can
|
||
|
call findService() with a search string to quickly find the service you
|
||
|
want. If you don't have a search string, you can still use a SvcEnum.
|
||
|
*/
|
||
|
|
||
|
class SvcCache {
|
||
|
protected:
|
||
|
SvcCache(FOURCC type);
|
||
|
|
||
|
public:
|
||
|
waServiceFactory *findServiceFactory(const wchar_t *searchval);
|
||
|
|
||
|
private:
|
||
|
class waServiceFactoryCompare {
|
||
|
public:
|
||
|
static int compareItem(waServiceFactory *p1, waServiceFactory* p2);
|
||
|
static int compareAttrib(const wchar_t *attrib, waServiceFactory *item);
|
||
|
};
|
||
|
PtrListQuickSorted<waServiceFactory, waServiceFactoryCompare> list;
|
||
|
};
|
||
|
|
||
|
template <class T>
|
||
|
class SvcCacheT : public SvcCache {
|
||
|
public:
|
||
|
SvcCacheT() : SvcCache(T::getServiceType()) { }
|
||
|
|
||
|
T *findService(const char *key, int global_lock=TRUE) {
|
||
|
waServiceFactory *sf = findServiceFactory(key);
|
||
|
if (sf == NULL) return NULL;
|
||
|
T *ret = castService<T>(sf, global_lock);
|
||
|
return ret;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#endif
|