Hi Luke, You might want to check out WvMapi. You can download it at http://open.nit.ca/wiki/?DownloadSnapshots (get the evolution-exchangeit tarball, look for the wvampi subdirectory).
WvMapi currently supports decoding/encoding TNEFs containing the attMapiProps attribute, from standard iCalendar and vCard files. It's under LGPL. Have fun, Peter On Tue, 1 Feb 2005 15:06:41 +0000, Luke Kenneth Casson Leighton <[EMAIL PROTECTED]> wrote: > hi, > > i've begun the network-reverse-engineering necessary to interoperating > with Exchange 5.5 and Outlook. > > i have a basic test client and a basic server which is able to return > hard coded data structures. > > the key difference between the present attempt and all previous ones is > that i have started from FreeDCE not from decoding MSRPC on-wire, so i > have a 99.5% IDL file (2 actually) which define the interfaces. FreeDCE > turns that into c code, and it's a matter of filling in the blanks. > > unfortunately there are a lot of blanks. _fortunately_, the data > structures of emsabp.idl (the Nspi interface) are IDENTICAL to those > used in mapidefs.h - see Wine's include/windows/mapidefs.h > > anybody interested in helping out please contact me. > > in particular, help with tying in MAPI which is actually MS-TNEF which > is winmail.dat which is therefore directly relevant to evolution, > much appreciated. > > l. > > -- > -- > <a href="http://lkcl.net">http://lkcl.net</a> > -- > > [ uuid(f5cc5a18-4264-101a-8c59-08002b2f8426), > version(56.0), > implicit_handle(handle_t rpc_binding) > ] interface emsabp > { > > /* this is mostly identical to wine/include/mapidefs.h, > * up until MAPIERROR, at which point it looks completely > * unfamiliar and alien. > * > * the functions in the IMAPITable only look _vaguely_ > * familiar but are like, utterly different. > * really odd. same data structures. different functions. > * oh well. > */ > > #define PR_ENTRYID 0x0fff0102 > #define PR_OBJECTID 0xfffd0003 > #define PR_DISPLAY_NAME 0x3001001e > #define PT_CONTAINER_FLAGS 0x36000003 /* PCF_ISCONTAINER | > PCF_HASCHILDCONTAINER */ > #define PR_DEPTH 0x30050003 > #define PR_PARENTENTRYID 0xfffc0102 > > typedef unsigned short WCHAR; > > typedef struct { > long element_1; > long element_2; > long element_3; > long element_4; > long element_5; > long element_6; > long element_7; > long element_8; > long element_9; > } EMS_MAPI_UNIDENTIFIED; > > typedef struct { > char ab[16]; > } MAPIUID; > > typedef [context_handle] void *emsabp_hnd_t; > > long NspiBind( > [in] handle_t element_11, > [in] long element_12, > [in, ref] EMS_MAPI_UNIDENTIFIED *element_13, > [in,out, unique] MAPIUID *element_14, > [out] emsabp_hnd_t *element_15 > ); > > long NspiUnbind( > [in,out] emsabp_hnd_t *element_16, > [in] long element_17 > ); > > long NspiUpdateStat( > [in] emsabp_hnd_t element_18, > [in] long element_19, > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_20, > [in,out, unique] long *element_21 > ); > > /* typedef [ptr, string] unsigned long *EMS_SPropTagArray;*/ > > /* this is probably an SPropTagArray. although it doesn't match > * up with the definition in wine/includes/mapidefs.h, it also > * is the data structure i've had the most difficulty with, matching > * it to on-wire format. > */ > typedef struct { > [unique, length_is(cValues), size_is(cValues)] long *aulPropTag; > long cValues; > /*long element_24;*/ > } EMS_SPropTagArray; > > typedef [unique] EMS_SPropTagArray *EMS_LPSPropTagArray ; > > typedef struct { > long cb; > [size_is(cb), ptr] char *lpb; > } EMS_SBinary; > > typedef struct { > long dwLowDateTime; > long dwHighDateTime; > } EMS_FILETIME; > > typedef struct { > long cValues; > [size_is(cValues), ptr] short *lpi; > } EMS_SShortArray; > > typedef struct { > long cValues; > [size_is(cValues), ptr] long *lpl; > } EMS_MULTIVALUE_LONG_STRUCT; > > typedef struct { > long cValues; > [size_is(cValues), ptr] long *lppszA; /* this doesn't look right: should > be a LPSTR */ > } EMS_SLPSTRArray; > > typedef struct { > long cValues; > [size_is(cValues), ptr] EMS_SBinary *lpbin; > } EMS_SBinaryArray; > > typedef struct { > long cValues; > [size_is(cValues), ptr] long *lpguid; /* this doesn't look right: it > should be a GUID* */ > } EMS_SGuidArray; > > typedef struct { > long cValues; > [size_is(cValues), ptr] long *lpi; /* this doesn't look right: it should > be a LPWSTR* */ > } EMS_MULTIVALUE_UNICODE_STRUCT; > > typedef struct { > long cValues; > [size_is(cValues), ptr] EMS_FILETIME *lpft; > } EMS_SDateTimeArray; > > typedef [ptr, string] unsigned short *WSTRING; > typedef [ptr, string] char *STRING; > > #define PT_UNSPECIFIED 0x0000 > #define PT_NULL 0x0001 > #define PT_I2 0002 > #define PT_LONG 0003 > #define PT_R4 0004 > #define PT_DOUBLE 0x0005 > #define PT_CURRENCY 0x0006 > #define PT_APPTIME 0x0007 > /*#define PT_CLSID 0x0008 */ > #define PT_ERROR 0x000a > /* > means in a response package, that the given attribute contains no value, > or not exists. > -> So it won't be contained in the enumeration of the attrib. > values array. > */ > #define PT_BOOLEAN 0x000b > #define PT_OBJECT 0x000d > #define PT_I8 0x0014 > #define PT_STRING8 0x001e > #define PT_UNICODE 0x001f > #define PT_SYSTIME 0x0040 > #define PT_CLSID 0x0048 > #define PT_BINARY 0x0102 /*(the corresponding ???HDR entry is 4 bytes longer > in this case!) 1??? */ > > /* MV means MultiValued*/ > #define PT_MV_I2 0x1002 > #define PT_MV_LONG 0x1003 > #define PT_MV_R4 0x1004 > #define PT_MV_DOUBLE 0x1005 > #define PT_MV_CURRENCY 0x1006 > #define PT_MV_APPTIME 0x1007 > #define PT_MV_I8 0x1014 > #define PT_MV_STRING8 0x101e > #define PT_MV_TSTRING 0x101e > #define PT_MV_UNICODE 0x101f > #define PT_MV_SYSTIME 0x1040 > #define PT_MV_CLSID 0x1048 > #define PT_MV_BINARY 0x1102 > > typedef [switch_type(long)] union { > [case(PT_I2)] short i; > [case(PT_LONG)] long l; > [case(PT_BOOLEAN)] short b; > [case(PT_STRING8)] STRING lpszA; > [case(PT_BINARY)] EMS_SBinary bin; > [case(PT_UNICODE)] WSTRING lpszW; > [case(PT_CLSID), ptr] MAPIUID *lpguid; > [case(PT_SYSTIME)] EMS_FILETIME ft; > [case(PT_ERROR)] long err; > [case(PT_MV_I2)] EMS_SShortArray MVi; > [case(PT_MV_LONG)] EMS_MULTIVALUE_LONG_STRUCT MVl; > [case(PT_MV_STRING8)] EMS_SLPSTRArray MVszA; > [case(PT_MV_BINARY)] EMS_SBinaryArray MVbin; > [case(PT_MV_CLSID)] EMS_SGuidArray MVguid; > [case(PT_MV_UNICODE)] EMS_MULTIVALUE_UNICODE_STRUCT MVszW; > [case(PT_MV_SYSTIME)] EMS_SDateTimeArray MVft; > [case(PT_NULL)] long null; > [case(PT_OBJECT)] long object; > } EMS_SPropValue_CTR; > > typedef struct { > long ulPropTag; > long dwAlignPad; > [switch_is(ulPropTag)] EMS_SPropValue_CTR Value; > } EMS_SPropValue; > > typedef struct { > long ulAdrEntryPad; > long cValues; > [size_is(cValues), unique] EMS_SPropValue *lpProps; > } EMS_SRow; > > typedef [unique] EMS_SRow *EMS_SRow_PTR ; > > typedef struct { > long cRows; > [size_is(cRows)] EMS_SRow aRow[*]; > } EMS_SRowSet; > > typedef [unique] EMS_SRowSet *EMS_SRowSet_PTR ; > > long NspiQueryRows( > [in] emsabp_hnd_t element_69, > [in] long element_70, > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_71, > [in] long lRows, > [in, size_is(lRows), unique] long *element_73, > [in] long element_74, > [in, ref] EMS_SPropTagArray *element_75, > [out, ref] EMS_SRowSet_PTR *element_76 > ); > > long NspiSeekEntries( > [in] emsabp_hnd_t element_77, > [in] long element_78, > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_79, > [in, ref] EMS_SPropValue *element_80, > [in, unique] EMS_SPropTagArray *element_81, > [in, unique] EMS_SPropTagArray *element_82, > [out, ref] EMS_SRowSet_PTR *element_83 > ); > > typedef [ptr] struct _SRestriction *LPSRestriction; > > typedef struct { > long cRes; > [size_is(cRes)] LPSRestriction lpRes; > } EMS_SAndRestriction; > > typedef struct { > long cRes; > [size_is(cRes)] LPSRestriction lpRes; > } EMS_SOrRestriction; > > typedef struct { > /* ULONG ulReserved - perhaps an [ignore] property on this one? */ > LPSRestriction lpRes; > } EMS_SNotRestriction; > > typedef struct { > long ulFuzzyLevel; > long ulPropTag; > [ptr] EMS_SPropValue *lpProp; > } EMS_SContentRestriction; > > typedef struct { > long relop; > long ulPropTag; > [ptr] EMS_SPropValue *lpProp; > } EMS_SPropertyRestriction; > > typedef struct { > long ulReserved1; > long ulPropTag; > long ulReserved2; > } EMS_SExistRestriction; > > typedef struct { > long relop; > long ulPropTag; > long cb; > } EMS_SSizeRestriction; > > typedef struct { > long relBMR; > long ulPropTag; > long ulMask; > } EMS_SBitMaskRestriction; > > typedef struct { > long relop; > long ulPropTag1; > long ulPropTag2; > } EMS_SComparePropsRestriction; > > typedef struct { > long ulSubObject; > LPSRestriction lpRes; > } EMS_SSubRestriction; > > typedef struct { > [unique] MAPIUID *lpguid; > long ulKind; > long lID; /* this is actually a union in mapidefs.h */ > } EMS_MAPINAMEID; > > /* Restriction types */ > #define RES_AND 0U > #define RES_OR 1U > #define RES_NOT 2U > #define RES_CONTENT 3U > #define RES_PROPERTY 4U > #define RES_COMPAREPROPS 5U > #define RES_BITMASK 6U > #define RES_SIZE 7U > #define RES_EXIST 8U > #define RES_SUBRESTRICTION 9U > #define RES_COMMENT 10U > > typedef [switch_type(long)] union { > [case(RES_AND) ] EMS_SAndRestriction resAnd; > [case(RES_OR) ] EMS_SOrRestriction resOr; > [case(RES_NOT) ] EMS_SNotRestriction resNot; > [case(RES_CONTENT) ] EMS_SContentRestriction resContent; > [case(RES_PROPERTY) ] EMS_SPropertyRestriction resProperty; > [case(RES_COMPAREPROPS) ] EMS_SComparePropsRestriction resCompareProps; > [case(RES_BITMASK) ] EMS_SBitMaskRestriction resBitMask; > [case(RES_SUBRESTRICTION)] EMS_SSubRestriction resSub; > [case(RES_SIZE) ] EMS_SSizeRestriction resSize; > [case(RES_EXIST) ] EMS_SExistRestriction resExist; > /* case SCommentRestriction is missing! */ > } EMS_SRestriction_CTR; > > typedef struct _SRestriction { > long rt; > [switch_is(rt)] EMS_SRestriction_CTR res; > } EMS_SRestriction; > > long NspiGetMatches( > [in] emsabp_hnd_t element_110, > [in] long element_111, > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_112, > [in, unique] EMS_SPropTagArray *element_113, > [in] long element_114, > [in, unique] EMS_SRestriction *element_115, > [in, unique] EMS_MAPINAMEID *element_116, > [in] long element_117, > [out, ref] EMS_SPropTagArray *element_118, > [in, ref] EMS_SPropTagArray *element_119, > [out, ref] EMS_SRowSet_PTR *element_120 > ); > > long NspiResortRestriction( > [in] emsabp_hnd_t element_121, > [in] long element_122, > [in,out, ref] EMS_MAPI_UNIDENTIFIED *element_123, > [in, ref] EMS_SPropTagArray *element_124, > [in,out, ref] EMS_LPSPropTagArray *element_125 > ); > > typedef struct { > long element_126; > [unique, string] char *element_127; > } EMS_NAME_STRING; > > long NspiDNToEph( > [in] emsabp_hnd_t element_128, > [in] long element_129, > [in, ref] EMS_NAME_STRING *element_130, > [out, ref] EMS_SPropTagArray *element_131 > ); > > long NspiGetPropList( > [in] emsabp_hnd_t element_132, > [in] long element_133, > [in] long element_134, > [in] long element_135, > [out, ref] EMS_LPSPropTagArray *element_136 > ); > > long NspiGetProps( > [in] emsabp_hnd_t element_137, > [in] long element_138, > [in, ref] EMS_MAPI_UNIDENTIFIED *element_139, > [in, unique] EMS_SPropTagArray *element_140, > [out, ref] EMS_SRow_PTR *element_141 > ); > > long NspiCompareDNTs( > [in] emsabp_hnd_t element_142, > [in] long element_143, > [in, ref] EMS_MAPI_UNIDENTIFIED *element_144, > [in] long element_145, > [in] long element_146, > [out, ref] long *element_147 > ); > > long NspiModProps( > [in] emsabp_hnd_t element_148, > [in] long element_149, > [in, ref] EMS_MAPI_UNIDENTIFIED *element_150, > [in, unique] EMS_SPropTagArray *element_151, > [in, ref] EMS_SRow *element_152 > ); > > long NspiGetHierarchyInfo( > [in] emsabp_hnd_t element_153, > [in] long element_154, > [in, ref] EMS_MAPI_UNIDENTIFIED *element_155, > [in,out, ref] long *element_156, > [out, ref] EMS_SRowSet_PTR *element_157 > ); > > long NspiGetTemplateInfo( > [in] emsabp_hnd_t element_158, > [in] long element_159, > [in] long element_160, > [in, unique, string] char *element_161, > [in] long element_162, > [in] long element_163, > [out, ref] EMS_SRow_PTR *element_164 > ); > > long NspiModLInkAtt( > [in] emsabp_hnd_t element_165, > [in] long element_166, > [in] long element_167, > [in] long element_168, > [in, ref] EMS_SBinaryArray *element_169 > ); > > long NspiDeleteEntries( > [in] emsabp_hnd_t element_170, > [in] long element_171, > [in] long element_172, > [in, ref] EMS_SBinaryArray *element_173 > ); > > long NspiQueryColumns( > [in] emsabp_hnd_t element_174, > [in] long element_175, > [in] long element_176, > [out, ref] EMS_LPSPropTagArray *element_177 > ); > > typedef struct { > long element_178; > [unique] MAPIUID *element_179; > } EMS_NAME_CLSID; > > typedef [ptr] EMS_NAME_CLSID *EMS_NAME_CLSID_PTR; > > long NspiGetNamesFromIDs( > [in] emsabp_hnd_t element_180, > [in] long element_181, > [in, unique] MAPIUID *element_182, > [in, unique] EMS_SPropTagArray *element_183, > [out, ref] EMS_LPSPropTagArray *element_184, > [out, ref] EMS_NAME_CLSID_PTR *element_185 > ); > > long NspiGetIDsFromNames( > [in] emsabp_hnd_t element_186, > [in] long element_187, > [in] long element_188, > [in] long element_189, > [in, size_is(element_189), ref] long *element_190, > [out, ref] EMS_LPSPropTagArray *element_191 > ); > > long NspiResolveNames( > [in] emsabp_hnd_t element_192, > [in] long element_193, > [in, ref] EMS_MAPI_UNIDENTIFIED *element_194, > [in, unique] EMS_SPropTagArray *element_195, > [in, ref] EMS_NAME_STRING *element_196, > [out, ref] EMS_LPSPropTagArray *element_197, > [out, ref] EMS_SRowSet_PTR *element_198 > ); > > typedef struct { > long element_199; > [unique, string] WCHAR *element_200; > } EMS_NAME_UNICODE; > > long NspiResolveNamesW( > [in] emsabp_hnd_t element_201, > [in] long element_202, > [in, ref] EMS_MAPI_UNIDENTIFIED *element_203, > [in, unique] EMS_SPropTagArray *element_204, > [in, ref] EMS_NAME_UNICODE *element_205, > [out, ref] EMS_LPSPropTagArray *element_206, > [out, ref] EMS_SRowSet_PTR *element_207 > ); > > } > > _______________________________________________ > evolution-hackers maillist - [email protected] > http://lists.ximian.com/mailman/listinfo/evolution-hackers > _______________________________________________ evolution-hackers maillist - [email protected] http://lists.ximian.com/mailman/listinfo/evolution-hackers
