VALUE CRbWin32API::initialize(int argc, VALUE * argv, VALUE obj) { VALUE dllname, proc, _import, _export; rb_scan_args(argc, argv, "4", &dllname, &proc, &_import, &_export); SafeStringValue(dllname); SafeStringValue(proc); m_hDll = LoadLibraryA(RSTRING_PTR(dllname)); if (!m_hDll) rb_raise(rb_eSinError, "LoadLibrary: %s\n", RSTRING_PTR(dllname)); HANDLE hproc = (HANDLE)GetProcAddress(m_hDll, RSTRING_PTR(proc)); if (!hproc) { VALUE str = rb_str_new3(proc); str = rb_str_cat(str, "A", 1); hproc = (HANDLE)GetProcAddress(m_hDll, RSTRING_PTR(str)); if (!hproc) { rb_raise(rb_eSinError, "GetProcAddress: %s or %s\n", RSTRING_PTR(proc), RSTRING_PTR(str)); } } rb_iv_set(obj, "__dll__", rb_uint2inum((u32)m_hDll)); rb_iv_set(obj, "__dllname__", dllname); rb_iv_set(obj, "__proc__", rb_uint2inum((u32)hproc)); VALUE ary_import = SinParseImportArgs(_import); if (16 < RARRAY_LEN(ary_import)) { rb_raise(rb_eSinError, "too many parameters: %ld\n", RARRAY_LEN(ary_import)); } rb_iv_set(obj, "__import__", ary_import); rb_iv_set(obj, "__export__", INT2FIX(SinParseExportArgs(_export))); return obj; }
/* * Verse::MaterialNode class */ void rbverse_init_verse_materialnode( void ) { rbverse_log( "debug", "Initializing Verse::MaterialNode" ); /* Class methods */ rbverse_cVerseMaterialNode = rb_define_class_under( rbverse_mVerse, "MaterialNode", rbverse_cVerseNode ); /* Constants */ rb_define_const( rbverse_cVerseMaterialNode, "TYPE_NUMBER", rb_uint2inum(V_NT_MATERIAL) ); /* Initializer */ rb_define_method( rbverse_cVerseMaterialNode, "initialize", rbverse_verse_materialnode_initialize, 0 ); /* Tell Verse::Node about this subclass */ rbverse_nodetype_to_nodeclass[ V_NT_MATERIAL ] = rbverse_cVerseMaterialNode; node_mark_funcs[ V_NT_MATERIAL ] = &rbverse_materialnode_gc_mark; node_free_funcs[ V_NT_MATERIAL ] = &rbverse_materialnode_gc_free; }
/* * Verse namespace. * */ void Init_verse_ext( void ) { rb_require( "verse" ); rbverse_mVerse = rb_define_module( "Verse" ); rbverse_mVerseLoggable = rb_define_module_under( rbverse_mVerse, "Loggable" ); rbverse_mVerseVersionUtilities = rb_define_module_under( rbverse_mVerse, "VersionUtilities" ); rbverse_mVerseVersioned = rb_define_module_under( rbverse_mVerse, "Versioned" ); rbverse_mVerseObserver = rb_define_module_under( rbverse_mVerse, "Observer" ); rbverse_mVerseObservable = rb_define_module_under( rbverse_mVerse, "Observable" ); rbverse_mVersePingObserver = rb_define_module_under( rbverse_mVerse, "PingObserver" ); rbverse_eVerseError = rb_define_class_under( rbverse_mVerse, "Error", rb_eRuntimeError ); rbverse_eVerseServerError = rb_define_class_under( rbverse_mVerse, "ServerError", rbverse_eVerseError ); rbverse_eVerseConnectError = rb_define_class_under( rbverse_mVerse, "ConnectError", rbverse_eVerseError ); rbverse_eVerseSessionError = rb_define_class_under( rbverse_mVerse, "SessionError", rbverse_eVerseError ); rbverse_eVerseNodeError = rb_define_class_under( rbverse_mVerse, "NodeError", rbverse_eVerseError ); /* Verse constants */ rb_define_const( rbverse_mVerse, "RELEASE_NUMBER", INT2FIX(V_RELEASE_NUMBER) ); rb_define_const( rbverse_mVerse, "RELEASE_PATCH", INT2FIX(V_RELEASE_PATCH) ); rb_define_const( rbverse_mVerse, "RELEASE_LABEL", rb_str_new2(V_RELEASE_LABEL) ); /* Module methods */ rb_define_singleton_method( rbverse_mVerse, "port=", rbverse_verse_port_eq, 1 ); rb_define_alias( CLASS_OF(rbverse_mVerse), "connect_port=", "port=" ); rb_define_singleton_method( rbverse_mVerse, "create_host_id", rbverse_verse_create_host_id, 0 ); rb_define_alias( CLASS_OF(rbverse_mVerse), "make_host_id", "create_host_id" ); rb_define_singleton_method( rbverse_mVerse, "host_id=", rbverse_verse_host_id_eq, 1 ); rb_define_singleton_method( rbverse_mVerse, "ping", rbverse_verse_ping, 2 ); rb_define_singleton_method( rbverse_mVerse, "update", rbverse_verse_update, -1 ); rb_define_alias( CLASS_OF(rbverse_mVerse), "callback_update", "update" ); /* * Constants */ rbverse_mVerseConstants = rb_define_module_under( rbverse_mVerse, "Constants" ); rb_define_const( rbverse_mVerseConstants, "HOST_ID_SIZE", INT2FIX(V_HOST_ID_SIZE) ); rb_define_const( rbverse_mVerseConstants, "V_NT_OBJECT", rb_uint2inum(V_NT_OBJECT) ); rb_define_const( rbverse_mVerseConstants, "V_NT_GEOMETRY", rb_uint2inum(V_NT_GEOMETRY) ); rb_define_const( rbverse_mVerseConstants, "V_NT_MATERIAL", rb_uint2inum(V_NT_MATERIAL) ); rb_define_const( rbverse_mVerseConstants, "V_NT_BITMAP", rb_uint2inum(V_NT_BITMAP) ); rb_define_const( rbverse_mVerseConstants, "V_NT_TEXT", rb_uint2inum(V_NT_TEXT) ); rb_define_const( rbverse_mVerseConstants, "V_NT_CURVE", rb_uint2inum(V_NT_CURVE) ); rb_define_const( rbverse_mVerseConstants, "V_NT_AUDIO", rb_uint2inum(V_NT_AUDIO) ); rb_define_const( rbverse_mVerseConstants, "V_NT_NUM_TYPES", rb_uint2inum(V_NT_NUM_TYPES) ); rb_define_const( rbverse_mVerseConstants, "V_NT_SYSTEM", rb_uint2inum(V_NT_SYSTEM) ); rb_define_const( rbverse_mVerseConstants, "V_NT_NUM_TYPES_NETPACK", rb_uint2inum(V_NT_NUM_TYPES_NETPACK) ); /* Init the subordinate classes */ rbverse_init_verse_session(); rbverse_init_verse_server(); rbverse_init_verse_node(); rbverse_init_verse_mixins(); /* Set up calbacks */ verse_callback_set( verse_send_ping, rbverse_cb_ping, NULL ); rbverse_log( "debug", "Initialized the extension." ); }
VALUE bpObjectToRuby(const bp::Object * obj, unsigned int tid) { if (obj == NULL) return Qnil; VALUE v = Qnil; switch (obj->type()) { case BPTNull: v = Qnil; break; case BPTBoolean: { if (((bp::Bool *) obj)->value()) v = Qtrue; else v = Qfalse; break; } case BPTInteger: v = rb_ull2inum(((bp::Integer *) obj)->value()); break; case BPTCallBack: { VALUE args[2]; args[0] = rb_uint2inum(tid); args[1] = rb_ull2inum(((bp::Integer *) obj)->value()); v = rb_class_new_instance(2, args, bp_rb_cCallback); break; } case BPTDouble: v = rb_float_new(((bp::Double *) obj)->value()); break; case BPTString: v = rb_str_new2(((bp::String *) obj)->value()); break; case BPTNativePath: { VALUE id = rb_intern("Pathname"); VALUE klass = 0; if (rb_const_defined(rb_cObject, id) && (klass = rb_const_get(rb_cObject, id)) && TYPE(klass) == T_CLASS) { std::string path = convert::toUTF8(((bp::Path *) obj)->value()); VALUE p = rb_str_new2(path.c_str()); v = rb_class_new_instance(1, &p, klass); } break; } case BPTMap: { bp::Map * m = (bp::Map *) obj; v = rb_hash_new(); bp::Map::Iterator i(*m); const char * key; while (NULL != (key = i.nextKey())) { rb_hash_aset(v,ID2SYM(rb_intern(key)), bpObjectToRuby(m->value(key), tid)); } break; } case BPTList: { bp::List * l = (bp::List *) obj; v = rb_ary_new(); unsigned int i; for (i=0; i < l->size(); i++) { rb_ary_push(v, bpObjectToRuby(l->value(i), tid)); } break; } case BPTAny: // invalid break; } return v; }