a „oe&ˆã;@s˜dZddlZddlZGdd„deƒZGdd„deƒZdZdZGdd„dƒZGd d „d eƒZ Gd d „d eƒZ Gd d„deƒZ Gdd„deƒZ Gdd„de ƒZ Gdd„de ƒZGdd„de ƒZGdd„de ƒZGdd„de ƒZGdd„de ƒZGdd„de ƒZGdd „d e ƒZGd!d"„d"e ƒZGd#d$„d$e ƒZGd%d&„d&eƒZGd'd(„d(e ƒZGd)d*„d*e ƒZd+d,d-d.d/d0d1d2d3d4d5d3d3d3d3d3d3d3d3d3d3d6œZGd7d8„d8eƒZedd9fedd9fedd9fed9d9fed9d9fed9d9fed9d9fed9d9fed9d9fed9d9fedfe d9dfedfedfedfedfedfedfedfedfedfedfedfed9d9fed9d9fedfedfedfedfedfedfe dfe dfe dfe dfe dfe d9fe d9fe d9fe d9fe d9fe d9fe d9fe d9fe dfe dfedd9fedd9fedd9fedd9fedd9fedd9fed:d:feddfedd9fedd9fedd9fd;œ9Ze ¡D]Zedfee<�q.dd?„d?ƒZ Gd@dA„dAƒZ!GdBdC„dCƒZ"dDdE„Z#dFdG„Z$dHdI„Z%dJdK„Z&dS)La»Utilities for makegw - Parse a header file to build an interface This module contains the core code for parsing a header file describing a COM interface, and building it into an "Interface" structure. Each Interface has methods, and each method has arguments. Each argument knows how to use Py_BuildValue or Py_ParseTuple to exchange itself with Python. See the @win32com.makegw@ module for information in building a COM interface éNcseZdZd‡fdd„ Z‡ZS)Úerror_not_foundú%The requested item could not be foundcstt|ƒ |¡dS©N)ÚsuperrÚ__init__©ÚselfÚmsg©Ú __class__©úr/rr$r;r r r ÚGetBuildForGatewayPostCode½s  z'ArgFormatter.GetBuildForGatewayPostCodecCsd| ¡|jj|jjfS)Nz$// @pyparm %s|%s||Description for %s)Ú_GetPythonTypeDescrr$r'r r r ÚGetAutoduckStringÅs ýzArgFormatter.GetAutoduckStringcCsdS)zJReturns a string with the description of the type. Used for doco purposesNr r'r r r r@ÌszArgFormatter._GetPythonTypeDesccCsdS)z5Determines if this arg forces a USES_CONVERSION macrorr r'r r r ÚNeedUSES_CONVERSIONÐsz ArgFormatter.NeedUSES_CONVERSIONN)r)rrrÚ__doc__rr"r%r(r)r-r0r1r,r4r#r6r7r8r=r>r?rAr@rBr r r r r$s*   rc@sLeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)ÚArgFormatterFloatcCsdS)NÚfr r'r r r Ú GetFormatChar×szArgFormatterFloat.GetFormatCharcCs d|jjS)Nz double dbl%s; r&r'r r r r6Úsz4ArgFormatterFloat.DeclareParseArgTupleInputConvertercCs d|jjS©Nz&dblr&r'r r r r)Þsz"ArgFormatterFloat.GetParseTupleArgcCsdS)NÚfloatr r'r r r r@ász$ArgFormatterFloat._GetPythonTypeDesccCs d|jjSrGr&r'r r r r(äsz"ArgFormatterFloat.GetBuildValueArgcCsd|jjd|jjdS)Nz dblú = ú; r&r'r r r r8çsz-ArgFormatterFloat.GetBuildForInterfacePreCodecCs(d|jj| | ¡d¡|jjdS)Nz dbl%s = rrJ©rr$r"r#r'r r r r=ês ÿþýÿz+ArgFormatterFloat.GetBuildForGatewayPreCodecCs>d}|jr|| | ¡d¡}||jj}|d|jj}|S)Nú rz = (float)dbl%s; ©rr"r#rr$r;r r r r7òs  z"ArgFormatterFloat.GetParsePostCodeN© rrrrFr6r)r@r(r8r=r7r r r r rDÖsrDc@sLeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dS)ÚArgFormatterShortcCsdS)NÚir r'r r r rFþszArgFormatterShort.GetFormatCharcCs d|jjS)Nz INT i%s; r&r'r r r r6sz4ArgFormatterShort.DeclareParseArgTupleInputConvertercCs d|jjS©Nz&ir&r'r r r r)sz"ArgFormatterShort.GetParseTupleArgcCsdS)NÚintr r'r r r r@sz$ArgFormatterShort._GetPythonTypeDesccCs d|jjSrQr&r'r r r r( sz"ArgFormatterShort.GetBuildValueArgcCsd|jjd|jjdS)Nz irIrJr&r'r r r r8sz-ArgFormatterShort.GetBuildForInterfacePreCodecCs(d|jj| | ¡d¡|jjdS)Nz i%s = rrJrKr'r r r r=s ÿþýÿz+ArgFormatterShort.GetBuildForGatewayPreCodecCs>d}|jr|| | ¡d¡}||jj}|d|jj}|S)NrLrz = i%s; rMr;r r r r7s  z"ArgFormatterShort.GetParsePostCodeNrNr r r r rOýsrOc@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dS)ÚArgFormatterLONG_PTRcCsdS©NÚOr r'r r r rF$sz"ArgFormatterLONG_PTR.GetFormatCharcCs d|jjS©Nz PyObject *ob%s; r&r'r r r r6'sz7ArgFormatterLONG_PTR.DeclareParseArgTupleInputConvertercCs d|jjS©Nz&obr&r'r r r r)+sz%ArgFormatterLONG_PTR.GetParseTupleArgcCsdS)Nzint/longr r'r r r r@.sz'ArgFormatterLONG_PTR._GetPythonTypeDesccCs d|jjS©NÚobr&r'r r r r(1sz%ArgFormatterLONG_PTR.GetBuildValueArgcCs d|jjS©Nz Py_XDECREF(ob%s); r&r'r r r r>4sz1ArgFormatterLONG_PTR.GetBuildForInterfacePostCodecCsd|jj| dd¡fS)Nz^ if (bPythonIsHappy && !PyWinLong_AsULONG_PTR(ob%s, (ULONG_PTR *)%s)) bPythonIsHappy = FALSE; é©rr$r%r'r r r r77sÿÿz%ArgFormatterLONG_PTR.GetParsePostCodecCs| dd¡}d|jj|fS)Nrz' ob%s = PyWinObject_FromULONG_PTR(%s); ©r%rr$©rZ notdirectedr r r r8=s  þz0ArgFormatterLONG_PTR.GetBuildForInterfacePreCodecCs d|jjSrZr&r'r r r r?Dsz/ArgFormatterLONG_PTR.GetBuildForGatewayPostCodeN) rrrrFr6r)r@r(r>r7r8r?r r r r rS#srSc@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)ÚArgFormatterPythonCOMz:An arg formatter for types exposed in the PythonCOM modulecCsdSrTr r'r r r rFKsz#ArgFormatterPythonCOM.GetFormatCharcCs d|jjSrVr&r'r r r r6Qsz8ArgFormatterPythonCOM.DeclareParseArgTupleInputConvertercCs d|jjSrWr&r'r r r r)Usz&ArgFormatterPythonCOM.GetParseTupleArgcCs d|jjS)Nz©rÚtyper'r r r r@Xsz(ArgFormatterPythonCOM._GetPythonTypeDesccCs d|jjSrXr&r'r r r r([sz&ArgFormatterPythonCOM.GetBuildValueArgcCs d|jjSrZr&r'r r r r>^sz2ArgFormatterPythonCOM.GetBuildForInterfacePostCodeN) rrrrCrFr6r)r@r(r>r r r r r_Hsr_c@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚArgFormatterBSTRcCsdS©Nz r r'r r r r@csz#ArgFormatterBSTR._GetPythonTypeDesccCsd|jj| dd¡fS©NzN if (bPythonIsHappy && !PyWinObject_AsBstr(ob%s, %s)) bPythonIsHappy = FALSE; r[r\r'r r r r7fsÿÿz!ArgFormatterBSTR.GetParsePostCodecCs| dd¡}d|jj|fS)Nrz ob%s = MakeBstrToObj(%s); r]r^r r r r8ls z,ArgFormatterBSTR.GetBuildForInterfacePreCodecCsd|jjft |¡S)Nú SysFreeString(%s); ©rr$r_r>r'r r r r>ps ÿþz-ArgFormatterBSTR.GetBuildForInterfacePostCodecCs d|jjSrZr&r'r r r r?usz+ArgFormatterBSTR.GetBuildForGatewayPostCodeN)rrrr@r7r8r>r?r r r r rbbs rbc@sDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)ÚArgFormatterOLECHARcCsdSrcr r'r r r r@zsz&ArgFormatterOLECHAR._GetPythonTypeDesccCs@|jjdd…dkr4|jjdd…|jjdd…S|jjSdS©NéZLPCr[©rrar2r'r r r r,}s z"ArgFormatterOLECHAR.GetUnconstTypecCsd|jj| dd¡fSrdr\r'r r r r7ƒsÿÿz$ArgFormatterOLECHAR.GetParsePostCodecCsd| dd¡S)Nrer©r%r'r r r r0‰sz*ArgFormatterOLECHAR.GetInterfaceArgCleanupcCs| |jd¡}d|jj|fS)Nrz ob%s = MakeOLECHARToObj(%s); ©r%rrr$r^r r r r8Œsz/ArgFormatterOLECHAR.GetBuildForInterfacePreCodecCsd|jjft |¡S)Nú CoTaskMemFree(%s); rfr'r r r r>‘s ÿþz0ArgFormatterOLECHAR.GetBuildForInterfacePostCodecCs d|jjSrZr&r'r r r r?—sz.ArgFormatterOLECHAR.GetBuildForGatewayPostCodeN© rrrr@r,r7r0r8r>r?r r r r rgysrgc@sDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)ÚArgFormatterTCHARcCsdS)Nzstring/r r'r r r r@œsz$ArgFormatterTCHAR._GetPythonTypeDesccCs@|jjdd…dkr4|jjdd…|jjdd…S|jjSdSrhrjr'r r r r,Ÿs z ArgFormatterTCHAR.GetUnconstTypecCsd|jj| dd¡fS)NzO if (bPythonIsHappy && !PyWinObject_AsTCHAR(ob%s, %s)) bPythonIsHappy = FALSE; r[r\r'r r r r7¥sÿÿz"ArgFormatterTCHAR.GetParsePostCodecCsd| dd¡S)Nz PyWinObject_FreeTCHAR(%s); rrkr'r r r r0«sz(ArgFormatterTCHAR.GetInterfaceArgCleanupcCs| |jd¡}d|jj|fS)Nrz# ob%s = PyWinObject_FromTCHAR(%s); rlr^r r r r8®sz-ArgFormatterTCHAR.GetBuildForInterfacePreCodecCsdS)Nz// ??? - TCHAR post code r r'r r r r>³sz.ArgFormatterTCHAR.GetBuildForInterfacePostCodecCs d|jjSrZr&r'r r r r?¶sz,ArgFormatterTCHAR.GetBuildForGatewayPostCodeNrnr r r r ro›sroc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚArgFormatterIIDcCsdS)Nz r r'r r r r@»sz"ArgFormatterIID._GetPythonTypeDesccCsd|jj|jjfS)Nz< if (!PyWinObject_AsIID(ob%s, &%s)) bPythonIsHappy = FALSE; r&r'r r r r7¾sþz ArgFormatterIID.GetParsePostCodecCs| dd¡}d|jj|fS)Nrz! ob%s = PyWinObject_FromIID(%s); r]r^r r r r8Äs z+ArgFormatterIID.GetBuildForInterfacePreCodecCs|jjd|jjfS)NzIID %sr&r'r r r r-Ész)ArgFormatterIID.GetInterfaceCppObjectInfoN)rrrr@r7r8r-r r r r rpºsrpc@s6eZdZd dd„Zdd„Zdd„Zdd „Zd d „Zd S)ÚArgFormatterTimercCsP|jdkr<|jdd…dkr<|jdd…|_|jd|_d}t ||||¡dS)Nrr[ZLPr)r+r2r_rrr r r rÎs ÿzArgFormatterTime.__init__cCsdS)Nzr r'r r r r@Ùsz#ArgFormatterTime._GetPythonTypeDesccCs d|jj|jj| |jd¡fS)Nz if (!PyTime_Check(ob%s)) { PyErr_SetString(PyExc_TypeError, "The argument must be a PyTime object"); bPythonIsHappy = FALSE; } if (!((PyTime *)ob%s)->GetTime(%s)) bPythonIsHappy = FALSE; r)rr$r%rr'r r r r7Üs ýÿÿz!ArgFormatterTime.GetParsePostCodecCs| |jd¡}d|jj|fS)Nrz ob%s = new PyTime(%s); rlr^r r r r8èsz,ArgFormatterTime.GetBuildForInterfacePreCodecCs0d}|j|jjdkr"d|jj}|t |¡S)Nrrrm)rrr+r$r_r>©rÚretr r r r>ís z-ArgFormatterTime.GetBuildForInterfacePostCodeN)r)rrrrr@r7r8r>r r r r rqÍs   rqc@s$eZdZdd„Zdd„Zdd„ZdS)ÚArgFormatterSTATSTGcCsdS)Nz r r'r r r r@÷sz&ArgFormatterSTATSTG._GetPythonTypeDesccCsd|jj| dd¡fS)NzM if (!PyCom_PyObjectAsSTATSTG(ob%s, %s, 0/*flags*/)) bPythonIsHappy = FALSE; rr\r'r r r r7úsÿÿz$ArgFormatterSTATSTG.GetParsePostCodecCs(| dd¡}d|jj| dd¡||fS)NrzŠ ob%s = PyCom_PyObjectFromSTATSTG(%s); // STATSTG doco says our responsibility to free if ((%s).pwcsName) CoTaskMemFree((%s).pwcsName); r]r^r r r r8s  üÿÿz/ArgFormatterSTATSTG.GetBuildForInterfacePreCodeN©rrrr@r7r8r r r r rtösrtc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚArgFormatterGenericcCs d|jjS©Nzr`r'r r r r@sz&ArgFormatterGeneric._GetPythonTypeDesccCsd|jj|jj| dd¡fS)Nz7 if (!PyObject_As%s(ob%s, &%s) bPythonIsHappy = FALSE; r)rrar$r%r'r r r r7s  ýz$ArgFormatterGeneric.GetParsePostCodecCsd|jj|jjfS)Nz PyObject_Free%s(%s); )rrar$r'r r r r0sz*ArgFormatterGeneric.GetInterfaceArgCleanupcCs*| dd¡}d|jj|jj| dd¡fS)Nrz ob%s = PyObject_From%s(%s); )r%rr$rar^r r r r8s   ýz/ArgFormatterGeneric.GetBuildForInterfacePreCodeN©rrrr@r7r0r8r r r r rv srvc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚArgFormatterIDLISTcCsdS)Nz r r'r r r r@%sz%ArgFormatterIDLIST._GetPythonTypeDesccCsd|jj| dd¡fS)NzL if (bPythonIsHappy && !PyObject_AsPIDL(ob%s, &%s)) bPythonIsHappy = FALSE; rr\r'r r r r7(sÿÿz#ArgFormatterIDLIST.GetParsePostCodecCsd|jjfS)Nz PyObject_FreePIDL(%s); r&r'r r r r0.sz)ArgFormatterIDLIST.GetInterfaceArgCleanupcCs$| dd¡}d|jj| dd¡fS)Nrz ob%s = PyObject_FromPIDL(%s); r]r^r r r r81s   þz.ArgFormatterIDLIST.GetBuildForInterfacePreCodeNrxr r r r ry$sryc@s$eZdZdd„Zdd„Zdd„ZdS)ÚArgFormatterHANDLEcCsdS)Nz r r'r r r r@:sz%ArgFormatterHANDLE._GetPythonTypeDesccCsd|jj| dd¡fS)NzE if (!PyWinObject_AsHANDLE(ob%s, &%s, FALSE) bPythonIsHappy = FALSE; rr\r'r r r r7=sÿÿz#ArgFormatterHANDLE.GetParsePostCodecCs$| dd¡}d|jj| dd¡fS)Nrz$ ob%s = PyWinObject_FromHANDLE(%s); rr]r^r r r r8Cs   þz.ArgFormatterHANDLE.GetBuildForInterfacePreCodeNrur r r r rz9srzc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) ÚArgFormatterLARGE_INTEGERcCsdS)NÚ LARGE_INTEGERr r'r r r Ú GetKeyNameLsz$ArgFormatterLARGE_INTEGER.GetKeyNamecCs d| ¡Srw)r}r'r r r r@Osz,ArgFormatterLARGE_INTEGER._GetPythonTypeDesccCsd| ¡|jj| dd¡fS)Nz: if (!PyWinObject_As%s(ob%s, %s)) bPythonIsHappy = FALSE; r)r}rr$r%r'r r r r7Rs  ýz*ArgFormatterLARGE_INTEGER.GetParsePostCodecCs"| dd¡}d|jj| ¡|fS)Nrz ob%s = PyWinObject_From%s(%s); )r%rr$r}r^r r r r8Ys  ýz5ArgFormatterLARGE_INTEGER.GetBuildForInterfacePreCodeN)rrrr}r@r7r8r r r r r{Ksr{c@seZdZdd„ZdS)ÚArgFormatterULARGE_INTEGERcCsdS)NÚULARGE_INTEGERr r'r r r r}csz%ArgFormatterULARGE_INTEGER.GetKeyNameN)rrrr}r r r r r~bsr~c@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚArgFormatterInterfacecCs$| d|jj¡d| ¡|jjffS)Nrz%s * %s)r%rr+r,r$r'r r r r-hsþz/ArgFormatterInterface.GetInterfaceCppObjectInfocCs6|jr| dd¡}n | dd¡}d|jj|jj|fS)Nr[rz‰ if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(ob%s, IID_%s, (void **)%s, TRUE /* bNoneOK */)) bPythonIsHappy = FALSE; )rr%rr$ra)rZsArgr r r r7ns ÿÿz&ArgFormatterInterface.GetParsePostCodecCsd|jj|jj|jjfS)Nz7 ob%s = PyCom_PyObjectFromIUnknown(%s, IID_%s, FALSE); )rr$rar'r r r r8zs ýz1ArgFormatterInterface.GetBuildForInterfacePreCodecCs,| | ¡d¡}d|jj||jj|jjfS)Nrz8 ob%s = PyCom_PyObjectFromIUnknown(%s%s, IID_%s, TRUE); )r"r#rr$ra)rZsPrefixr r r r=�süz/ArgFormatterInterface.GetBuildForGatewayPreCodecCsd|jj|jjfS)Nz if (%s) %s->Release(); r&r'r r r r0Šsz,ArgFormatterInterface.GetInterfaceArgCleanupN)rrrr-r7r8r=r0r r r r r€gs   r€c@s$eZdZdd„Zdd„Zdd„ZdS)ÚArgFormatterVARIANTcCsd|jj| dd¡fS)NzG if ( !PyCom_VariantFromPyObject(ob%s, %s) ) bPythonIsHappy = FALSE; rr\r'r r r r7�sÿÿz$ArgFormatterVARIANT.GetParsePostCodecCs| dd¡}d|jj|fS)Nrz' ob%s = PyCom_PyObjectFromVariant(%s); r]r^r r r r=•s  þz-ArgFormatterVARIANT.GetBuildForGatewayPreCodecCs d|jjSrZr&r'r r r r?œsz.ArgFormatterVARIANT.GetBuildForGatewayPostCodeN)rrrr7r=r?r r r r r�Žsr�)ÚBOOLrRrP)ÚUINTrRrP)ÚBYTErRrP)ÚINTrRrP)ÚDWORDrRÚl)ÚHRESULTrRr‡)ÚULONGrRr‡)ÚLONGrRr‡)rRrRrP)ÚlongrRr‡)ÚDISPIDr‹r‡)r‚rƒr„r…r†rˆr‰rŠrRr‹rŒZ APPBREAKFLAGSZBREAKRESUMEACTIONZERRORRESUMEACTIONZ BREAKREASONZBREAKPOINT_STATEZBREAKRESUME_ACTIONZSOURCE_TEXT_ATTRZ TEXT_DOC_ATTRZ QUERYOPTIONZ PARSEACTIONc@s eZdZdZdd„Zdd„ZdS)ÚArgFormatterSimplez-An arg formatter for simple integer etc typescCst|jjdS)Nr[©ÚConvertSimpleTypesrrar'r r r rF¾sz ArgFormatterSimple.GetFormatCharcCst|jjdSr3rŽr'r r r r@Ász%ArgFormatterSimple._GetPythonTypeDescN)rrrrCrFr@r r r r r�»sr�rr[)9z const OLECHARZWCHARZOLECHARZ LPCOLESTRZLPOLESTRZLPCWSTRZLPWSTRZLPCSTRZLPTSTRZLPCTSTRZHANDLEZBSTRú const IIDZCLSIDZIIDZGUIDz const GUIDr�ZREFCLSIDZREFIIDZREFGUIDzconst FILETIMEzconst SYSTEMTIMEzconst LPSYSTEMTIMEZ LPSYSTEMTIMEZFILETIMEZ SYSTEMTIMEZSTATSTGr|rZVARIANTrHZsingleZshortZWORDZ VARIANT_BOOLZHWNDZHMENUZHOLEMENUZHICONZHDCZLPARAMZWPARAMZLRESULTrƒZSVSIFZControlZ DataObjectZ _PropertyBagZ AsyncPropZ DataSourceZ DataFormatzvoid **Z ITEMIDLISTZ LPITEMIDLISTZ LPCITEMIDLISTzconst ITEMIDLISTcCs˜zNt|jd}t|jd}d}tt|jƒdkrBt|jd}||||ƒWSty’|jddkrzt|ddƒYStd|j|jfƒ‚Yn0dS)Nrrr[ÚIzThe type '%s' (%s) is unknown.)Ú AllConvertersraÚlenÚKeyErrorr€rr$)rZclzÚbinZdeclr r r Úmake_arg_converters ÿr–c@s:eZdZdZe d¡Zdd„Zdd„Zdd„Z d d „Z d S) ÚArgumentzíA representation of an argument to a COM method This class contains information about a specific argument to a method. In addition, methods exist so that an argument knows how to convert itself to/from Python arguments. z6/\* \[([^\]]*.*?)] \*/[ \t](.*[* ]+)(\w+)(\[ *])?[\),]cCs(||_d|_|_|_d|_d|_dSr)Úgood_interface_namesÚinoutr$raÚconstÚ arrayDecl©rr˜r r r r&szArgument.__init__cCsP| ¡}|j |¡}|st‚| d¡|_| d¡ d¡|_| d¡ ¡}||_ d|_ | d¡r¢d|_ z*|  d¡}|j d|_ |d|… ¡}Wnt y Yn0| dd ¡}z*|  d ¡}|j d|_ |d|… ¡}Wq®t yîYqòYq®0q®||_|jdd …d k�r|jd d…|_n|j|_t�rLtd |j|jd |j |jfƒdS)zØParse and build my data from a file Reads the next line in the file, and matches it as an argument description. If not a valid argument line, an error_not_found exception is raised. rirz][r[rr9Z __RPC_FARNrr ézconst z Arg %s of type %s%s (%s))ÚreadlineÚregexÚsearchrÚgroupr$Úsplitr™ÚstripÚraw_typer+r›ÚrindexÚ ValueErrorÚreplacerar2ÚVERBOSEr5)rÚfileÚlineÚmoÚtypÚposr r r Ú BuildFromFile,sD           ÿÿzArgument.BuildFromFilecCs ||jvS)aDetermines if the argument has the specific attribute. Argument attributes are specified in the header file, such as "[in][out][retval]" etc. You can pass a specific string (eg "out") to find if this attribute was specified for the argument )r™)rr¬r r r Ú HasAttributeYszArgument.HasAttributecCs"d|j|jf}|jr|d}|S)Nr*z[])r¤r$r›rrr r r ÚGetRawDeclarationbszArgument.GetRawDeclarationN) rrrrCÚreÚcompilerŸrr®r¯r°r r r r r—s  - r—c@s*eZdZdZe d¡Zdd„Zdd„ZdS)ÚMethodzŸA representation of a C++ method on a COM interface This class contains information about a specific method, as well as a list of all @Argument@s z+virtual (/\*.*?\*/ )?(.*?) (.*?) (.*?)\(\w?cCs"||_d|_|_|_g|_dSr)r˜r$ÚresultZcallconvÚargsrœr r r rtszMethod.__init__cCs¶| ¡}|j |¡}|st‚| d¡|_| d¡|_|jdkrt|jdkrRtdƒntd|jƒtd|j|jfƒt|j ƒ}z|  |¡|j   |¡Wqtty®Yq²Yqt0qtdS) zÓParse and build my data from a file Reads the next line in the file, and matches it as a method description. If not a valid method line, an error_not_found exception is raised. r9r[rˆr†zBWarning: Old style interface detected - compilation errors likely!z4Method %s - Only HRESULT return types are supported.z Method %s %s(N) ržrŸr rr¡r$r´r5r—r˜r®rµÚappend)rr©rªr«rr r r r®ys*     ÿÿ   zMethod.BuildFromFileN) rrrrCr±r²rŸrr®r r r r r³is r³c@s*eZdZdZe d¡Zdd„Zdd„ZdS)Ú Interfacez”A representation of a C++ COM Interface This class contains information about a specific interface, as well as a list of all @Method@s z#(interface|) ([^ ]*) : public (.*)$cCs:g|_| d¡|_| d¡|_tr6td|j|jfƒdS)Nr[rizInterface %s : public %s)Úmethodsr¡r$Úbaser¨r5)rr«r r r r¥s   zInterface.__init__cCsT| ¡| ¡z&t|jgƒ}| |¡|j |¡WqtyLYqPYq0qdS)z(Build all sub-methods for this interfaceN)ržr³r$r®r¸r¶r)rr©Úmethodr r r Ú BuildMethods¬s   zInterface.BuildMethodsN) rrrrCr±r²rŸrr»r r r r r·šs r·cCstd}| ¡}|rdtj |¡}|rZ| d¡}t|ƒtddft|<||krZt|ƒ}| |¡| ¡}q |rl|St ‚dS)zÆFind and return an interface in a file Given an interface name and file, search for the specified interface. Upon return, the interface itself has been built, but not the methods. Nr[rr) ržr·rŸr r¡r5r€r’r»r)Ú interfaceNamer©Z interfacerªr«r$r r r Úfind_interfaceºs    r½cCs6z t||ƒWStjy0t ¡tdƒYn0dS)z´Find, parse and return an interface in a file Given an interface name and file, search for the specified interface. Upon return, the interface itself is fully built, zCThe interface could not be built, as the regular expression failed!N)r½r±ÚerrorÚ tracebackÚ print_excr5)r¼r©r r r Úparse_interface_infoÓs  rÁcCs.tdƒ}ztd|ƒW| ¡n | ¡0dS)Nzd:\msdev\include\objidl.hZIPersistStream)ÚopenrÁÚclose)rEr r r Útestás rÄc CsP| |d¡}|dkrtdƒn.td|| d¡| d¡| d¡| d¡fƒdS) Nrrz ** Not foundz%d %s %s %s %srr[rir9)r r5r¡)ÚrÚtextÚresr r r Ú test_regexés   (ÿrÈ)'rCr±r¿Ú Exceptionrrr¨r/rrDrOrSr_rbrgrorprqrtrvryrzr{r~r€r�r�r�r’ÚkeysÚkeyr–r—r³r·r½rÁrÄrÈr r r r Úsè 3'&%")'ë Ç= O1