- def wrapIid(self, interface, method, riid, out):
- print ' if (%s && *%s) {' % (out.name, out.name)
- print ' if (*%s == m_pInstance) {' % (out.name,)
- print ' *%s = this;' % (out.name,)
- print ' }'
- for iface in self.api.getAllInterfaces():
- print r' else if (%s == IID_%s) {' % (riid.name, iface.name)
- print r' *%s = new Wrap%s((%s *) *%s);' % (out.name, iface.name, iface.name, out.name)
- print r' }'
- print r' else {'
- print r' os::log("apitrace: warning: %s::%s: unknown IID {0x%08lX,0x%04X,0x%04X,{0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X}}\n",'
- print r' "%s", "%s",' % (interface.name, method.name)
- print r' %s.Data1, %s.Data2, %s.Data3,' % (riid.name, riid.name, riid.name)
- print r' %s.Data4[0],' % (riid.name,)
- print r' %s.Data4[1],' % (riid.name,)
- print r' %s.Data4[2],' % (riid.name,)
- print r' %s.Data4[3],' % (riid.name,)
- print r' %s.Data4[4],' % (riid.name,)
- print r' %s.Data4[5],' % (riid.name,)
- print r' %s.Data4[6],' % (riid.name,)
- print r' %s.Data4[7]);' % (riid.name,)
+ def implementIidWrapper(self, api):
+ print r'static void'
+ print r'warnIID(const char *functionName, REFIID riid, const char *reason) {'
+ print r' os::log("apitrace: warning: %s: %s IID {0x%08lX,0x%04X,0x%04X,{0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X}}\n",'
+ print r' functionName, reason,'
+ print r' riid.Data1, riid.Data2, riid.Data3,'
+ print r' riid.Data4[0], riid.Data4[1], riid.Data4[2], riid.Data4[3], riid.Data4[4], riid.Data4[5], riid.Data4[6], riid.Data4[7]);'
+ print r'}'
+ print
+ print r'static void'
+ print r'wrapIID(const char *functionName, REFIID riid, void * * ppvObj) {'
+ print r' if (!ppvObj || !*ppvObj) {'
+ print r' return;'
+ print r' }'
+ else_ = ''
+ for iface in api.getAllInterfaces():
+ print r' %sif (riid == IID_%s) {' % (else_, iface.name)
+ print r' *ppvObj = new Wrap%s((%s *) *ppvObj);' % (iface.name, iface.name)
+ print r' }'
+ else_ = 'else '
+ print r' %s{' % else_
+ print r' warnIID(functionName, riid, "unknown");'
+ print r' }'
+ print r'}'
+ print
+
+ def wrapIid(self, function, riid, out):
+ # Cast output arg to `void **` if necessary
+ out_name = out.name
+ obj_type = out.type.type.type
+ if not obj_type is stdapi.Void:
+ assert isinstance(obj_type, stdapi.Interface)
+ out_name = 'reinterpret_cast<void * *>(%s)' % out_name
+
+ print r' if (%s && *%s) {' % (out.name, out.name)
+ functionName = function.name
+ else_ = ''
+ if self.interface is not None:
+ functionName = self.interface.name + '::' + functionName
+ print r' if (*%s == m_pInstance &&' % (out_name,)
+ print r' (%s)) {' % ' || '.join('%s == IID_%s' % (riid.name, iface.name) for iface in self.interface.iterBases())
+ print r' *%s = this;' % (out_name,)