123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import win32com
- import win32com.client
- if type(__path__)==type(''):
- # For freeze to work!
- import sys
- try:
- import adsi
- sys.modules['win32com.adsi.adsi'] = adsi
- except ImportError:
- pass
- else:
- # See if we have a special directory for the binaries (for developers)
- win32com.__PackageSupportBuildPath__(__path__)
- # Some helpers
- # We want to _look_ like the ADSI module, but provide some additional
- # helpers.
- # Of specific note - most of the interfaces supported by ADSI
- # derive from IDispatch - thus, you get the custome methods from the
- # interface, as well as via IDispatch.
- import pythoncom
- from .adsi import *
- LCID = 0
- IDispatchType = pythoncom.TypeIIDs[pythoncom.IID_IDispatch]
- IADsContainerType = pythoncom.TypeIIDs[adsi.IID_IADsContainer]
- def _get_good_ret(ob,
- # Named arguments used internally
- resultCLSID = None):
- assert resultCLSID is None, "Now have type info for ADSI objects - fix me!"
- # See if the object supports IDispatch
- if hasattr(ob, "Invoke"):
- import win32com.client.dynamic
- name = "Dispatch wrapper around %r" % ob
- return win32com.client.dynamic.Dispatch(ob, name, ADSIDispatch)
- return ob
- class ADSIEnumerator:
- def __init__(self, ob):
- # Query the object for the container interface.
- self._cont_ = ob.QueryInterface(IID_IADsContainer)
- self._oleobj_ = ADsBuildEnumerator(self._cont_) # a PyIADsEnumVARIANT
- self.index = -1
- def __getitem__(self, index):
- return self.__GetIndex(index)
- def __call__(self, index):
- return self.__GetIndex(index)
- def __GetIndex(self, index):
- if type(index)!=type(0): raise TypeError("Only integer indexes are supported for enumerators")
- if index != self.index + 1:
- # Index requested out of sequence.
- raise ValueError("You must index this object sequentially")
- self.index = index
- result = ADsEnumerateNext(self._oleobj_, 1)
- if len(result):
- return _get_good_ret(result[0])
- # Failed - reset for next time around.
- self.index = -1
- self._oleobj_ = ADsBuildEnumerator(self._cont_) # a PyIADsEnumVARIANT
- raise IndexError("list index out of range")
- class ADSIDispatch(win32com.client.CDispatch):
- def _wrap_dispatch_(self, ob, userName = None, returnCLSID = None, UnicodeToString=None):
- assert UnicodeToString is None, "this is deprectated and will be removed"
- if not userName:
- userName = "ADSI-object"
- olerepr = win32com.client.dynamic.MakeOleRepr(ob, None, None)
- return ADSIDispatch(ob, olerepr, userName)
- def _NewEnum(self):
- try:
- return ADSIEnumerator(self)
- except pythoncom.com_error:
- # doesnt support it - let our base try!
- return win32com.client.CDispatch._NewEnum(self)
- def __getattr__(self, attr):
- try:
- return getattr(self._oleobj_, attr)
- except AttributeError:
- return win32com.client.CDispatch.__getattr__(self, attr)
- def QueryInterface(self, iid):
- ret = self._oleobj_.QueryInterface(iid)
- return _get_good_ret(ret)
- # We override the global methods to do the right thing.
- _ADsGetObject = ADsGetObject # The one in the .pyd
- def ADsGetObject(path, iid = pythoncom.IID_IDispatch):
- ret = _ADsGetObject(path, iid)
- return _get_good_ret(ret)
- _ADsOpenObject = ADsOpenObject
- def ADsOpenObject(path, username, password, reserved = 0, iid = pythoncom.IID_IDispatch):
- ret = _ADsOpenObject(path, username, password, reserved, iid)
- return _get_good_ret(ret)
|