[Click] How to reference Method Interfaces?
Javier Sánchez Recacha
javier.recacha at gmail.com
Wed Jun 4 15:18:43 EDT 2008
3) Read the capacity handler of the queue element
click script:
RatedSource(\<0800>) -> q::Queue -> MyPrint(q.capacity) -> Discard();
MyPrint.hh:
...
const Handler* parse_handler(const String &, Element **);
private:
String _handler_to_read;
...
MyPrint.cc:
#include <click/config.h>
#include "myprint.hh"
#include <click/confparse.hh>
#include <click/error.hh>
#include <click/packet_anno.hh>
#include <click/router.hh>
CLICK_DECLS
MyPrint::MyPrint()
{
}
MyPrint::~MyPrint()
{
}
static String
canonical_handler_name(const String &n)
{
const char *dot = find(n, '.');
if (dot == n.begin() || (dot == n.begin() + 1 && n.front() == '0'))
return n.substring(dot + 1, n.end());
else
return n;
}
const Handler*
MyPrint::parse_handler(const String &full_name, Element **es)
{
// Parse full_name into element_name and handler_name.
String canonical_name = canonical_handler_name(full_name);
// find element.
Element *e;
const char *dot = find(canonical_name, '.');
String hname;
if (dot != canonical_name.end()) {
String ename = canonical_name.substring(canonical_name.begin(), dot);
e = router()->find(ename);
if (!e) {
click_chatter ("fails to read handler");
return 0;
}
hname = canonical_name.substring(dot + 1, canonical_name.end());
} else {
e = router()->root_element();
hname = canonical_name;
}
// Then find handler.
const Handler* h = Router::handler(e, hname);
if (h && h->visible()) {
*es = e;
return h;
} else {
click_chatter ("fails to read handler");
return 0;
}
}
int
MyPrint::configure(Vector<String> &conf, ErrorHandler *errh)
{
String a;
if (cp_va_kparse(conf, this, errh,
"HANDLER", cpkP+cpkM, cpString, &a,
cpEnd) < 0)
return -1;
_handler_to_read = a;
return 0;
}
Packet *
MyPrint::simple_action(Packet *p)
{
Element *e;
const Handler* h = parse_handler(_handler_to_read.c_str(), &e);
if (h->read_visible())
{
String data = h->call_read(e, NULL);
click_chatter ("HANDLER DATA %s : %s",_handler_to_read.c_str(),
data.c_str());
}
return p;
}
CLICK_ENDDECLS
EXPORT_ELEMENT(MyPrint)
ELEMENT_MT_SAFE(MyPrint)
I think method 2 should be more efficient.
Salutations
Javier
More information about the click
mailing list