MCPcopy Create free account
hub / github.com/enthought/comtypes / ParseInterface

Method ParseInterface

comtypes/tools/tlbparser.py:261–323  ·  view source on GitHub ↗
(
        self, tinfo: typeinfo.ITypeInfo, ta: typeinfo.TYPEATTR
    )

Source from the content-addressed store, hash-verified

259
260 # TKIND_INTERFACE = 3
261 def ParseInterface(
262 self, tinfo: typeinfo.ITypeInfo, ta: typeinfo.TYPEATTR
263 ) -> Optional[typedesc.ComInterface]:
264 itf_name, itf_doc = tinfo.GetDocumentation(-1)[0:2]
265 assert ta.cImplTypes <= 1
266 if ta.cImplTypes == 0 and itf_name != "IUnknown":
267 # Windows defines an interface IOleControlTypes in ocidl.idl.
268 # Don't known what artefact that is - we ignore it.
269 # It's an interface without methods anyway.
270 if itf_name != "IOleControlTypes":
271 message = f"Ignoring interface {itf_name} which has no base interface"
272 import warnings
273
274 warnings.warn(message, UserWarning)
275 return None
276
277 iid = str(ta.guid)
278 idlflags = self.interface_type_flags(ta.wTypeFlags)
279 itf = typedesc.ComInterface(itf_name, None, iid, idlflags, itf_doc)
280 self._register(itf_name, itf)
281
282 if ta.cImplTypes:
283 hr = tinfo.GetRefTypeOfImplType(0)
284 tibase = tinfo.GetRefTypeInfo(hr)
285 itf.base = self.parse_typeinfo(tibase)
286
287 assert ta.cVars == 0, "vars on an Interface?"
288
289 members: list[tuple[int, typedesc.ComMethod]] = []
290 for i in range(ta.cFuncs):
291 fd = tinfo.GetFuncDesc(i)
292 func_name, func_doc = tinfo.GetDocumentation(fd.memid)[:2]
293 assert fd.funckind == typeinfo.FUNC_PUREVIRTUAL
294 returns = self.make_type(fd.elemdescFunc.tdesc, tinfo)
295 names = tinfo.GetNames(fd.memid, fd.cParams + 1)
296 names.append("rhs")
297 names = names[: fd.cParams + 1]
298 # function name first, then parameter names
299 assert len(names) == fd.cParams + 1
300 flags = self.func_flags(fd.wFuncFlags)
301 flags += self.inv_kind(fd.invkind)
302 mth = typedesc.ComMethod(
303 fd.invkind, fd.memid, func_name, returns, flags, func_doc
304 )
305 for j in range(fd.cParams):
306 elemdesc = fd.lprgelemdescParam[j]
307 typ = self.make_type(elemdesc.tdesc, tinfo)
308 name = names[j + 1]
309 paramdesc = elemdesc._.paramdesc
310 if paramdesc.wParamFlags & typeinfo.PARAMFLAG_FHASDEFAULT:
311 # XXX should be handled by VARIANT itself
312 default: Any = paramdesc.pparamdescex[0].varDefaultValue.value
313 else:
314 default = None
315 param_flags = self.param_flags(paramdesc.wParamFlags)
316 mth.add_argument(typ, name, param_flags, default)
317 members.append((fd.oVft, mth))
318 # Sort the methods by oVft (VTable offset): Some typeinfo

Callers 2

parse_typeinfoMethod · 0.95
_parse_DualInterfaceMethod · 0.95

Calls 15

interface_type_flagsMethod · 0.95
_registerMethod · 0.95
parse_typeinfoMethod · 0.95
make_typeMethod · 0.95
func_flagsMethod · 0.95
inv_kindMethod · 0.95
param_flagsMethod · 0.95
add_argumentMethod · 0.95
extend_membersMethod · 0.95
ComInterfaceMethod · 0.80
GetRefTypeOfImplTypeMethod · 0.80
GetRefTypeInfoMethod · 0.80

Tested by

no test coverage detected