/************************************************************************* * DllGetClassObject (ExplorerFrame.@) */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) { static IClassFactoryImpl NSTCClassFactory = {&EFCF_Vtbl, NamespaceTreeControl_Constructor}; TRACE("%s, %s, %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); if(IsEqualGUID(&CLSID_NamespaceTreeControl, rclsid)) return IClassFactory_QueryInterface(FACTORY(&NSTCClassFactory), riid, ppv); return CLASS_E_CLASSNOTAVAILABLE; }
/************************************************************************* * DllGetClassObject (SHDOCVW.@) */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) { static IClassFactoryImpl WB1ClassFactory = {&WBCF_Vtbl, WebBrowserV1_Create}; static IClassFactoryImpl WB2ClassFactory = {&WBCF_Vtbl, WebBrowserV2_Create}; static IClassFactoryImpl CUHClassFactory = {&WBCF_Vtbl, CUrlHistory_Create}; TRACE("\n"); if(IsEqualGUID(&CLSID_WebBrowser, rclsid)) return IClassFactory_QueryInterface(FACTORY(&WB2ClassFactory), riid, ppv); if(IsEqualGUID(&CLSID_WebBrowser_V1, rclsid)) return IClassFactory_QueryInterface(FACTORY(&WB1ClassFactory), riid, ppv); if(IsEqualGUID(&CLSID_CUrlHistory, rclsid)) return IClassFactory_QueryInterface(FACTORY(&CUHClassFactory), riid, ppv); /* As a last resort, figure if the CLSID belongs to a 'Shell Instance Object' */ return SHDOCVW_GetShellInstanceObjectClassObject(rclsid, riid, ppv); }
VALUE MessagePack_Factory_unpacker(int argc, VALUE* argv, VALUE self) { FACTORY(self, fc); VALUE unpacker = MessagePack_Unpacker_alloc(cMessagePack_Unpacker); MessagePack_Unpacker_initialize(argc, argv, unpacker); msgpack_unpacker_t* uk; Data_Get_Struct(unpacker, msgpack_unpacker_t, uk); msgpack_unpacker_ext_registry_destroy(&uk->ext_registry); msgpack_unpacker_ext_registry_dup(&fc->ukrg, &uk->ext_registry); return unpacker; }
VALUE MessagePack_Factory_packer(int argc, VALUE* argv, VALUE self) { FACTORY(self, fc); VALUE packer = MessagePack_Packer_alloc(cMessagePack_Packer); MessagePack_Packer_initialize(argc, argv, packer); msgpack_packer_t* pk; Data_Get_Struct(packer, msgpack_packer_t, pk); msgpack_packer_ext_registry_destroy(&pk->ext_registry); msgpack_packer_ext_registry_dup(&fc->pkrg, &pk->ext_registry); pk->has_symbol_ext_type = fc->has_symbol_ext_type; return packer; }
static VALUE Factory_registered_types_internal(VALUE self) { FACTORY(self, fc); VALUE uk_mapping = rb_hash_new(); for(int i=0; i < 256; i++) { if(fc->ukrg.array[i] != Qnil) { rb_hash_aset(uk_mapping, INT2FIX(i - 128), fc->ukrg.array[i]); } } #ifdef HAVE_RB_HASH_DUP return rb_ary_new3(2, rb_hash_dup(fc->pkrg.hash), uk_mapping); #else return rb_ary_new3(2, rb_funcall(fc->pkrg.hash, rb_intern("dup"), 0), uk_mapping); #endif }
static VALUE Factory_initialize(int argc, VALUE* argv, VALUE self) { FACTORY(self, fc); msgpack_packer_ext_registry_init(&fc->pkrg); msgpack_unpacker_ext_registry_init(&fc->ukrg); fc->has_symbol_ext_type = false; switch (argc) { case 0: break; default: // TODO options is not supported yet rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); } return Qnil; }
HRESULT register_class_object(BOOL do_reg) { HRESULT hres; static DWORD cookie; static IClassFactoryImpl IEClassFactory = {&WBCF_Vtbl, InternetExplorer_Create}; if(do_reg) { hres = CoRegisterClassObject(&CLSID_InternetExplorer, (IUnknown*)FACTORY(&IEClassFactory), CLSCTX_SERVER, REGCLS_MULTIPLEUSE|REGCLS_SUSPENDED, &cookie); if (FAILED(hres)) { ERR("failed to register object %08x\n", hres); return hres; } hres = CoResumeClassObjects(); if(SUCCEEDED(hres)) return hres; ERR("failed to resume object %08x\n", hres); } return CoRevokeClassObject(cookie); }
static VALUE Factory_register_type(int argc, VALUE* argv, VALUE self) { FACTORY(self, fc); int ext_type; VALUE ext_module; VALUE options; VALUE packer_arg, unpacker_arg; VALUE packer_proc, unpacker_proc; if (OBJ_FROZEN(self)) { rb_raise(rb_eRuntimeError, "can't modify frozen Factory"); } switch (argc) { case 2: /* register_type(0x7f, Time) */ packer_arg = ID2SYM(rb_intern("to_msgpack_ext")); unpacker_arg = ID2SYM(rb_intern("from_msgpack_ext")); break; case 3: /* register_type(0x7f, Time, packer: proc-like, unapcker: proc-like) */ options = argv[2]; if(rb_type(options) != T_HASH) { rb_raise(rb_eArgError, "expected Hash but found %s.", rb_obj_classname(options)); } packer_arg = rb_hash_aref(options, ID2SYM(rb_intern("packer"))); unpacker_arg = rb_hash_aref(options, ID2SYM(rb_intern("unpacker"))); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..3)", argc); } ext_type = NUM2INT(argv[0]); if(ext_type < -128 || ext_type > 127) { rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type); } ext_module = argv[1]; if(rb_type(ext_module) != T_MODULE && rb_type(ext_module) != T_CLASS) { rb_raise(rb_eArgError, "expected Module/Class but found %s.", rb_obj_classname(ext_module)); } packer_proc = Qnil; unpacker_proc = Qnil; if(packer_arg != Qnil) { packer_proc = rb_funcall(packer_arg, rb_intern("to_proc"), 0); } if(unpacker_arg != Qnil) { if(rb_type(unpacker_arg) == T_SYMBOL || rb_type(unpacker_arg) == T_STRING) { unpacker_proc = rb_obj_method(ext_module, unpacker_arg); } else { unpacker_proc = rb_funcall(unpacker_arg, rb_intern("method"), 1, ID2SYM(rb_intern("call"))); } } msgpack_packer_ext_registry_put(&fc->pkrg, ext_module, ext_type, packer_proc, packer_arg); if (ext_module == rb_cSymbol) { fc->has_symbol_ext_type = true; } msgpack_unpacker_ext_registry_put(&fc->ukrg, ext_module, ext_type, unpacker_proc, unpacker_arg); return Qnil; }