[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