From: Steven Simpson <[email protected]> * Renamed generated callback function type *CB to *RF (for Response Function).
* tgt-gen creates *CB class (constructed from *RF) which offers respond(out-args) and fail(error) methods mapping onto *RF calls, and retains ->dispatch method for compatibility. The name *CB continues to be used in method signatures (like each async_* function), so the new *CB class replaces the old *CB typedef. * tgt-gen also generates *Rsp class as argument-holding version of *CB. Not used in any generated signatures, but available to user. Signed-off-by: Steven Simpson <[email protected]> --- xorp/xrl/scripts/tgt-gen | 75 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 73 insertions(+), 2 deletions(-) diff --git a/xorp/xrl/scripts/tgt-gen b/xorp/xrl/scripts/tgt-gen index acc2f3c..2998810 100755 --- a/xorp/xrl/scripts/tgt-gen +++ b/xorp/xrl/scripts/tgt-gen @@ -133,9 +133,80 @@ def target_virtual_fns(methods): r += " XorpCallback%s<void, const XrlCmdError &" % (len(x.rargs()) + 1) for a in x.rargs(): r += ",\n%sconst %s*" % (xorp_indent(2), a.cpp_type()) - r += ">::RefPtr\n %sCB;\n" % (caps_cpp_classname(x.name())) + r += ">::RefPtr\n %sRF;\n\n" % (caps_cpp_classname(x.name())) + r += " class %sCB {\n" % (caps_cpp_classname(x.name())) + r += " %sRF cb;\n\n" % (caps_cpp_classname(x.name())) + r += " public:\n" + r += " operator const %sRF& () const { return cb; }\n" \ + % (caps_cpp_classname(x.name())) + r += " const %sRF& operator ->() const { return cb; }\n" \ + % (caps_cpp_classname(x.name())) + + r += " %sCB(const %sRF& cb)\n" \ + % (caps_cpp_classname(x.name()), caps_cpp_classname(x.name())) + r += " : cb(cb) { }\n\n" + + r += " void fail(const XrlCmdError &e)" + r += " const { cb->dispatch(e" + for a in x.rargs(): + r += ", NULL" + r += "); }\n\n" + + r += " void respond(" + sep = "" + for a in x.rargs(): + r += sep + sep = ",\n " + r += "const %s& arg_%s" \ + % (a.cpp_type(), cpp_name(a.name())) + r += ") const {\n" + r += " cb->dispatch(XrlCmdError::OKAY()" + for a in x.rargs(): + r += ",\n &arg_%s" \ + % (cpp_name(a.name())) + r += ");\n" + r += " }\n" + + r += " };\n\n" + + + + r += " struct %sRsp :\n public %sCB {\n" \ + % (caps_cpp_classname(x.name()), caps_cpp_classname(x.name())) + if x.rargs(): + r += " struct args_str {\n" + for a in x.rargs(): + r += " %s %s;\n" \ + % (a.cpp_type(), cpp_name(a.name())) + r += " };\n" + r += "\n private:\n" + r += " args_str args;\n" + r += "\n public:\n" + + r += " %sRsp(const %sRF& cb)\n" \ + % (caps_cpp_classname(x.name()), caps_cpp_classname(x.name())) + r += " : %sCB(cb)" % (caps_cpp_classname(x.name())) + r += " { }\n\n" + + if x.rargs(): + r += " void respond() const {\n" + r += " %sCB::\n" % (caps_cpp_classname(x.name())) + r += " respond(" + sep = "" + for a in x.rargs(): + r += sep; + sep = ",\n " + r += "args.%s" % (cpp_name(a.name())) + r += ");\n" + r += " }\n\n" + r += " args_str* operator ->() {\n" + r += " return &args;\n" + r += " }\n" + + r += " };\n\n" + r += " virtual void async_%s\n (" \ % cpp_name(x.name()) @@ -297,7 +368,7 @@ def target_handler_methods(cls, name, methods): s += xorp_indent(1) + "try {\n" s += xorp_indent(2) + \ - "%sCB mycb =\n%scallback(this, &%s::callback_%s, pxa_outputs);\n" \ + "%sRF mycb =\n%scallback(this, &%s::callback_%s, pxa_outputs);\n" \ % (caps_cpp_classname(m.name()), xorp_indent(3), \ cls, cpp_name(m.name())) -- 1.7.0.4 _______________________________________________ Xorp-hackers mailing list [email protected] http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers
