ARC SDK
Example Protocol Plugin
#include <arc/data/DataPointDirect.h>
namespace Arc {
// DMC implementation for my protocol
class DataPointMyProtocol : public DataPointDirect {
public:
// Constructor should never be used directly
DataPointMyProtocol(const URL& url, const UserConfig& usercfg, PluginArgument* parg);
// Instance is called by the DataPointPluginLoader to get the correct DMC
// instance. If returns a DataPointMyProtocol if the URL is of the form my://
// or NULL otherwise.
static Plugin* Instance(PluginArgument *arg);
// The following methods from DataPoint must be implemented
virtual DataStatus Check(bool check_meta);
virtual DataStatus Remove();
virtual DataStatus CreateDirectory(bool with_parents=false) { return DataStatus(DataStatus::UnimplementedError, EOPNOTSUPP); };
virtual DataStatus Stat(FileInfo& file, DataPoint::DataPointInfoType verb);
virtual DataStatus List(std::list<FileInfo>& file, DataPoint::DataPointInfoType verb);
virtual DataStatus Rename(const URL& newurl) { return DataStatus(DataStatus::UnimplementedError, EOPNOTSUPP); };
virtual DataStatus StartReading(DataBuffer& buffer);
virtual DataStatus StartWriting(DataBuffer& buffer,
DataCallback *space_cb = NULL);
virtual DataStatus StopReading();
virtual DataStatus StopWriting();
};
DataPointMyProtocol::DataPointMyProtocol(const URL& url, const UserConfig& usercfg, PluginArgument* parg)
: DataPointDirect(url, usercfg, parg) {}
DataStatus DataPointMyProtocol::Check(bool check_meta) { return DataStatus::Success; }
DataStatus DataPointMyProtocol::Remove() { return DataStatus::Success; }
DataStatus DataPointMyProtocol::Stat(FileInfo& file,
DataStatus DataPointMyProtocol::List(std::list<FileInfo>& file,
DataStatus DataPointMyProtocol::StartReading(DataBuffer& buffer) { return DataStatus::Success; }
DataStatus DataPointMyProtocol::StartWriting(DataBuffer& buffer,
DataCallback *space_cb) { return DataStatus::Success; }
DataStatus DataPointMyProtocol::StopReading() { return DataStatus::Success; }
DataStatus DataPointMyProtocol::StopWriting() { return DataStatus::Success; }
Plugin* DataPointMyProtocol::Instance(PluginArgument *arg) {
DataPointPluginArgument *dmcarg = dynamic_cast<DataPointPluginArgument*>(arg);
if (!dmcarg)
return NULL;
if (((const URL &)(*dmcarg)).Protocol() != "my")
return NULL;
return new DataPointMyProtocol(*dmcarg, *dmcarg, dmcarg);
}
} // namespace Arc
// Add this plugin to the plugin descriptor table
extern Arc::PluginDescriptor const ARC_PLUGINS_TABLE_NAME[] = {
{ "my", "HED:DMC", "My protocol", 0, &Arc::DataPointMyProtocol::Instance },
{ NULL, NULL, NULL, 0, NULL }
};