home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Shareware / Comunicatii / jyte / jyte.exe / mapiutil.py < prev    next >
Text File  |  2004-01-26  |  5KB  |  167 lines

  1. # General utilities for MAPI and MAPI objects.
  2. from types import TupleType, ListType, IntType, StringType
  3. from pywintypes import UnicodeType, TimeType
  4. import pythoncom
  5. import mapi, mapitags
  6.  
  7. # Pre 2.2.1 compat.
  8. try: True, False
  9. except NameError: True = 1==1; False = 1==0
  10.  
  11. prTable = {}
  12. def GetPropTagName(pt):
  13.     if not prTable:
  14.         for name, value in mapitags.__dict__.items():
  15.             if name[:3] == 'PR_':
  16.                 # Store both the full ID (including type) and just the ID.
  17.                 # This is so PR_FOO_A and PR_FOO_W are still differentiated,
  18.                 # but should we get a PT_FOO with PT_ERROR set, we fallback
  19.                 # to the ID.
  20.                 prTable[value] = name
  21.                 prTable[mapitags.PROP_ID(value)] = name
  22.     try:
  23.         try:
  24.             return prTable[pt]
  25.         except KeyError:
  26.             # Can't find it exactly - see if the raw ID exists.
  27.             return prTable[mapitags.PROP_ID(pt)]
  28.     except KeyError:
  29.         # god-damn bullshit hex() warnings: I don't see a way to get the
  30.         # old behaviour without a warning!!
  31.         ret = hex(long(pt))
  32.         # -0x8000000L -> 0x80000000
  33.         if ret[0]=='-': ret = ret[1:]
  34.         if ret[-1]=='L': ret = ret[:-1]
  35.         return ret
  36.  
  37. mapiErrorTable = {}
  38. def GetScodeString(hr):
  39.     if not mapiErrorTable:
  40.         for name, value in mapi.__dict__.items():
  41.             if name[:7] in ['MAPI_E_', 'MAPI_W_']:
  42.                 mapiErrorTable[value] = name
  43.     return mapiErrorTable.get(hr, pythoncom.GetScodeString(hr))
  44.  
  45.  
  46. ptTable = {}
  47. def GetMapiTypeName(propType):
  48.     """Given a mapi type flag, return a string description of the type"""
  49.     if not ptTable:
  50.         for name, value in mapitags.__dict__.items():
  51.             if name[:3] == 'PT_':
  52.                 ptTable[value] = name
  53.  
  54.     rawType = propType & ~mapitags.MV_FLAG
  55.     return ptTable.get(rawType, str(hex(rawType)))
  56.  
  57. def GetProperties(obj, propList):
  58.     """Given a MAPI object and a list of properties, return a list of property values.
  59.     
  60.     Allows a single property to be passed, and the result is a single object.
  61.     
  62.     Each request property can be an integer or a string.  Of a string, it is 
  63.     automatically converted to an integer via the GetIdsFromNames function.
  64.     
  65.     If the property fetch fails, the result is None.
  66.     """
  67.     bRetList = 1
  68.     if type(propList) not in [TupleType, ListType]:
  69.         bRetList = 0
  70.         propList = (propList,)
  71.     realPropList = []
  72.     rc = []
  73.     for prop in propList:
  74.         if type(prop)!=IntType:    # Integer
  75.             props = ( (mapi.PS_PUBLIC_STRINGS, prop), )
  76.             propIds = obj.GetIDsFromNames(props, 0)
  77.             prop = mapitags.PROP_TAG( mapitags.PT_UNSPECIFIED, mapitags.PROP_ID(propIds[0]))
  78.         realPropList.append(prop)
  79.         
  80.     hr, data = obj.GetProps(realPropList,0)
  81.     if hr != 0:
  82.         data = None
  83.         return None
  84.     if bRetList:
  85.         return map( lambda(v): v[1], data )
  86.     else:
  87.         return data[0][1]
  88.  
  89. def GetAllProperties(obj, make_tag_names = True):
  90.     tags = obj.GetPropList(0)
  91.     hr, data = obj.GetProps(tags)
  92.     ret = []
  93.     for tag, val in data:
  94.         if make_tag_names:
  95.             hr, tags, array = obj.GetNamesFromIDs( (tag,) )
  96.             if type(array[0][1])==type(u''):
  97.                 name = array[0][1]
  98.             else:
  99.                 name = GetPropTagName(tag)
  100.         else:
  101.             name = tag
  102.         ret.append((name, val))
  103.     return ret
  104.  
  105. _MapiTypeMap = {
  106.     type(0.0): mapitags.PT_DOUBLE,
  107.     type(0): mapitags.PT_I4,
  108.     type(''): mapitags.PT_STRING8,
  109.     type(u''): mapitags.PT_UNICODE,
  110.     type(None): mapitags.PT_UNSPECIFIED,
  111.     # In Python 2.2.2, bool isn't a distinct type (type(1==1) is type(0)).
  112. }
  113.  
  114. def SetPropertyValue(obj, prop, val):
  115.     if type(prop)!=IntType:
  116.         props = ( (mapi.PS_PUBLIC_STRINGS, prop), )
  117.         propIds = obj.GetIDsFromNames(props, mapi.MAPI_CREATE)
  118.         if val == (1==1) or val == (1==0):
  119.             type_tag = mapitags.PT_BOOLEAN
  120.         else:
  121.             type_tag = _MapiTypeMap.get(type(val))
  122.             if type_tag is None:
  123.                 raise ValueError, "Don't know what to do with '%r' ('%s')" % (val, type(val))
  124.         prop = mapitags.PROP_TAG( type_tag, mapitags.PROP_ID(propIds[0]))
  125.     if val is None:
  126.         # Delete the property
  127.         obj.DeleteProps((prop,))
  128.     else:
  129.         obj.SetProps(((prop,val),))
  130.  
  131. def SetProperties( msg, propDict):
  132.     """ Given a Python dictionary, set the objects properties.
  133.     
  134.     If the dictionary key is a string, then a property ID is queried
  135.     otherwise the ID is assumed native.
  136.     
  137.     Coded for maximum efficiency wrt server calls - ie, maximum of
  138.     2 calls made to the object, regardless of the dictionary contents
  139.     (only 1 if dictionary full of int keys)
  140.     """
  141.  
  142.     newProps = []
  143.     # First pass over the properties we should get IDs for.
  144.     for key, val in propDict.items():
  145.         if type(key) in [StringType, UnicodeType]:
  146.             newProps.append((mapi.PS_PUBLIC_STRINGS, key))
  147.     # Query for the new IDs
  148.     if newProps: newIds = msg.GetIDsFromNames(newProps, mapi.MAPI_CREATE)
  149.     newIdNo = 0
  150.     newProps = []
  151.     for key, val in propDict.items():
  152.         if type(key) in [StringType, UnicodeType]:
  153.             type_val=type(val)
  154.             if type_val in [StringType, pywintypes.UnicodeType]:
  155.                 tagType = mapitags.PT_UNICODE
  156.             elif type_val==IntType:
  157.                 tagType = mapitags.PT_I4
  158.             elif type_val==TimeType:
  159.                 tagType = mapitags.PT_SYSTIME
  160.             else:
  161.                 raise ValueError, "The type of object %s(%s) can not be written" % (`val`,type_val)
  162.             key = mapitags.PROP_TAG(tagType, mapitags.PROP_ID(newIds[newIdNo]))
  163.             newIdNo = newIdNo + 1
  164.         newProps.append( (key, val) )
  165.     msg.SetProps(newProps)
  166.  
  167.