
[Mc           @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l	 Z
 d Z d Z d Z e j e j e j e j e j g Z e j e j e j e j g Z d   Z d   Z e j d k Z e r d   Z n	 e j Z e j e j  Z! e j e j" Z# e$ e e% f Z& e j' Z( e j) d	  Z* d
   Z+ d   Z, d d d d e j) d  Z. d   Z/ d d d e j) d  Z0 d d d     YZ1 d S(   s:  Support 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.

iN(   t   IIDTypei    c          G   s#   t  r x |  D]
 } | Gq WHn  d  S(   N(   t	   debugging(   t   argst   arg(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   debug_print5   s    c          G   s#   t  r x |  D]
 } | Gq WHn  d  S(   N(   t   debugging_attr(   R   R   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   debug_attr_print;   s    i   c         C   s   t  j |  |  S(   N(   t   typest
   MethodType(   t   funct   instt   cls(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt
   MakeMethodD   s    c         C   sm   t  |  t  rW y t j |   }  Wqi t j k
 rS t j |  d  | t j  }  qi Xn t |  d |   }  |  S(   Nt   _oleobj_(	   t
   isinstancet   _GoodDispatchTypest	   pythoncomt   connectt	   ole_errort   CoCreateInstancet   Nonet   IID_IDispatcht   getattr(   t	   IDispatcht   clsctx(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _GetGoodDispatchP   s    "c         C   s   | d  k rR t |  t  r$ |  } q t r t |  t  r |  j d d  } q n7 t r} t | t  r} | j d d  } n t |  } t |  |  | f S(   Nt   asciit   replace(   R   R   t   strt   py3kt   unicodet   encodeR   (   R   t   userNameR   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _GetGoodDispatchAndUserName[   s    	c         C   s    |  s |  j  r | S|  j  d S(   Ni   (   t   desc(   t   entryt   default_invoke_type(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _GetDescInvokeTypen   s     c   	      C   s   | d  k s t d  t |  | |  \ }  } | d  k rB t } n  d  } ya | d  k rf |  j   } n  | d  k	 r y | j   } | | f } Wq t j k
 r q Xn  Wn t j k
 r d  } n Xt |  | |  } | |  | | d | S(   Ns#   this is deprecated and will go awayt   lazydata(	   R   t   AssertionErrorR!   t	   CDispatcht   GetTypeInfot   GetTypeCompR   t	   com_errort   MakeOleRepr(	   R   R    t   createClasst   typeinfot   UnicodeToStringR   R&   t   typecompt   olerepr(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   Dispatchr   s$    	
c         C   s   d  } | d  k	 r y | j   } | d t j k rr | d t j @rr | j d  } | j |  } | j   } n  | d  k r t j | | d  d  } n t j	 | d   } Wq t j
 k
 r q Xn  | d  k r t j   } n  | S(   Ni   i   ii    (   R   t   GetTypeAttrR   t   TKIND_INTERFACEt   TYPEFLAG_FDUALt   GetRefTypeOfImplTypet   GetRefTypeInfot   buildt   DispatchItemt   LazyDispatchItemR   (   R   R.   R0   R1   t   attrt   href(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyR,      s     $ c         C   sX   | d k s t d  t |  | |  \ }  } | d k rB t } n  | |  t j   |  S(   s   Dispatch with no type infos#   this is deprecated and will go awayN(   R   R'   R!   R(   R8   R9   (   R   R    R-   R/   R   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   DumbDispatch   s
    	R(   c           B   s  e  Z d d d d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d	   Z d
   Z d   Z d   Z d   Z d d d d  Z d d d  Z d d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   c         C   s   | d  k s t d  | d  k r* d } n  | |  j d <| |  j d <| |  j d <i  |  j d <i  |  j d <d  |  j d <d  |  j d	 <| |  j d
 <d  S(   Ns#   this is deprecated and will go aways	   <unknown>R   t
   _username_t	   _olerepr_t   _mapCachedItems_t   _builtMethods_t   _enum_t   _unicode_to_string_t
   _lazydata_(   R   R'   t   __dict__(   t   selfR   R1   R    R/   R&   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __init__   s     	c         G   s   |  j  j r* |  j |  j  j  \ } } n t j t j Bt j } } | d k	 r | t | d f | } |  j	 |  j
 j |   |  j  j d  St d   d S(   sJ   Provide 'default dispatch' COM functionality - allow instance to be calledi   s5   This dispatch object does not define a default methodN(   R?   t   defaultDispatchNamet   _find_dispatch_type_R   t   DISPATCH_METHODt   DISPATCH_PROPERTYGETt   DISPID_VALUER   t   LCIDt   _get_good_object_R   t   Invoket	   TypeError(   RF   R   t   invkindt   dispidt   allArgs(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __call__   s    %c         C   s   t  S(   N(   t   True(   RF   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __nonzero__   s    c         C   s   d |  j  S(   Ns   <COMObject %s>(   R>   (   RF   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __repr__   s    c         C   sM   y t  |  j    SWn2 t j k
 rH } | j t k r>   n  |  j   SXd  S(   N(   R   RT   R   R+   t   hresultt   ERRORS_BAD_CONTEXTRW   (   RF   t   details(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __str__   s    c         C   s   t  | d |  } |  j | k S(   NR   (   R   R   (   RF   t   other(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __eq__   s    c         C   s   t  | d |  } |  j | k S(   NR   (   R   R   (   RF   R\   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __ne__   s    c         C   s   t  |  j    S(   N(   t   intRT   (   RF   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __int__   s    c         C   sD   |  j  d  \ } } | r4 |  j j | t | d  St d   d  S(   Nt   Counti   s3   This dispatch object does not define a Count method(   RI   R   RO   RM   RP   (   RF   RQ   RR   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __len__   s    c         C   si   y5 t  j t  j B} |  j j t  j t | d d  } Wn t  j k
 rL d  SXd d  l	 } | j
 | d   S(   Ni   i
   i(   i   i
   (    (   R   RJ   RK   R   t   InvokeTypest   DISPID_NEWENUMRM   R+   R   t   utilt   WrapEnum(   RF   RQ   t   enumRe   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _NewEnum   s    %c         C   s   t  | t  rg |  j d d  k r8 |  j   |  j d <n  |  j d d  k	 rg |  j |  j j |   Sn  |  j d  \ } } | d  k	 r |  j |  j	 j
 | t | d |   St d   d  S(   NRB   t   Itemi   s(   This object does not support enumeration(   R   R_   RE   R   Rh   RN   RB   t   __getitem__RI   R   RO   RM   RP   (   RF   t   indexRQ   RR   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyRj      s    %c         G   s   |  j  j r* |  j |  j  j  \ } } n t j t j Bt j } } | d  k	 r | t | d | f | } |  j	 |  j
 j |   |  j  j d   St d   d  S(   Ni    s5   This dispatch object does not define a default method(   R?   RH   RI   R   t   DISPATCH_PROPERTYPUTt   DISPATCH_PROPERTYPUTREFRL   R   RM   RN   R   RO   RP   (   RF   Rk   R   RQ   RR   RS   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __setitem__   s    %c         C   s   | |  j  j k r6 |  j  j | } | j d | j f S| |  j  j k rl |  j  j | } | j d | j f Sy |  j j d |  } Wn d SXt j	 t j
 B| f S(   Ni   i    (   NN(   R?   t   mapFuncsR"   RR   t
   propMapGetR   t   GetIDsOfNamesR   R   RJ   RK   (   RF   t
   methodNamet   itemRR   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyRI     s    c   	      G   s8   |  j  j | t | | | f |   } |  j | | |  S(   N(   R   Rc   RM   RN   (	   RF   RR   t   wFlagst   retTypet   argTypest   usert   resultCLSIDR   t   result(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _ApplyTypes_  s    %c         C   s"   | d  k s t d  t | |  S(   Ns#   this is deprecated and will go away(   R   R'   R2   (   RF   t   obR    t   returnCLSIDR/   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _wrap_dispatch_  s    c         C   sk   t  t |  k rB y | j t j  } WqB t j k
 r> qB Xn  t t |  k rg |  j | | |  S| S(   N(   t   iunkTypet   typet   QueryInterfaceR   R   R+   t   dispatchTypeR}   (   RF   R{   R    t   ReturnCLSID(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _get_good_single_object_  s    c         C   sO   | d k r d St | t  r> t t |  | | d  |   S|  j |  Sd S(   s   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 retvalsc         S   s   | j  |  | |  S(   N(   R   (   t   ot   st   ount   rc(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   <lambda>0  s    N(   R   R   t   tuplet   mapR   (   RF   R{   R    R   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyRN   )  s
    c   
      B   s   e  j |  } |  j j |  j j | | d  } d j |  } y e | d |  j d  } i  } e   j	   } e
 j j | d <| | | U| } | | } |  j | <e | |  |  j  }	 |	 SWn e d |  e j   n Xd S(   s1   Make a method object - Assumes in olerepr funcmapi    s   
s   <COMObject %s>t   execR2   s'   Error building OLE definition for code N(   R8   t   MakePublicAttributeNameR?   t   MakeFuncMethodRo   t   joint   compileR>   t   globalst   copyt   win32comt   clientR2   RA   R   t	   __class__R   t	   tracebackt	   print_excR   (
   RF   t   nameRr   t   methodCodeListt
   methodCodet
   codeObjectt   tempNameSpacet   globNameSpacet   fnt   newMeth(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _make_method_4  s"    "
c         C   sy   x! |  j  j   D] } | j   q Wi  |  _  |  j rS |  j j   d |  j d <n  |  j rl d |  j d <n  d |  _ d S(   sq   Cleanup object - like a close - to force cleanup when you dont 
		   want to rely on Python's reference counting.R   R?   N(	   R@   t
   itervaluest	   _Release_R   t   ReleaseR   RE   R?   RB   (   RF   t	   childCont(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyR   M  s    			c         G   sq   yM |  j  j | } | j } |  j |  j j | t | j d d f |    SWn t k
 rl t	 |   n Xd S(   s|   Call the named method as a procedure, rather than function.
		   Mainly used by Word.Basic, which whinges about such things.i   i    N(
   R?   Ro   RR   RN   R   RO   RM   R"   t   KeyErrort   AttributeError(   RF   R   R   Rs   t   dispId(    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _proc_Z  s    	4c         C   s  d G|  j  GHy d GHx# |  j j j   D] } d G| GHq' Wd GHx; |  j j j   D]' \ } } d | | j t |  f GHqR Wd GHx; |  j j j   D]' \ } } d | | j t |  f GHq Wd GHx; |  j j	 j   D]' \ } } d | | j t |  f GHq WWn t
 j   n Xd S(	   s4   Debug routine - dumps what it knows about an object.s   AxDispatch containers   Methods:s   	s   Props:s   	%s = 0x%x - %ss
   Get Props:s
   Put Props:N(   R>   R?   Ro   t   iterkeyst   propMapt	   iteritemsRR   t   reprRp   t
   propMapPutR   R   (   RF   t   methodt   propR#   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _print_details_d  s     #c         C   sG   y. |  j  |  r- t d |  j | f  d SWn t k
 rB d SXd  S(   Ns"   %s.__LazyMap__(%s) added somethingi   i    (   t   _LazyAddAttr_R   R>   R   (   RF   R;   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __LazyMap__w  s    c         C   sm  |  j  d  k r d Sd } |  j  \ } } |  j } x5t D]-} y| j | |  \ } } | d k r | d  d k r | j | d |  \ } } n  | d k r | j | | d  }	 n* | d k r | j | | d  }	 n d  }	 |	 d  k	 rZ|	 d |	 d }
 } | |
 } | | j k r/| j |
 |  n" | | j	 k rQ| j
 |
 |  n  d } n  Wq8 q8 Xq8 W| S(   Ni    i   t   Sett   Geti   i   (   s   SetR   (   RD   R   R?   t   ALL_INVOKE_TYPESt   Bindt	   _AddFunc_t   _AddVar_R   t   _propMapPutCheck_Rp   t   _propMapGetCheck_(   RF   R;   t   resR.   R0   R1   t   it   xt   tt   rt   keyR   Rs   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyR     s4     	
c         G   sC   x< | D]4 } t  j |  j |  | f  } | |  j j | <q Wd S(   s  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(   R8   t   MapEntryt   __AttrToID__R?   Ro   (   RF   t   methodNamesR   RZ   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   _FlagAsMethod  s    c         C   s*   t  d | |  j f  |  j j d |  S(   Ns>   Calling GetIDsOfNames for property %s in Dispatch container %si    (   R   R>   R   Rq   (   RF   R;   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyR     s    c   	      C   s@  | d k r y5 t  j t  j B} |  j j t  j t | d d  } Wn  t  j k
 rc t d   n Xd d d     Y} | |  S| j	 d  r | j
 d  r t |   n  y t |  j | |  |  j  SWn t k
 r n X| |  j j k r |  j |  Sd  } |  j r|  j r|  j j j |  } | d  k rP|  j j j |  } n  | d  k ry |  j |  r| |  j j k r|  j |  S|  j j j |  } | d  k r|  j j j |  } qn  | d  k rt j |  j |  | f  } n  Wqt  j k
 rqXqn  | d  k	 rpy% |  j | j } t d |  | SWqpt t f k
 rlt d	 |  qpXn  | d  k	 r#t | t  j  } t d
 | j  y" |  j j  | j d | d  } WnE t  j k
 r} | j! t" k r| |  j j | <|  j |  S  n Xt d |  |  j# |  St d |  j$ | f   d  S(   Nt   __iter__i   i
   s+   This object can not function as an iteratort   Factoryc           B   s   e  Z d    Z d   Z RS(   c         S   s   | |  _  d  S(   N(   R{   (   RF   R{   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyRG     s    c         S   s"   d d  l  } | j j j |  j  S(   Ni(   t   win32com.client.utilR   Re   t   IteratorR{   (   RF   R   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyRT     s    (   t   __name__t
   __module__RG   RT   (    (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyR     s   	t   _s   Cached items has attribute!s   Attribute %s not in caches(   Getting property Id 0x%x from OLE objecti    i   s   OLE returned s   %s.%s(   i   i
   (    (    (%   R   RJ   RK   R   Rc   Rd   RM   R+   R   t
   startswitht   endswithR   RA   R   R   R?   Ro   R   R   R   t   getRp   R   R8   R   R   R   R@   RR   R   R%   t   INVOKE_PROPERTYGETRO   RX   RY   RN   R>   (	   RF   R;   RQ   Rg   R   t   retEntryt   rett   invoke_typeRZ   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __getattr__  sj    %
 %
"c         C   s  | |  j  k r  | |  j  | <d  St d |  j | t |  f  |  j r | |  j j k r |  j j | } t | t j  } |  j	 j
 | j d | d |  d  S| |  j j k r |  j j | } t | t j  } |  j	 j
 | j d | d |  d  Sn  |  j	 r|  j |  r| |  j j k ri|  j j | } t | t j  } |  j	 j
 | j d | d |  d  S| |  j j k r|  j j | } t | t j  } |  j	 j
 | j d | d |  d  Sn  y" t j |  j |  | f  } Wn t j k
 rd  } n X| d  k	 ryf t | t j  } |  j	 j
 | j d | d |  | |  j j | <t d | | j |  j f  d  SWqt j k
 rqXqn  t d |  j | f   d  S(   Ns0   SetAttr called for %s.%s=%s on DispatchContaineri    s:   __setattr__ property %s (id=0x%x) in Dispatch container %ss    Property '%s.%s' can not be set.(   RE   R   R>   R   R?   R   R%   R   t   INVOKE_PROPERTYPUTR   RO   RR   R   R   R8   R   R   R+   R   R   (   RF   R;   t   valueR#   R   (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   __setattr__  sR     		"

N(   R   R   R   RG   RT   RV   RW   R[   R]   R^   R`   Rb   Rh   Rj   Rn   RI   Rz   R}   R   RN   R   R   R   R   R   R   R   R   R   R   (    (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyR(      s6   																	
				"			P(   i   i    (    (2   t   __doc__t   sysR   R   R   t   winerrorR8   t
   pywintypesR    t   win32com.clientR   R   R   RM   t   DISP_E_MEMBERNOTFOUNDt   DISP_E_BADPARAMCOUNTt   DISP_E_PARAMNOTOPTIONALt   DISP_E_TYPEMISMATCHt   E_INVALIDARGRY   R   R   t   INVOKE_PROPERTYPUTREFt   INVOKE_FUNCR   R   R   t   version_infoR   R   R   t   TypeIIDsR   R   t   IID_IUnknownR~   R   R   R   R9   t   _defaultDispatchItemt   CLSCTX_SERVERR   R!   R%   R   R2   R,   R=   R(   (    (    (    s:   C:\RCS\Python\lib\site-packages\win32com\client\dynamic.pyt   <module>   sJ   							