#ifndef OFXH_IMAGE_EFFECT_API_H
#define OFXH_IMAGE_EFFECT_API_H
#include <string>
#include <map>
#include <set>
#include <memory>
#include "ofxCore.h"
#include "ofxImageEffect.h"
#include "ofxhImageEffect.h"
#include "ofxhHost.h"
namespace OFX {
namespace Host {
namespace ImageEffect {
class PluginCache;
class ImageEffectPlugin : public Plugin {
PluginCache &_pc;
Descriptor *_baseDescriptor;
std::map<std::string, Descriptor *> _contexts;
mutable std::set<std::string> _knownContexts;
mutable bool _madeKnownContexts;
std::auto_ptr<PluginHandle> _pluginHandle;
void addContextInternal(const std::string &context) const;
public:
ImageEffectPlugin(PluginCache &pc, PluginBinary *pb, int pi, OfxPlugin *pl);
ImageEffectPlugin(PluginCache &pc,
PluginBinary *pb,
int pi,
const std::string &api,
int apiVersion,
const std::string &pluginId,
const std::string &rawId,
int pluginMajorVersion,
int pluginMinorVersion);
virtual ~ImageEffectPlugin();
APICache::PluginAPICacheI &getApiHandler();
Descriptor &getDescriptor();
const Descriptor &getDescriptor() const;
Descriptor *getContext(const std::string &context);
void addContext(const std::string &context);
void addContext(const std::string &context, Descriptor *ied);
virtual void saveXML(std::ostream &os);
const std::set<std::string>& getContexts() const;
PluginHandle *getPluginHandle();
void unload();
ImageEffect::Instance* createInstance(const std::string &context, void *clientDataPtr);
};
class MajorPlugin {
std::string _id;
int _major;
public:
MajorPlugin(const std::string &id, int major) : _id(id), _major(major) {
}
MajorPlugin(ImageEffectPlugin *iep) : _id(iep->getIdentifier()), _major(iep->getVersionMajor()) {
}
const std::string &getId() const {
return _id;
}
int getMajor() const {
return _major;
}
bool operator<(const MajorPlugin &other) const {
if (_id < other._id)
return true;
if (_id > other._id)
return false;
if (_major < other._major)
return true;
return false;
}
};
class PluginCache : public APICache::PluginAPICacheI {
public:
private:
std::vector<ImageEffectPlugin *> _plugins;
std::map<std::string, ImageEffectPlugin *> _pluginsByID;
std::map<MajorPlugin, ImageEffectPlugin *> _pluginsByIDMajor;
ImageEffectPlugin *_currentPlugin;
Property::Property *_currentProp;
Descriptor *_currentContext;
Param::Descriptor *_currentParam;
ClipDescriptor *_currentClip;
OFX::Host::ImageEffect::Host* _host;
public:
explicit PluginCache(OFX::Host::ImageEffect::Host &host);
virtual ~PluginCache();
ImageEffectPlugin *getPluginById(const std::string &id, int vermaj=-1, int vermin=-1);
ImageEffectPlugin *getPluginByLabel(const std::string &label, int vermaj=-1, int vermin=-1);
OFX::Host::ImageEffect::Host *getHost() {
return _host;
}
const std::vector<ImageEffectPlugin *>& getPlugins() const;
const std::map<std::string, ImageEffectPlugin *>& getPluginsByID() const;
const std::map<MajorPlugin, ImageEffectPlugin *>& getPluginsByIDMajor() const
{
return _pluginsByIDMajor;
}
void loadFromPlugin(Plugin *p) const;
void beginXmlParsing(Plugin *p);
virtual void xmlElementBegin(const std::string &el, std::map<std::string, std::string> map);
virtual void xmlCharacterHandler(const std::string &);
virtual void xmlElementEnd(const std::string &el);
virtual void endXmlParsing();
virtual void saveXML(Plugin *ip, std::ostream &os) const;
void confirmPlugin(Plugin *p);
virtual bool pluginSupported(Plugin *p, std::string &reason) const;
Plugin *newPlugin(PluginBinary *pb,
int pi,
OfxPlugin *pl);
Plugin *newPlugin(PluginBinary *pb,
int pi,
const std::string &api,
int apiVersion,
const std::string &pluginId,
const std::string &rawId,
int pluginMajorVersion,
int pluginMinorVersion);
void dumpToStdOut();
};
}
}
}
#endif