+}
+
+
+Version FilterBase::GetVersion()
+{
+ return Version("$Id$", VF_VENDOR | VF_COMMON, API_VERSION);
+}
+
+
+std::string FilterBase::EncodeFilter(FilterResult* filter)
+{
+ std::ostringstream stream;
+ std::string x = filter->freeform;
+
+ /* Hax to allow spaces in the freeform without changing the design of the irc protocol */
+ for (std::string::iterator n = x.begin(); n != x.end(); n++)
+ if (*n == ' ')
+ *n = '\7';
+
+ stream << x << " " << filter->action << " " << (filter->flags.empty() ? "-" : filter->flags) << " " << filter->gline_time << " :" << filter->reason;
+ return stream.str();
+}
+
+FilterResult FilterBase::DecodeFilter(const std::string &data)
+{
+ FilterResult res;
+ irc::tokenstream tokens(data);
+ tokens.GetToken(res.freeform);
+ tokens.GetToken(res.action);
+ tokens.GetToken(res.flags);
+ if (res.flags == "-")
+ res.flags = "";
+ res.FillFlags(res.flags);
+ tokens.GetToken(res.gline_time);
+ tokens.GetToken(res.reason);
+
+ /* Hax to allow spaces in the freeform without changing the design of the irc protocol */
+ for (std::string::iterator n = res.freeform.begin(); n != res.freeform.end(); n++)
+ if (*n == '\7')
+ *n = ' ';
+
+ return res;
+}
+
+void FilterBase::OnSyncOtherMetaData(Module* proto, void* opaque, bool displayable)
+{
+ this->SyncFilters(proto, opaque);
+}
+
+void FilterBase::SendFilter(Module* proto, void* opaque, FilterResult* iter)
+{
+ proto->ProtoSendMetaData(opaque, TYPE_OTHER, NULL, "filter", EncodeFilter(iter));
+}
+
+void FilterBase::OnDecodeMetaData(int target_type, void* target, const std::string &extname, const std::string &extdata)
+{
+ if ((target_type == TYPE_OTHER) && (extname == "filter"))
+ {
+ FilterResult data = DecodeFilter(extdata);
+ this->AddFilter(data.freeform, data.action, data.reason, data.gline_time, data.flags);
+ }
+}
+
+class ImplFilter : public FilterResult
+{
+ public:
+ Regex* regex;
+
+ ImplFilter(Module* mymodule, const std::string &rea, const std::string &act, long glinetime, const std::string &pat, const std::string &flgs)
+ : FilterResult(pat, rea, act, glinetime, flgs)
+ {
+ if (!rxengine)
+ throw ModuleException("Regex module implementing '"+RegexEngine+"' is not loaded!");
+
+ regex = RegexFactoryRequest(mymodule, rxengine, pat).Create();
+ }
+
+ ImplFilter()
+ {
+ }
+};
+
+class ModuleFilter : public FilterBase
+{
+ std::vector<ImplFilter> filters;
+ const char *error;
+ int erroffset;
+ ImplFilter fr;
+
+ public:
+ ModuleFilter(InspIRCd* Me)
+ : FilterBase(Me, "m_filter.so")
+ {
+ OnRehash(NULL,"");
+ }