diff options
author | Martin Willi <martin@strongswan.org> | 2009-04-07 17:54:15 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2009-04-07 17:54:15 +0000 |
commit | 8a7d32452cbd33c147a74096528680814640ccdb (patch) | |
tree | 8bfc9985d4e2ed27d373ce577064e633378afb2f | |
parent | cf61575dc321af853930a926768ec656a7ac546a (diff) | |
download | strongswan-8a7d32452cbd33c147a74096528680814640ccdb.tar.bz2 strongswan-8a7d32452cbd33c147a74096528680814640ccdb.tar.xz |
added Dumm.method_missing, allows direct invocation of guests/bridges
-rw-r--r-- | src/dumm/ext/dumm.c | 28 | ||||
-rw-r--r-- | src/dumm/ext/lib/dumm.rb | 12 |
2 files changed, 36 insertions, 4 deletions
diff --git a/src/dumm/ext/dumm.c b/src/dumm/ext/dumm.c index 21435b5aa..fa180ee0e 100644 --- a/src/dumm/ext/dumm.c +++ b/src/dumm/ext/dumm.c @@ -92,7 +92,9 @@ static VALUE guest_find(VALUE class, VALUE key) { enumerator_t *enumerator; guest_t *guest, *found = NULL; - if (TYPE(key) == T_SYMBOL) { + + if (TYPE(key) == T_SYMBOL) + { key = rb_convert_type(key, T_STRING, "String", "to_s"); } enumerator = dumm->create_guest_enumerator(dumm); @@ -255,7 +257,9 @@ static VALUE guest_find_iface(VALUE self, VALUE key) enumerator_t *enumerator; iface_t *iface, *found = NULL; guest_t *guest; - if (TYPE(key) == T_SYMBOL) { + + if (TYPE(key) == T_SYMBOL) + { key = rb_convert_type(key, T_STRING, "String", "to_s"); } Data_Get_Struct(self, guest_t, guest); @@ -355,11 +359,15 @@ static void guest_init() /** * Bridge binding */ -static VALUE bridge_get(VALUE class, VALUE key) +static VALUE bridge_find(VALUE class, VALUE key) { enumerator_t *enumerator; bridge_t *bridge, *found = NULL; + if (TYPE(key) == T_SYMBOL) + { + key = rb_convert_type(key, T_STRING, "String", "to_s"); + } enumerator = dumm->create_bridge_enumerator(dumm); while (enumerator->enumerate(enumerator, &bridge)) { @@ -372,11 +380,21 @@ static VALUE bridge_get(VALUE class, VALUE key) enumerator->destroy(enumerator); if (!found) { - rb_raise(rb_eRuntimeError, "bridge not found"); + return Qnil; } return Data_Wrap_Struct(class, NULL, NULL, found); } +static VALUE bridge_get(VALUE class, VALUE key) +{ + VALUE bridge = bridge_find(class, key); + if (NIL_P(bridge)) + { + rb_raise(rb_eRuntimeError, "bridge not found"); + } + return bridge; +} + static VALUE bridge_each(int argc, VALUE *argv, VALUE class) { enumerator_t *enumerator; @@ -468,6 +486,8 @@ static void bridge_init() rb_define_singleton_method(rbc_bridge, "[]", bridge_get, 1); rb_define_singleton_method(rbc_bridge, "each", bridge_each, -1); rb_define_singleton_method(rbc_bridge, "new", bridge_new, 1); + rb_define_singleton_method(rbc_bridge, "include?", bridge_find, 1); + rb_define_singleton_method(rbc_bridge, "bridge?", bridge_find, 1); rb_define_method(rbc_bridge, "to_s", bridge_to_s, 0); rb_define_method(rbc_bridge, "each", bridge_each_iface, -1); diff --git a/src/dumm/ext/lib/dumm.rb b/src/dumm/ext/lib/dumm.rb index ba1ccceb2..28485e994 100644 --- a/src/dumm/ext/lib/dumm.rb +++ b/src/dumm/ext/lib/dumm.rb @@ -19,6 +19,18 @@ require 'dumm.so' require 'dumm/guest' module Dumm + + # use guest/bridge indentifiers directly + def method_missing(id, *args) + if Guest.guest? id + return Guest[id] + end + if Bridge.bridge? id + return Bridge[id] + end + super(id, *args) + end + # unload templates, reset all guests and delete bridges def reset Template.unload |