home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyc (Python 2.6) import re import string import makegwparse def make_framework_support(header_file_name, interface_name, bMakeInterface = 1, bMakeGateway = 1): fin = open(header_file_name) try: interface = makegwparse.parse_interface_info(interface_name, fin) finally: fin.close() if bMakeInterface and bMakeGateway: desc = 'Interface and Gateway' elif bMakeInterface and not bMakeGateway: desc = 'Interface' else: desc = 'Gateway' if interface.name[:5] == 'IEnum': import win32com.makegw.makegwenum as win32com ifc_cpp_writer = win32com.makegw.makegwenum._write_enumifc_cpp gw_cpp_writer = win32com.makegw.makegwenum._write_enumgw_cpp else: ifc_cpp_writer = _write_ifc_cpp gw_cpp_writer = _write_gw_cpp fout = open('Py%s.cpp' % interface.name, 'w') try: fout.write('// This file implements the %s %s for Python.\n// Generated by makegw.py\n\n#include "shell_pch.h"\n' % (interface.name, desc)) fout.write('#include "Py%s.h"\n\n// @doc - This file contains autoduck documentation\n' % interface.name) if bMakeInterface: ifc_cpp_writer(fout, interface) if bMakeGateway: gw_cpp_writer(fout, interface) finally: fout.close() fout = open('Py%s.h' % interface.name, 'w') try: fout.write('// This file declares the %s %s for Python.\n// Generated by makegw.py\n' % (interface.name, desc)) if bMakeInterface: _write_ifc_h(fout, interface) if bMakeGateway: _write_gw_h(fout, interface) finally: fout.close() def _write_ifc_h(f, interface): f.write('// ---------------------------------------------------\n//\n// Interface Declaration\n\nclass Py%s : public Py%s\n{\npublic:\n\tMAKE_PYCOM_CTOR(Py%s);\n\tstatic %s *GetI(PyObject *self);\n\tstatic PyComTypeObject type;\n\n\t// The Python methods\n' % (interface.name, interface.base, interface.name, interface.name)) for method in interface.methods: f.write('\tstatic PyObject *%s(PyObject *self, PyObject *args);\n' % method.name) f.write('\nprotected:\n\tPy%s(IUnknown *pdisp);\n\t~Py%s();\n};\n' % (interface.name, interface.name)) def _write_ifc_cpp(f, interface): name = interface.name f.write('// ---------------------------------------------------\n//\n// Interface Implementation\n\nPy%(name)s::Py%(name)s(IUnknown *pdisp):\n\tPy%(base)s(pdisp)\n{\n\tob_type = &type;\n}\n\nPy%(name)s::~Py%(name)s()\n{\n}\n\n/* static */ %(name)s *Py%(name)s::GetI(PyObject *self)\n{\n\treturn (%(name)s *)Py%(base)s::GetI(self);\n}\n\n' % interface.__dict__) ptr = re.sub('[a-z]', '', interface.name) strdict = { 'interfacename': interface.name, 'ptr': ptr } for method in interface.methods: strdict['method'] = method.name f.write('// @pymethod |Py%(interfacename)s|%(method)s|Description of %(method)s.\nPyObject *Py%(interfacename)s::%(method)s(PyObject *self, PyObject *args)\n{\n\t%(interfacename)s *p%(ptr)s = GetI(self);\n\tif ( p%(ptr)s == NULL )\n\t\treturn NULL;\n' % strdict) argsParseTuple = argsCOM = formatChars = codePost = codePobjects = codeCobjects = cleanup = cleanup_gil = '' needConversion = 0 for arg in method.args: try: argCvt = makegwparse.make_arg_converter(arg) if arg.HasAttribute('in'): val = argCvt.GetFormatChar() if val: f.write('\t' + argCvt.GetAutoduckString() + '\n') formatChars = formatChars + val argsParseTuple = argsParseTuple + ', ' + argCvt.GetParseTupleArg() codePobjects = codePobjects + argCvt.DeclareParseArgTupleInputConverter() codePost = codePost + argCvt.GetParsePostCode() if not needConversion: pass needConversion = argCvt.NeedUSES_CONVERSION() cleanup = cleanup + argCvt.GetInterfaceArgCleanup() cleanup_gil = cleanup_gil + argCvt.GetInterfaceArgCleanupGIL() (comArgName, comArgDeclString) = argCvt.GetInterfaceCppObjectInfo() if comArgDeclString: codeCobjects = codeCobjects + '\t%s;\n' % comArgDeclString argsCOM = argsCOM + ', ' + comArgName continue except makegwparse.error_not_supported: why = None f.write('// *** The input argument %s of type "%s" was not processed ***\n// Please check the conversion function is appropriate and exists!\n' % (arg.name, arg.raw_type)) f.write('\t%s %s;\n\tPyObject *ob%s;\n' % (arg.type, arg.name, arg.name)) f.write('\t// @pyparm <o Py%s>|%s||Description for %s\n' % (arg.type, arg.name, arg.name)) codePost = codePost + '\tif (bPythonIsHappy && !PyObject_As%s( ob%s, &%s )) bPythonIsHappy = FALSE;\n' % (arg.type, arg.name, arg.name) formatChars = formatChars + 'O' argsParseTuple = argsParseTuple + ', &ob%s' % arg.name argsCOM = argsCOM + ', ' + arg.name cleanup = cleanup + '\tPyObject_Free%s(%s);\n' % (arg.type, arg.name) continue if needConversion: f.write('\tUSES_CONVERSION;\n') f.write(codePobjects) f.write(codeCobjects) f.write('\tif ( !PyArg_ParseTuple(args, "%s:%s"%s) )\n\t\treturn NULL;\n' % (formatChars, method.name, argsParseTuple)) if codePost: f.write('\tBOOL bPythonIsHappy = TRUE;\n') f.write(codePost) f.write('\tif (!bPythonIsHappy) return NULL;\n') strdict['argsCOM'] = argsCOM[1:] strdict['cleanup'] = cleanup strdict['cleanup_gil'] = cleanup_gil f.write('\tHRESULT hr;\n\tPY_INTERFACE_PRECALL;\n\thr = p%(ptr)s->%(method)s(%(argsCOM)s );\n%(cleanup)s\n\tPY_INTERFACE_POSTCALL;\n%(cleanup_gil)s\n\tif ( FAILED(hr) )\n\t\treturn PyCom_BuildPyException(hr, p%(ptr)s, IID_%(interfacename)s );\n' % strdict) codePre = codePost = formatChars = codeVarsPass = codeDecl = '' for arg in method.args: if not arg.HasAttribute('out'): continue try: argCvt = makegwparse.make_arg_converter(arg) formatChar = argCvt.GetFormatChar() if formatChar: formatChars = formatChars + formatChar codePre = codePre + argCvt.GetBuildForInterfacePreCode() codePost = codePost + argCvt.GetBuildForInterfacePostCode() codeVarsPass = codeVarsPass + ', ' + argCvt.GetBuildValueArg() codeDecl = codeDecl + argCvt.DeclareParseArgTupleInputConverter() continue except makegwparse.error_not_supported: why = None f.write('// *** The output argument %s of type "%s" was not processed ***\n// %s\n' % (arg.name, arg.raw_type, why)) continue continue if formatChars: f.write('%s\n%s\tPyObject *pyretval = Py_BuildValue("%s"%s);\n%s\treturn pyretval;' % (codeDecl, codePre, formatChars, codeVarsPass, codePost)) else: f.write('\tPy_INCREF(Py_None);\n\treturn Py_None;\n') f.write('\n}\n\n') f.write('// @object Py%s|Description of the interface\n' % name) f.write('static struct PyMethodDef Py%s_methods[] =\n{\n' % name) for method in interface.methods: f.write('\t{ "%s", Py%s::%s, 1 }, // @pymeth %s|Description of %s\n' % (method.name, interface.name, method.name, method.name, method.name)) interfacebase = interface.base f.write('\t{ NULL }\n};\n\nPyComTypeObject Py%(name)s::type("Py%(name)s",\n\t\t&Py%(interfacebase)s::type,\n\t\tsizeof(Py%(name)s),\n\t\tPy%(name)s_methods,\n\t\tGET_PYCOM_CTOR(Py%(name)s));\n' % locals()) def _write_gw_h(f, interface): if interface.name[0] == 'I': gname = 'PyG' + interface.name[1:] else: gname = 'PyG' + interface.name name = interface.name if interface.base == 'IUnknown' or interface.base == 'IDispatch': base_name = 'PyGatewayBase' elif interface.base[0] == 'I': base_name = 'PyG' + interface.base[1:] else: base_name = 'PyG' + interface.base f.write('// ---------------------------------------------------\n//\n// Gateway Declaration\n\nclass %s : public %s, public %s\n{\nprotected:\n\t%s(PyObject *instance) : %s(instance) { ; }\n\tPYGATEWAY_MAKE_SUPPORT2(%s, %s, IID_%s, %s)\n\n' % (gname, base_name, name, gname, base_name, gname, name, name, base_name)) if interface.base != 'IUnknown': f.write('\t// %s\n\t// *** Manually add %s method decls here\n\n' % (interface.base, interface.base)) else: f.write('\n\n') f.write('\t// %s\n' % name) for method in interface.methods: f.write('\tSTDMETHOD(%s)(\n' % method.name) if method.args: for arg in method.args[:-1]: f.write('\t\t%s,\n' % arg.GetRawDeclaration()) arg = method.args[-1] f.write('\t\t%s);\n\n' % arg.GetRawDeclaration()) continue f.write('\t\tvoid);\n\n') f.write('};\n') f.close() def _write_gw_cpp(f, interface): if interface.name[0] == 'I': gname = 'PyG' + interface.name[1:] else: gname = 'PyG' + interface.name name = interface.name if interface.base == 'IUnknown' or interface.base == 'IDispatch': base_name = 'PyGatewayBase' elif interface.base[0] == 'I': base_name = 'PyG' + interface.base[1:] else: base_name = 'PyG' + interface.base f.write('// ---------------------------------------------------\n//\n// Gateway Implementation\n' % { 'name': name, 'gname': gname, 'base_name': base_name }) for method in interface.methods: f.write('STDMETHODIMP %s::%s(\n' % (gname, method.name)) if method.args: for arg in method.args[:-1]: inoutstr = string.join(arg.inout, '][') f.write('\t\t/* [%s] */ %s,\n' % (inoutstr, arg.GetRawDeclaration())) arg = method.args[-1] inoutstr = string.join(arg.inout, '][') f.write('\t\t/* [%s] */ %s)\n' % (inoutstr, arg.GetRawDeclaration())) else: f.write('\t\tvoid)\n') f.write('{\n\tPY_GATEWAY_METHOD;\n') cout = 0 codePre = codePost = codeVars = '' argStr = '' needConversion = 0 formatChars = '' if method.args: for arg in method.args: if arg.HasAttribute('out'): cout = cout + 1 if arg.indirectionLevel == 2: f.write('\tif (%s==NULL) return E_POINTER;\n' % arg.name) if arg.HasAttribute('in'): try: argCvt = makegwparse.make_arg_converter(arg) argCvt.SetGatewayMode() formatchar = argCvt.GetFormatChar() if not needConversion: pass needConversion = argCvt.NeedUSES_CONVERSION() if formatchar: formatChars = formatChars + formatchar codeVars = codeVars + argCvt.DeclareParseArgTupleInputConverter() argStr = argStr + ', ' + argCvt.GetBuildValueArg() codePre = codePre + argCvt.GetBuildForGatewayPreCode() codePost = codePost + argCvt.GetBuildForGatewayPostCode() except makegwparse.error_not_supported: why = None f.write('// *** The input argument %s of type "%s" was not processed ***\n// - Please ensure this conversion function exists, and is appropriate\n// - %s\n' % (arg.name, arg.raw_type, why)) f.write('\tPyObject *ob%s = PyObject_From%s(%s);\n' % (arg.name, arg.type, arg.name)) f.write('\tif (ob%s==NULL) return MAKE_PYCOM_GATEWAY_FAILURE_CODE("%s");\n' % (arg.name, method.name)) codePost = codePost + '\tPy_DECREF(ob%s);\n' % arg.name formatChars = formatChars + 'O' argStr = argStr + ', ob%s' % arg.name except: None<EXCEPTION MATCH>makegwparse.error_not_supported None<EXCEPTION MATCH>makegwparse.error_not_supported if needConversion: f.write('\tUSES_CONVERSION;\n') f.write(codeVars) f.write(codePre) if cout: f.write('\tPyObject *result;\n') resStr = '&result' else: resStr = 'NULL' if formatChars: fullArgStr = '%s, "%s"%s' % (resStr, formatChars, argStr) else: fullArgStr = resStr f.write('\tHRESULT hr=InvokeViaPolicy("%s", %s);\n' % (method.name, fullArgStr)) f.write(codePost) if cout: f.write('\tif (FAILED(hr)) return hr;\n') f.write('\t// Process the Python results, and convert back to the real params\n') formatChars = codePobjects = codePost = argsParseTuple = '' needConversion = 0 for arg in method.args: if not arg.HasAttribute('out'): continue try: argCvt = makegwparse.make_arg_converter(arg) argCvt.SetGatewayMode() val = argCvt.GetFormatChar() if val: formatChars = formatChars + val argsParseTuple = argsParseTuple + ', ' + argCvt.GetParseTupleArg() codePobjects = codePobjects + argCvt.DeclareParseArgTupleInputConverter() codePost = codePost + argCvt.GetParsePostCode() if not needConversion: pass needConversion = argCvt.NeedUSES_CONVERSION() continue except makegwparse.error_not_supported: why = None f.write('// *** The output argument %s of type "%s" was not processed ***\n// %s\n' % (arg.name, arg.raw_type, why)) continue if codePost: f.write('\tBOOL bPythonIsHappy = TRUE;\n') f.write(codePost) f.write('\tif (!bPythonIsHappy) hr = MAKE_PYCOM_GATEWAY_FAILURE_CODE("%s");\n' % method.name) f.write('\tPy_DECREF(result);\n') f.write('\treturn hr;\n}\n\n') def test(): make_framework_support('d:\\msdev\\include\\objidl.h', 'IStorage')