a oem@sdZddlZddlZddlZddlZddlZddlmZddl m Z dZ dZ dZ ejejejejejgZejejejejgZddZdd Zd d ZejejZejejZ e!efZ"e j#Z$ej%fd d Z&ddZ'ddZ(ddddej%fddZ)ddZ*dddej%fddZ+GdddZ,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|ddqtdSN )end) debuggingprintargsargr 8C:\Program Files\Certbot\pkgs\win32com\client\dynamic.py debug_print4srcGs$tr |D]}t|ddqtdSr)debugging_attrr r r r rdebug_attr_print;srcCs t||SN)types MethodType)funcinstclsr r r MakeMethodBsrc Cs`t|tr|St|trPzt|}Wq\tjyLt|d|tj}Yq\0n t|d|}|SN_oleobj_) isinstancePyIDispatchType_GoodDispatchTypes pythoncomZconnect ole_errorZCoCreateInstance IID_IDispatchgetattr) IDispatchclsctxr r r_GetGoodDispatchNs    r$cCs.|durt|tr |}nt|}t|||fSr)rstrr$)r"userNamer#r r r_GetGoodDispatchAndUserName_s  r'cCs(|r |js|S|jjtjkr |S|jjSr)descZdesckindrDESCKIND_VARDESCinvkind)entry invoke_typer r r_GetDescInvokeTypeks  r-c Cs|dusJdt|||\}}|dur,t}d}zF|durB|}|durtz|}||f}WntjyrYn0Wntjyd}Yn0t|||}|||||dS)N#this is deprecated and will go away)lazydata)r' CDispatch GetTypeInfoZ GetTypeCompr com_error MakeOleRepr) r"r& createClasstypeinfoUnicodeToStringr#r/typecompolereprr r rDispatch{s$    r9cCsd}|durzj|}|dtjkrN|dtj@rN|d}||}|}|durht||dd}n t|d}Wntj yYn0|durt}|S)N r) GetTypeAttrrZTKIND_INTERFACEZTYPEFLAG_FDUALGetRefTypeOfImplTypeGetRefTypeInfor DispatchItemZLazyDispatchItemr)r"r5r7r8attrZhrefr r rr3s&    r3cCs<|dusJdt|||\}}|dur,t}||t|S)zDispatch with no type infoNr.)r'r0rr@)r"r&r4r6r#r r r DumbDispatchs rBc@seZdZd>ddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd?d$d%Zd@d&d'ZdAd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd: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 ||jjdSt ddS)zJProvide 'default dispatch' COM functionality - allow instance to be calledNr5This dispatch object does not define a default method) rDdefaultDispatchName_find_dispatch_type_rDISPATCH_METHODDISPATCH_PROPERTYGET DISPID_VALUELCID_get_good_object_rInvoke TypeError)rJr r*dispidallArgsr 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%rXrr2hresultERRORS_BAD_CONTEXTr\)rJdetailsr r r__str__s  zCDispatch.__str__cCsXt|jt|j|}z|dd|jD7}WntyJYn0tt|S)NcSsg|] }|jqSr )Name).0pr r r z%CDispatch.__dir__..) listrIkeysdir __class__ _dir_ole_Z Properties_AttributeErrorset)rJZlstr r r__dir__s   zCDispatch.__dir__cCs>i}td|jD]}|j|}|||qt|SNr)rangerZGetTypeInfoCountr1_UpdateWithITypeInfo_rfrg)rJ items_dictZiTItypeInfor r rrjs  zCDispatch._dir_ole_c Cs|g}tjdi}t|dkr|}|}|j|vrd||j<td|jD].}||}| |j d}||vrLd||<qLtd|j D]"} | | } | | } || qqdSrn)rr lenpopr=ZiidroZcFuncsZ GetFuncDescZGetNamesZmemidZ cImplTypesr>r?append) rJrqrrZ typeInfosZ inspectedIIDsZtypeAttrZiFunZfunDescZfunNameZ iImplTypeZiRefTypeZ refTypeInfor r rrps         zCDispatch._UpdateWithITypeInfo_cCst|d|}|j|kSrr!rrJotherr 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|dStddS)NZCountrz3This dispatch object does not define a Count method)rNrrTrRrU)rJr*rVr r r__len__)szCDispatch.__len__cCsVz&tjtjB}|jtjt|dd}Wntjy<YdS0ddlm }| |dS)N r r)util) rrOrPr InvokeTypesDISPID_NEWENUMrRr2rZWrapEnum)rJr*enumrr r r_NewEnum/s   zCDispatch._NewEnumc Cst|trF|jddur&||jd<|jddurF||j|S|d\}}|durv||j |t |d|St ddS)NrGZItemrz(This object does not support enumeration) rr{rIrrSrG __getitem__rNrrTrRrU)rJindexr*rVr r rr;s zCDispatch.__getitem__cGsp|jjr||jj\}}ntjtjBtj}}|durd|t|d|f|}||j j ||jjdSt ddS)NrrL) rDrMrNrZDISPATCH_PROPERTYPUTZDISPATCH_PROPERTYPUTREFrQrRrSrrTrU)rJrr r*rVrWr r r __setitem__Ks  zCDispatch.__setitem__cCs||jjvr(|jj|}|jd|jfS||jjvrP|jj|}|jd|jfSz|jd|}WnYdS0tjtj B|fS)Nr)NN) rDmapFuncsr(rV propMapGetr GetIDsOfNamesrrOrP)rJ methodNameitemrVr r rrN^s    zCDispatch._find_dispatch_type_c Gs(|jj|t|||f|}||||Sr)rrrRrS) rJrVZwFlagsZretTypeZargTypesuserZ resultCLSIDr resultr r r _ApplyTypes_mszCDispatch._ApplyTypes_cCs|dusJdt||S)Nr.)r9)rJobr&Z returnCLSIDr6r r r_wrap_dispatch_sszCDispatch._wrap_dispatch_cCs^t|tr||||St|trZz|tj}WntjyJ|YS0||||S|Sr)rrrPyIUnknownTypeZQueryInterfacerr r2rJrr&Z ReturnCLSIDr r r_get_good_single_object_zs   z"CDispatch._get_good_single_object_cCs>|dur dSt|tr0tt|||fdd|S||SdS)zGiven 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)osZounrcr r rsz-CDispatch._get_good_object_..)rtuplemaprrr r rrSs  zCDispatch._get_good_object_c Cst|}|j|jj||d}d|}zbt|d|jd}i}t }t j j |d<t ||||}||}|j|<t|||j} | WStd|tYn0dS)z1Make a method object - Assumes in olerepr funcmapr r[execr9z'Error building OLE definition for code N)rZMakePublicAttributeNamerDZMakeFuncMethodrjoincompilerCglobalscopywin32comclientr9rrFrrir traceback print_exc) rJnamerZmethodCodeListZ methodCodeZ codeObjectZ tempNameSpaceZ globNameSpacefnZnewMethr r r _make_method_s*     zCDispatch._make_method_cCsR|jD] }|q i|_|jr8|jd|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)rEvalues _Release_rZReleaserIrDrG)rJZ childContr r rrs    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.rrN) rDrrVrSrrTrRr(KeyErrorrk)rJrr rZdispIdr r r_proc_s  zCDispatch._proc_cCstd|jztd|jjD]}td|q"td|jjD] \}}td||jt|fqFtd|jj D] \}}td||jt|fq|td|jj D] \}}td||jt|fqWnt 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 rCrDrrgpropMapitemsrVreprr propMapPutrr)rJmethodZpropr+r r r_print_details_s   zCDispatch._print_details_cCs@z&||r$td|j|fWdSWnty:YdS0dS)Nz"%s.__LazyMap__(%s) added somethingrr) _LazyAddAttr_rrCrkrJrAr r r __LazyMap__s    zCDispatch.__LazyMap__c Cs|jdurdSd}|j\}}|j}tD]}z|||\}}|dkrl|dddvrl||dd|\}}|tjkr|||d} n|tjkr|||d} nd} | dur| d| d} } | | } | |j kr| | | n| |j kr| | | d}Wq&Yq&0q&|S)Nr)SetZGetr) rHrDALL_INVOKE_TYPESZBindrZDESCKIND_FUNCDESCZ _AddFunc_r)Z_AddVar_rZ_propMapPutCheck_rZ_propMapGetCheck_) rJrAresr5r7r8ixtrkeyrrr r rrs4       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)rMapEntry __AttrToID__rDr)rJZ methodNamesrr_r r r _FlagAsMethods zCDispatch._FlagAsMethodcCs td||jf|jd|S)Nz>Calling GetIDsOfNames for property %s in Dispatch container %sr)rrCrrrr r rr s zCDispatch.__AttrToID__c Cs|dkrbz&tjtjB}|jtjt|dd}WntjyJtdYn0Gddd}||S| dr~| dr~t|zt |j |||j WStyYn0||jjvr||Sd}|jr|jr|jj|}|dur|jj|}|durzn||rN||jjvr(||WS|jj|}|durN|jj|}|durlt|||f}WntjyYn0|durz|j|j}td||WSttfytd |Yn0|dur|t|tj}td |jz|j|jd |d }WnXtjyf}z<|j t!vrP||jj|<||WYd}~SWYd}~n d}~00td ||"|Std|j#|fdS)N__iter__r~r z+This object can not function as an iteratorc@seZdZddZddZdS)z&CDispatch.__getattr__..FactorycSs ||_dSr)r)rJrr r rrK5sz/CDispatch.__getattr__..Factory.__init__cSsddl}|jj|jSrn)Zwin32com.client.utilrrIteratorr)rJrr r rrX8sz/CDispatch.__getattr__..Factory.__call__N)__name__ __module__ __qualname__rKrXr r r rFactory4sr_zCached items has attribute!zAttribute %s not in cachez(Getting property Id 0x%x from OLE objectrrz OLE returned z%s.%s)$rrOrPrrrrRr2rk startswithendswithrrFrirrDrrrgetrrrrrrrErVrr-INVOKE_PROPERTYGETrTr]r^rSrC) rJrAr*rrZretEntryretr,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||jjvr|jj|}t|tj}|j |j d|d|dS||jj vrF|jj |}t|tj}|j |j d|d|dSzt|||f}Wntjyxd}Yn0|durzJt|tj}|j |j d|d|||jj|<td||j |jfWdStjyYn0td|j|fdS)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.)rIrrCrrDrr-rINVOKE_PROPERTYPUTrrTrVrrrrrr2rk)rJrAvaluer+r,r r r __setattr__st               zCDispatch.__setattr__)NNN)NNN)NN)NN)!rrrrKrXrZr\r`rmrjrpryrzr|r}rrrrNrrrrSrrrrrrrrrrr r r rr0s@        #Yr0)-__doc__rrrZwin32com.clientrwinerrorZ pywintypesrrrrrrRZDISP_E_MEMBERNOTFOUNDZDISP_E_BADPARAMCOUNTZDISP_E_PARAMNOTOPTIONALZDISP_E_TYPEMISMATCHZ E_INVALIDARGr^rrZINVOKE_PROPERTYPUTREFZ INVOKE_FUNCrrrrZTypeIIDsr rZ IID_IUnknownrr%rr@Z_defaultDispatchItemZ CLSCTX_SERVERr$r'r-r9r3rBr0r r r rsX