home *** CD-ROM | disk | FTP | other *** search
/ c't freeware shareware 1997 / CT_SW_97.ISO / mac / Software / entwickl / win95 / pythowin.exe / DATA.3 / win32com / makegw.py < prev    next >
Text File  |  1996-12-12  |  5KB  |  182 lines

  1. #
  2. # Utility functions for writing out gateway C++ files
  3. #
  4. # make_interface(name, method_names)
  5. #   Write out a .cpp and a .h file (into the current directory) for an
  6. #   interface with the given name and given list of method names.
  7. #
  8.  
  9. import regsub
  10.  
  11.  
  12. def make_interface(name, method_names):
  13.   _write_ifc_h(name, method_names)
  14.   _write_ifc_cpp(name, method_names)
  15.  
  16. def make_gateway(name, method_names):
  17.   _write_gw_h(name, method_names)
  18.   _write_gw_cpp(name, method_names)
  19.  
  20.  
  21. ###########################################################################
  22. #
  23. # INTERNAL FUNCTIONS
  24. #
  25. #
  26.  
  27. def _write_ifc_h(name, method_names):
  28.   f = open('Py%s.h' % name, 'w')
  29.   f.write('''\
  30. class Py%s : public PyIUnknown
  31. {
  32. public:
  33.     MAKE_PYCOM_CTOR(Py%s);
  34.     static %s *GetI(PyObject *self);
  35.     static PyComTypeObject type;
  36.  
  37.     // The Python methods
  38. ''' % (name, name, name))
  39.   for method in method_names:
  40.     f.write('\tstatic PyObject *%s(PyObject *self, PyObject *args);\n' % method)
  41.   f.write('''\
  42.  
  43. protected:
  44.     Py%s(IUnknown *pdisp);
  45.     ~Py%s();
  46. };
  47. ''' % (name, name))
  48.   f.close()
  49.  
  50. def _write_ifc_cpp(name, method_names):
  51.   f = open('Py%s.cpp' % name, 'w')
  52.   f.write('''\
  53. #include "stdafx.h"
  54. #include "PythonCOM.h"
  55. #include "Py%s.h"
  56.  
  57. Py%s::Py%s(IUnknown *pdisp):
  58.     PyIUnknown(pdisp)
  59. {
  60.     ob_type = &type;
  61. }
  62.  
  63. Py%s::~Py%s()
  64. {
  65. }
  66.  
  67. /* static */ %s *Py%s::GetI(PyObject *self)
  68. {
  69.     return (%s *)PyIUnknown::GetI(self);
  70. }
  71.  
  72. ''' % (name, name, name, name, name, name, name, name))
  73.  
  74.   ptr = regsub.gsub('[a-z]', '', name)
  75.   for method in method_names:
  76.     f.write('''\
  77. /* static */ PyObject *Py%s::%s(PyObject *self, PyObject *args)
  78. {
  79.     // ### add the arguments
  80.     if ( !PyArg_ParseTuple(args, ":%s") )
  81.         return NULL;
  82.  
  83.     %s *p%s = GetI(self);
  84.     if ( p%s == NULL )
  85.         return NULL;
  86.  
  87.     // ### coerce arguments to C++ types
  88.  
  89.     HRESULT hr = p%s->%s(/* ### pass args */);
  90.     if ( FAILED(hr) )
  91.         return OleSetOleError(hr);
  92.  
  93.     // ### coerce result to Python types
  94.  
  95.     Py_INCREF(Py_None);
  96.     return Py_None;
  97. }
  98.  
  99. ''' % (name, method, method, name, ptr, ptr, ptr, method))
  100.  
  101.   f.write('static struct PyMethodDef Py%s_methods[] =\n{\n' % name)
  102.   for method in method_names:
  103.     f.write('\t{ "%s", Py%s::%s, 1 },\n' % (method, name, method))
  104.  
  105.   f.write('''\
  106.     { NULL }
  107. };
  108.  
  109. PyComTypeObject Py%s::type("Py%s",
  110.         &PyIUnknown::type,
  111.         sizeof(Py%s),
  112.         Py%s_methods,
  113.         GET_PYCOM_CTOR(Py%s));
  114. ''' % (name, name, name, name, name))
  115.   f.close()
  116.  
  117.  
  118. def _write_gw_h(name, method_names):
  119.   gname = 'PyG' + name[1:]
  120.   f = open('%s.h' % gname, 'w')
  121.   f.write('''\
  122. class %s : public PyGatewayBase, public %s
  123. {
  124. protected:
  125.     %s(PyObject *instance) : PyGatewayBase(instance) { ; }
  126.     PYGATEWAY_MAKE_SUPPORT(%s, %s, IID_%s)
  127.  
  128.     // IUnknown and IDispatch
  129.     STDMETHOD_(ULONG,AddRef)(void);
  130.     STDMETHOD_(ULONG,Release)(void);
  131.     STDMETHOD(QueryInterface)(REFIID iid, void ** obj);
  132.     STDMETHOD(GetTypeInfoCount)(UINT FAR* pctInfo);
  133.     STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptInfo);
  134.     STDMETHOD(GetIDsOfNames)(REFIID refiid,    OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid);
  135.     STDMETHOD(Invoke)(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* params, VARIANT FAR* pVarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr);
  136.  
  137.     // %s
  138. ''' % (gname, name, gname, gname, name, name, name))
  139.  
  140.   for method in method_names:
  141.     f.write('\tSTDMETHOD(%s)(\n\t\tvoid);\n\n' % method)
  142.  
  143.   f.write('};\n')
  144.   f.close()
  145.  
  146. def _write_gw_cpp(name, method_names):
  147.   gname = 'PyG' + name[1:]
  148.   f = open('%s.cpp' % gname, 'w')
  149.   f.write('''\
  150. #include "stdafx.h"
  151. #include "%s.h"
  152.  
  153. // Std delegation
  154. STDMETHODIMP_(ULONG) %s::AddRef(void) {return PyGatewayBase::AddRef();}
  155. STDMETHODIMP_(ULONG) %s::Release(void) {return PyGatewayBase::Release();}
  156. STDMETHODIMP %s::QueryInterface(REFIID iid, void ** obj) {return PyGatewayBase::QueryInterface(iid, obj);}
  157. STDMETHODIMP %s::GetTypeInfoCount(UINT FAR* pctInfo) {return PyGatewayBase::GetTypeInfoCount(pctInfo);}
  158. STDMETHODIMP %s::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptInfo) {return PyGatewayBase::GetTypeInfo(itinfo, lcid, pptInfo);}
  159. STDMETHODIMP %s::GetIDsOfNames(REFIID refiid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid) {return PyGatewayBase::GetIDsOfNames( refiid, rgszNames, cNames, lcid, rgdispid);}
  160. STDMETHODIMP %s::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* params, VARIANT FAR* pVarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr) {return PyGatewayBase::Invoke( dispid, riid, lcid, wFlags, params, pVarResult, pexcepinfo, puArgErr);}
  161.  
  162. ''' % (gname, gname, gname, gname, gname, gname, gname, gname))
  163.  
  164.   for method in method_names:
  165.     f.write('''\
  166. STDMETHODIMP %s::%s(
  167.         void)
  168. {
  169.     // ### validate args and perform coercion
  170.     PyObject *result = DispatchViaPolicy("%s", NULL);
  171.     if ( result == NULL )
  172.         return PyCom_HandlePythonFailureToCOM();
  173.  
  174.     // ### coerce to C++ types and return
  175.  
  176.     Py_DECREF(result);
  177.     return S_OK;
  178. }
  179.  
  180. ''' % (gname, method, method))
  181.  
  182.   f.close()