thank you peter! there's yTNEF, there's a debian package called tnef, there's KDE tnef, there's this, that, it's kinda fun :)
On Tue, Feb 01, 2005 at 10:51:18AM -0800, Peter Colijn wrote: > 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 > > -- -- <a href="http://lkcl.net">http://lkcl.net</a> -- _______________________________________________ evolution-hackers maillist - [email protected] http://lists.ximian.com/mailman/listinfo/evolution-hackers
