a „oeÖmã@sdZddlZddlZddlZddlZddlZddlmZddl m Z dZ dZ dZ ejejejejejgZejejejejgZdd„Zdd „Zd d „ZejejZejejZ e!efZ"e j#Z$ej%fd d „Z&dd„Z'dd„Z(ddddej%fdd„Z)dd„Z*dddej%fdd„Z+Gdd„dƒZ,dS)a8Support for dynamic COM client support. Introduction Dynamic COM client support is the ability to use a COM server without prior knowledge of the server. This can be used to talk to almost all COM servers, including much of MS Office. In general, you should not use this module directly - see below. Example >>> import win32com.client >>> xl = win32com.client.Dispatch("Excel.Application") # The line above invokes the functionality of this class. # xl is now an object we can use to talk to Excel. >>> xl.Visible = 1 # The Excel window becomes visible. éN)ÚIIDTypeé)ÚbuildcGs$tr |D]}t|dd�qtƒdS©Nú )Úend)Ú debuggingÚprint©ÚargsÚarg©r ú8C:\Program Files\Certbot\pkgs\win32com\client\dynamic.pyÚ debug_print4srcGs$tr |D]}t|dd�qtƒdSr)Údebugging_attrr r r r rÚdebug_attr_print;srcCs t ||¡S©N)ÚtypesÚ MethodType)ÚfuncÚinstÚclsr r rÚ MakeMethodBsrc Cs`t|tƒr|St|tƒrPzt |¡}Wq\tjyLt |d|tj¡}Yq\0n t|d|ƒ}|S©NÚ_oleobj_) Ú isinstanceÚPyIDispatchTypeÚ_GoodDispatchTypesÚ pythoncomZconnectÚ ole_errorZCoCreateInstanceÚ IID_IDispatchÚgetattr)Ú IDispatchÚclsctxr r rÚ_GetGoodDispatchNs   ÿ  r$cCs.|durt|tƒr |}nt|ƒ}t||ƒ|fSr)rÚstrr$)r"ÚuserNamer#r r rÚ_GetGoodDispatchAndUserName_s  r'cCs(|r |js|S|jjtjkr |S|jjSr)ÚdescZdesckindrÚDESCKIND_VARDESCÚinvkind)ÚentryÚ invoke_typer r rÚ_GetDescInvokeTypeks  r-c Cs¬|dusJdƒ‚t|||ƒ\}}|dur,t}d}zF|durB| ¡}|durtz| ¡}||f}WntjyrYn0WntjyŽd}Yn0t|||ƒ}|||||d�S)Nú#this is deprecated and will go away)Úlazydata)r'Ú CDispatchÚ GetTypeInfoZ GetTypeComprÚ com_errorÚ MakeOleRepr) r"r&Ú createClassÚtypeinfoÚUnicodeToStringr#r/ÚtypecompÚolereprr r rÚDispatch{s$    r9cCs d}|durŒzj| ¡}|dtjkrN|dtj@rN| d¡}| |¡}| ¡}|durht ||dd¡}n t |d¡}Wntj yŠYn0|durœt ¡}|S)Néé éÿÿÿÿr) Ú GetTypeAttrrZTKIND_INTERFACEZTYPEFLAG_FDUALÚGetRefTypeOfImplTypeÚGetRefTypeInforÚ DispatchItemZLazyDispatchItemr)r"r5r7r8ÚattrZhrefr r rr3˜s& ÿ þ  r3cCs<|dusJdƒ‚t|||ƒ\}}|dur,t}||t ¡|ƒS)zDispatch with no type infoNr.)r'r0rr@)r"r&r4r6r#r r rÚ DumbDispatch³s rBc@seZdZd>dd„Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd?d$d%„Zd@d&d'„ZdAd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„ZdrÚ _username_Ú _olerepr_Ú_mapCachedItems_Ú_builtMethods_Ú_enum_Z_unicode_to_string_Ú _lazydata_)Ú__dict__)Úselfr"r8r&r6r/r r rÚ__init__Ãs       zCDispatch.__init__cGsn|jjr| |jj¡\}}ntjtjBtj}}|durb|t|df|}| |j j |Ž|jjd¡St dƒ‚dS)zJProvide 'default dispatch' COM functionality - allow instance to be calledNrú5This dispatch object does not define a default method) rDÚdefaultDispatchNameÚ_find_dispatch_type_rÚDISPATCH_METHODÚDISPATCH_PROPERTYGETÚ DISPID_VALUEÚLCIDÚ_get_good_object_rÚInvokeÚ TypeError)rJr r*ÚdispidÚallArgsr r rÚ__call__Òsÿ  þÿzCDispatch.__call__cCsdS)NTr ©rJr r rÚ__bool__äszCDispatch.__bool__cCs d|jS)Nú)rCrYr r rÚ__repr__észCDispatch.__repr__c CsNzt| ¡ƒWStjyH}z |jtvr,‚| ¡WYd}~Sd}~00dSr)r%rXrr2ÚhresultÚERRORS_BAD_CONTEXTr\)rJÚdetailsr r rÚ__str__ìs  zCDispatch.__str__cCsXt|j ¡ƒt|jƒ| ¡}z|dd„|jDƒ7}WntyJYn0tt|ƒƒS)NcSsg|] }|j‘qSr )ÚName)Ú.0Úpr r rÚ ùóz%CDispatch.__dir__..) ÚlistrIÚkeysÚdirÚ __class__Ú _dir_ole_Z Properties_ÚAttributeErrorÚset)rJZlstr r rÚ__dir__ös   zCDispatch.__dir__cCs>i}td|j ¡ƒD]}|j |¡}| ||¡qt| ¡ƒS©Nr)ÚrangerZGetTypeInfoCountr1Ú_UpdateWithITypeInfo_rfrg)rJÚ items_dictZiTIÚtypeInfor r rrjþs  zCDispatch._dir_ole_c Cs²|g}tjdi}t|ƒdkr®| ¡}| ¡}|j|vrd||j<td|jƒD].}| |¡}|  |j ¡d}||vrLd||<qLtd|j ƒD]"} |  | ¡} |  | ¡} | | ¡qˆqdSrn)rr ÚlenÚpopr=ZiidroZcFuncsZ GetFuncDescZGetNamesZmemidZ cImplTypesr>r?Úappend) rJrqrrZ typeInfosZ inspectedIIDsZtypeAttrZiFunZfunDescZfunNameZ iImplTypeZiRefTypeZ refTypeInfor r rrps         zCDispatch._UpdateWithITypeInfo_cCst|d|ƒ}|j|kSr©r!r©rJÚotherr r rÚ__eq__s zCDispatch.__eq__cCst|d|ƒ}|j|kSrrvrwr r rÚ__ne__"s zCDispatch.__ne__cCs t| ¡ƒSr)ÚintrXrYr r rÚ__int__&szCDispatch.__int__cCs0| d¡\}}|r$|j |t|d¡Stdƒ‚dS)NZCountrz3This dispatch object does not define a Count method)rNrrTrRrU)rJr*rVr r rÚ__len__)szCDispatch.__len__cCsVz&tjtjB}|j tjt|dd¡}Wntjy<YdS0ddlm }|  |d¡S)N©é é r r)Úutil) rrOrPrÚ InvokeTypesÚDISPID_NEWENUMrRr2Úr�ZWrapEnum)rJr*Úenumr�r r rÚ_NewEnum/s  ÿ zCDispatch._NewEnumc Cs‚t|tƒrF|jddur&| ¡|jd<|jddurF| |j |¡¡S| d¡\}}|durv| |j  |t |d|¡¡St dƒ‚dS)NrGZItemrz(This object does not support enumeration) rr{rIr†rSrGÚ __getitem__rNrrTrRrU)rJÚindexr*rVr r rr‡;s ÿzCDispatch.__getitem__cGsp|jjr| |jj¡\}}ntjtjBtj}}|durd|t|d|f|}| |j j |Ž|jjd¡St dƒ‚dS)NrrL) rDrMrNrZDISPATCH_PROPERTYPUTZDISPATCH_PROPERTYPUTREFrQrRrSrrTrU)rJrˆr r*rVrWr r rÚ __setitem__Ksÿ  þÿzCDispatch.__setitem__cCs‚||jjvr(|jj|}|jd|jfS||jjvrP|jj|}|jd|jfSz|j d|¡}WnYdS0tjtj B|fS)Nér)NN) rDÚmapFuncsr(rVÚ propMapGetrÚ GetIDsOfNamesrrOrP)rJÚ methodNameÚitemrVr r rrN^s    zCDispatch._find_dispatch_type_c Gs(|jj|t|||f|Ž}| |||¡Sr)rr‚rRrS) rJrVZwFlagsZretTypeZargTypesÚuserZ resultCLSIDr Úresultr r rÚ _ApplyTypes_msÿzCDispatch._ApplyTypes_cCs|dusJdƒ‚t||ƒS)Nr.)r9)rJÚobr&Z returnCLSIDr6r r rÚ_wrap_dispatch_sszCDispatch._wrap_dispatch_cCs^t|tƒr| |||¡St|tƒrZz| tj¡}WntjyJ|YS0| |||¡S|Sr)rrr”ÚPyIUnknownTypeZQueryInterfacerr r2©rJr“r&Z ReturnCLSIDr r rÚ_get_good_single_object_zs   z"CDispatch._get_good_single_object_cCs>|dur dSt|tƒr0tt|||fdd„|ƒƒS| |¡SdS)zÛGiven an object (usually the retval from a method), make it a good object to return. Basically checks if it is a COM object, and wraps it up. Also handles the fact that a retval may be a tuple of retvalsNcSs| |||¡Sr)r—)ÚoÚsZounÚrcr r rÚ�sÿz-CDispatch._get_good_object_..)rÚtupleÚmapr—r–r r rrS‡s üÿ zCDispatch._get_good_object_c Cs²t |¡}|j |jj||d¡}d |¡}zbt|d|jdƒ}i}tƒ  ¡}t j j |d<t |||ƒ|}||}|j|<t|||jƒ} | WStd|ƒt ¡Yn0dS)z1Make a method object - Assumes in olerepr funcmaprÚ r[Úexecr9z'Error building OLE definition for code N)rZMakePublicAttributeNamerDZMakeFuncMethodr‹ÚjoinÚcompilerCÚglobalsÚcopyÚwin32comÚclientr9rŸrFrrirÚ tracebackÚ print_exc) rJÚnamerŽZmethodCodeListZ methodCodeZ codeObjectZ tempNameSpaceZ globNameSpaceÚfnZnewMethr r rÚ _make_method_™s* ÿ   ÿ zCDispatch._make_method_cCsR|j ¡D] }| ¡q i|_|jr8|j ¡d|jd<|jrHd|jd<d|_dS)zsCleanup object - like a close - to force cleanup when you dont want to rely on Python's reference counting.NrrD)rEÚvaluesÚ _Release_rZReleaserIrDrG)rJZ childContr r rr¬¶s    zCDispatch._Release_cGsXz8|jj|}|j}| |jj|t|jddf|Ž¡WStyRt |ƒ‚Yn0dS)zCall the named method as a procedure, rather than function. Mainly used by Word.Basic, which whinges about such things.rŠrN) rDr‹rVrSrrTrRr(ÚKeyErrorrk)rJr¨r r�ZdispIdr r rÚ_proc_Ãs ÿ zCDispatch._proc_cCsðtd|jƒzÊtdƒ|jj ¡D]}td|ƒq"tdƒ|jj ¡D] \}}td||jt|ƒfƒqFtdƒ|jj  ¡D] \}}td||jt|ƒfƒq|tdƒ|jj  ¡D] \}}td||jt|ƒfƒq²Wnt   ¡Yn0dS) z4Debug routine - dumps what it knows about an object.zAxDispatch containerzMethods:ú zProps:z %s = 0x%x - %sz Get Props:z Put Props:N) r rCrDr‹rgÚpropMapÚitemsrVÚreprrŒÚ propMapPutr¦r§)rJÚmethodZpropr+r r rÚ_print_details_Ïs   zCDispatch._print_details_cCs@z&| |¡r$td|j|fƒWdSWnty:YdS0dS)Nz"%s.__LazyMap__(%s) added somethingrr)Ú _LazyAddAttr_rrCrk©rJrAr r rÚ __LazyMap__âs  ÿ  zCDispatch.__LazyMap__c Cs|jdurdSd}|j\}}|j}tD]â}zÐ| ||¡\}}|dkrl|dd…dvrl| |dd…|¡\}}|tjkr†| ||d¡} n|tjkr | ||d¡} nd} | durø| d| d} } | | } | |j krÞ|  | | ¡n| |j krô|  | | ¡d}Wq&Yq&0q&|S)Nré)ÚSetZGetr) rHrDÚALL_INVOKE_TYPESZBindrZDESCKIND_FUNCDESCZ _AddFunc_r)Z_AddVar_r³Z_propMapPutCheck_rŒZ_propMapGetCheck_) rJrAÚresr5r7r8ÚiÚxÚtÚrÚkeyr�r�r r rr¶ís4       zCDispatch._LazyAddAttr_cGs.|D]$}t | |¡|f¡}||jj|<qdS)a Flag these attribute names as being methods. Some objects do not correctly differentiate methods and properties, leading to problems when calling these methods. Specifically, trying to say: ob.SomeFunc() may yield an exception "None object is not callable" In this case, an attempt to fetch the *property* has worked and returned None, rather than indicating it is really a method. Calling: ob._FlagAsMethod("SomeFunc") should then allow this to work. N)rÚMapEntryÚ __AttrToID__rDr‹)rJZ methodNamesr¨r_r r rÚ _FlagAsMethods zCDispatch._FlagAsMethodcCs td||jfƒ|j d|¡S)Nz>Calling GetIDsOfNames for property %s in Dispatch container %sr)rrCrr�r·r r rrà s ÿÿzCDispatch.__AttrToID__c Cs’|dkrbz&tjtjB}|j tjt|dd¡}WntjyJtdƒ‚Yn0Gdd„dƒ}||ƒS|  d¡r~|  d¡r~t|ƒ‚zt |j |||j ƒWSty¦Yn0||jjvr¾| |¡Sd}|j�r†|j�r†|jj |¡}|durö|jj |¡}|du�r†zn| |¡�rN||jjv�r(| |¡WS|jj |¡}|du�rN|jj |¡}|du�rlt | |¡|f¡}Wntj�y„Yn0|du�rÒz|j|j}td|ƒ|WSttf�yÐtd |ƒYn0|du�r|t|tjƒ}td |jƒz|j |jd |d ¡}WnXtj�yf}z<|j t!v�rP||jj|<| |¡WYd}~S‚WYd}~n d}~00td |ƒ| "|¡Std|j#|fƒ‚dS)NÚ__iter__r~r z+This object can not function as an iteratorc@seZdZdd„Zdd„ZdS)z&CDispatch.__getattr__..FactorycSs ||_dSr)r“)rJr“r r rrK5sz/CDispatch.__getattr__..Factory.__init__cSsddl}|jj |j¡Srn)Zwin32com.client.utilr¥r�ÚIteratorr“)rJr¤r r rrX8sz/CDispatch.__getattr__..Factory.__call__N)Ú__name__Ú __module__Ú __qualname__rKrXr r r rÚFactory4srÊÚ_zCached items has attribute!zAttribute %s not in cachez(Getting property Id 0x%x from OLE objectrrz OLE returned z%s.%s)$rrOrPrr‚rƒrRr2rkÚ startswithÚendswithrrFrir­rDr‹rªr°ÚgetrŒr¸rrÂrÃrrErVrr-ÚINVOKE_PROPERTYGETrTr]r^rSrC) rJrAr*r…rÊZretEntryÚretr,r_r r rÚ __getattr__'sr  ÿ              ÿ    zCDispatch.__getattr__cCsü||jvr||j|<dStd|j|t|ƒfƒ|jr²||jjvrt|jj|}t|tjƒ}|j   |j d|d|¡dS||jj vr²|jj |}t|tjƒ}|j   |j d|d|¡dS|j �ræ|  |¡�rF||jjv�r|jj|}t|tjƒ}|j   |j d|d|¡dS||jj v�rF|jj |}t|tjƒ}|j   |j d|d|¡dSzt | |¡|f¡}Wntj�yxd}Yn0|du�ræzJt|tjƒ}|j   |j d|d|¡||jj|<td||j |jfƒWdStj�yäYn0td|j|fƒ‚dS)Nz0SetAttr called for %s.%s=%s on DispatchContainerrz:__setattr__ property %s (id=0x%x) in Dispatch container %sz Property '%s.%s' can not be set.)rIrrCr²rDr°r-rÚINVOKE_PROPERTYPUTrrTrVr³r¸rrÂrÃr2rk)rJrAÚvaluer+r,r r rÚ __setattr__€stÿ ÿÿ        ÿ ÿ  ÿ  ÿÿ ÿzCDispatch.__setattr__)NNN)NNN)NN)NN)!rÇrÈrÉrKrXrZr\r`rmrjrpryrzr|r}r†r‡r‰rNr’r”r—rSrªr¬r®rµr¸r¶rÄrÃrÑrÔr r r rr0Âs@ÿ   ÿ     #Yr0)-Ú__doc__r¦rrZwin32com.clientr¤ÚwinerrorZ pywintypesrr„rrrrRZDISP_E_MEMBERNOTFOUNDZDISP_E_BADPARAMCOUNTZDISP_E_PARAMNOTOPTIONALZDISP_E_TYPEMISMATCHZ E_INVALIDARGr^rÏrÒZINVOKE_PROPERTYPUTREFZ INVOKE_FUNCr»rrrZTypeIIDsr rZ IID_IUnknownr•r%rr@Z_defaultDispatchItemZ CLSCTX_SERVERr$r'r-r9r3rBr0r r r rÚsX  û ü   ú û