#ifndef __IPS_ENTRY_H__ #define __IPS_ENTRY_H__ #include #include #include "table_opaque.h" #include "parsed_context.h" #include "buffer.h" #include "context.h" class IPSEntry : public TableOpaqueSerialize, public Listener { public: IPSEntry(); void upon(const ParsedContext &) override; ParsedContextReply respond(const ParsedContext &ctx) override; std::string getListenerName() const override { return name(); } template void serialize(T &, uint32_t) {} static std::string name(); static std::unique_ptr prototype(); static uint currVer(); static uint minVer(); void uponEnteringContext() override { registerListener(); } void uponLeavingContext() override { unregisterListener(); } void setFlag(const std::string &flag) { flags.insert(flag); } void unsetFlag(const std::string &flag) { flags.erase(flag); } bool isFlagSet(const std::string &flag) const { return flags.count(flag) != 0; } Buffer getBuffer(const std::string &name) const; void setTransactionData(const Buffer &key, const Buffer &value); Maybe getTransactionData(const Buffer &key) const; void addPendingContext(const std::string &name, const Buffer &buffer); const std::vector> getPendingContexts() const { return pending_contexts; } void clearPendingContexts() { pending_contexts.clear(); } void setDrop() { is_drop = true; } bool isDrop() const { return is_drop; } private: std::map past_contexts; std::set flags; Context ctx; std::map transaction_data; std::vector> pending_contexts; bool is_drop = false; }; #endif // __IPS_ENTRY_H__