MethodCall::MethodCall(Smoke *smoke, Smoke::Index method, VALUE target, VALUE *sp, int items) : MethodCallBase(smoke,method), _target(target), _o(0), _sp(sp), _items(items) { if (_target != Qnil) { smokeruby_object *o = value_obj_info(_target); if (o != 0 && o->ptr != 0) { _o = o; } } _args = _smoke->argumentList + _smoke->methods[_method].args; _items = _smoke->methods[_method].numArgs; _stack = new Smoke::StackItem[items + 1]; _retval = Qnil; }
void marshall_QHashQStringQVariant(Marshall *m) { switch(m->action()) { case Marshall::FromVALUE: { VALUE hash = *(m->var()); if (TYPE(hash) != T_HASH) { m->item().s_voidp = 0; break; } QHash<QString,QVariant> * map = new QHash<QString,QVariant>; // Convert the ruby hash to an array of key/value arrays VALUE temp = rb_funcall(hash, rb_intern("to_a"), 0); for (long i = 0; i < RARRAY_LEN(temp); i++) { VALUE key = rb_ary_entry(rb_ary_entry(temp, i), 0); VALUE value = rb_ary_entry(rb_ary_entry(temp, i), 1); smokeruby_object *o = value_obj_info(value); if (o == 0 || o->ptr == 0) { continue; } (*map)[QString(StringValuePtr(key))] = (QVariant)*(QVariant*)o->ptr; } m->item().s_voidp = map; m->next(); if(m->cleanup()) delete map; } break; case Marshall::ToVALUE: { QHash<QString,QVariant> *map = (QHash<QString,QVariant>*)m->item().s_voidp; if (!map) { *(m->var()) = Qnil; break; } VALUE hv = rb_hash_new(); QHash<QString,QVariant>::Iterator it; for (it = map->begin(); it != map->end(); ++it) { void *p = new QVariant(it.value()); VALUE obj = getPointerObject(p); if (obj == Qnil) { smokeruby_object * o = alloc_smokeruby_object( true, qtcore_Smoke, qtcore_Smoke->idClass("QVariant").index, p ); obj = set_obj_info("Qt::Variant", o); } rb_hash_aset(hv, rb_str_new2(((QString*)&(it.key()))->toLatin1()), obj); } *(m->var()) = hv; m->next(); // if(m->cleanup()) // delete map; } break; default: m->unsupported(); break; } }