tnef 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. data/ext/tnef/AUTHORS +7 -0
  2. data/ext/tnef/BUGS.in +5 -0
  3. data/ext/tnef/COPYING +340 -0
  4. data/ext/tnef/ChangeLog +1550 -0
  5. data/ext/tnef/INSTALL +234 -0
  6. data/ext/tnef/Makefile.am +7 -0
  7. data/ext/tnef/Makefile.in +699 -0
  8. data/ext/tnef/NEWS +177 -0
  9. data/ext/tnef/README +39 -0
  10. data/ext/tnef/THANKS +1 -0
  11. data/ext/tnef/TODO +7 -0
  12. data/ext/tnef/acinclude.m4 +47 -0
  13. data/ext/tnef/aclocal.m4 +1012 -0
  14. data/ext/tnef/configure +6815 -0
  15. data/ext/tnef/configure.in +67 -0
  16. data/ext/tnef/depcomp +584 -0
  17. data/ext/tnef/doc/FAQ +25 -0
  18. data/ext/tnef/doc/Makefile.am +6 -0
  19. data/ext/tnef/doc/Makefile.in +623 -0
  20. data/ext/tnef/doc/file-format.tex +139 -0
  21. data/ext/tnef/doc/tnef.1.in +183 -0
  22. data/ext/tnef/doc/www/Makefile.am +14 -0
  23. data/ext/tnef/doc/www/Makefile.in +542 -0
  24. data/ext/tnef/doc/www/cgi-bin/Makefile.am +14 -0
  25. data/ext/tnef/doc/www/cgi-bin/Makefile.in +340 -0
  26. data/ext/tnef/doc/www/htdocs/Makefile.am +14 -0
  27. data/ext/tnef/doc/www/htdocs/Makefile.in +340 -0
  28. data/ext/tnef/extconf.rb +3 -0
  29. data/ext/tnef/install-sh +507 -0
  30. data/ext/tnef/missing +367 -0
  31. data/ext/tnef/mkinstalldirs +161 -0
  32. data/ext/tnef/src/Makefile.am +48 -0
  33. data/ext/tnef/src/Makefile.in +700 -0
  34. data/ext/tnef/src/alloc.c +107 -0
  35. data/ext/tnef/src/alloc.h +54 -0
  36. data/ext/tnef/src/attr.c +270 -0
  37. data/ext/tnef/src/attr.h +74 -0
  38. data/ext/tnef/src/common.h +101 -0
  39. data/ext/tnef/src/config.h.in +111 -0
  40. data/ext/tnef/src/date.c +66 -0
  41. data/ext/tnef/src/date.h +43 -0
  42. data/ext/tnef/src/debug.c +45 -0
  43. data/ext/tnef/src/debug.h +32 -0
  44. data/ext/tnef/src/file.c +259 -0
  45. data/ext/tnef/src/file.h +48 -0
  46. data/ext/tnef/src/main.c +386 -0
  47. data/ext/tnef/src/mapi-names.data +430 -0
  48. data/ext/tnef/src/mapi-types.data +19 -0
  49. data/ext/tnef/src/mapi_attr.c +419 -0
  50. data/ext/tnef/src/mapi_attr.h +78 -0
  51. data/ext/tnef/src/mkdata.awk +100 -0
  52. data/ext/tnef/src/options.c +32 -0
  53. data/ext/tnef/src/options.h +67 -0
  54. data/ext/tnef/src/path.c +397 -0
  55. data/ext/tnef/src/path.h +34 -0
  56. data/ext/tnef/src/replace/Makefile.am +8 -0
  57. data/ext/tnef/src/replace/Makefile.in +435 -0
  58. data/ext/tnef/src/replace/basename.c +45 -0
  59. data/ext/tnef/src/replace/dummy.c +7 -0
  60. data/ext/tnef/src/replace/getopt_long.c +940 -0
  61. data/ext/tnef/src/replace/getopt_long.h +141 -0
  62. data/ext/tnef/src/replace/malloc.c +41 -0
  63. data/ext/tnef/src/replace/strdup.c +51 -0
  64. data/ext/tnef/src/rtf.c +362 -0
  65. data/ext/tnef/src/rtf.h +36 -0
  66. data/ext/tnef/src/tnef-names.data +34 -0
  67. data/ext/tnef/src/tnef-types.data +12 -0
  68. data/ext/tnef/src/tnef.c +396 -0
  69. data/ext/tnef/src/tnef.h +45 -0
  70. data/ext/tnef/src/util.c +112 -0
  71. data/ext/tnef/src/util.h +42 -0
  72. data/ext/tnef/src/write.c +136 -0
  73. data/ext/tnef/src/write.h +25 -0
  74. data/ext/tnef/src/xstrdup.c +41 -0
  75. data/ext/tnef/tests/Makefile.am +4 -0
  76. data/ext/tnef/tests/Makefile.in +530 -0
  77. data/ext/tnef/tests/cmdline/AUTHORS +8 -0
  78. data/ext/tnef/tests/cmdline/AUTHORS.baseline +8 -0
  79. data/ext/tnef/tests/cmdline/Makefile.am +33 -0
  80. data/ext/tnef/tests/cmdline/Makefile.in +455 -0
  81. data/ext/tnef/tests/cmdline/basic.baseline +4 -0
  82. data/ext/tnef/tests/cmdline/basic.test +39 -0
  83. data/ext/tnef/tests/cmdline/body-test.html.baseline +95 -0
  84. data/ext/tnef/tests/cmdline/body.baseline +929 -0
  85. data/ext/tnef/tests/cmdline/body.test +55 -0
  86. data/ext/tnef/tests/cmdline/debug.baseline +155 -0
  87. data/ext/tnef/tests/cmdline/debug.test +14 -0
  88. data/ext/tnef/tests/cmdline/directory.baseline +3 -0
  89. data/ext/tnef/tests/cmdline/directory.test +35 -0
  90. data/ext/tnef/tests/cmdline/help.baseline +63 -0
  91. data/ext/tnef/tests/cmdline/help.test +12 -0
  92. data/ext/tnef/tests/cmdline/interactive.test +5 -0
  93. data/ext/tnef/tests/cmdline/list.baseline +5 -0
  94. data/ext/tnef/tests/cmdline/list.test +21 -0
  95. data/ext/tnef/tests/cmdline/maxsize.baseline +828 -0
  96. data/ext/tnef/tests/cmdline/maxsize.test +43 -0
  97. data/ext/tnef/tests/cmdline/message.html.baseline +95 -0
  98. data/ext/tnef/tests/cmdline/mime-types.baseline +3 -0
  99. data/ext/tnef/tests/cmdline/mime-types.test +11 -0
  100. data/ext/tnef/tests/cmdline/overwrite.baseline +8 -0
  101. data/ext/tnef/tests/cmdline/overwrite.test +40 -0
  102. data/ext/tnef/tests/cmdline/rtf-test.rtf.baseline +0 -0
  103. data/ext/tnef/tests/cmdline/stdin.baseline +2 -0
  104. data/ext/tnef/tests/cmdline/stdin.test +18 -0
  105. data/ext/tnef/tests/cmdline/test.tnef +0 -0
  106. data/ext/tnef/tests/cmdline/triples-test-2.rtf.baseline +0 -0
  107. data/ext/tnef/tests/cmdline/triples-test-2.txt.baseline +0 -0
  108. data/ext/tnef/tests/cmdline/triples-test.txt.baseline +0 -0
  109. data/ext/tnef/tests/cmdline/use-path.baseline +0 -0
  110. data/ext/tnef/tests/cmdline/use-path.test +5 -0
  111. data/ext/tnef/tests/cmdline/verbose.baseline +5 -0
  112. data/ext/tnef/tests/cmdline/verbose.test +19 -0
  113. data/ext/tnef/tests/cmdline/version.baseline +17 -0
  114. data/ext/tnef/tests/cmdline/version.test +14 -0
  115. data/ext/tnef/tests/files/MAPI_ATTACH_DATA_OBJ.test +9 -0
  116. data/ext/tnef/tests/files/MAPI_OBJECT.test +9 -0
  117. data/ext/tnef/tests/files/Makefile.am +16 -0
  118. data/ext/tnef/tests/files/Makefile.in +636 -0
  119. data/ext/tnef/tests/files/baselines/AUTHORS.baseline +8 -0
  120. data/ext/tnef/tests/files/baselines/AUTOEXEC.BAT.baseline +0 -0
  121. data/ext/tnef/tests/files/baselines/CONFIG.SYS.baseline +0 -0
  122. data/ext/tnef/tests/files/baselines/MAPI_ATTACH_DATA_OBJ-body.rtf.baseline +0 -0
  123. data/ext/tnef/tests/files/baselines/MAPI_ATTACH_DATA_OBJ.baseline +229 -0
  124. data/ext/tnef/tests/files/baselines/MAPI_OBJECT-body.rtf.baseline +0 -0
  125. data/ext/tnef/tests/files/baselines/MAPI_OBJECT.baseline +153 -0
  126. data/ext/tnef/tests/files/baselines/Makefile.am +35 -0
  127. data/ext/tnef/tests/files/baselines/Makefile.in +361 -0
  128. data/ext/tnef/tests/files/baselines/README.baseline +31 -0
  129. data/ext/tnef/tests/files/baselines/TechlibDEC99-JAN00.doc.baseline +0 -0
  130. data/ext/tnef/tests/files/baselines/TechlibDEC99.doc.baseline +0 -0
  131. data/ext/tnef/tests/files/baselines/TechlibNOV99.doc.baseline +0 -0
  132. data/ext/tnef/tests/files/baselines/Untitled_Attachment.baseline +0 -0
  133. data/ext/tnef/tests/files/baselines/VIA_Nytt_1402.doc.baseline +0 -0
  134. data/ext/tnef/tests/files/baselines/VIA_Nytt_1402.pdf.baseline +0 -0
  135. data/ext/tnef/tests/files/baselines/VIA_Nytt_14021.htm.baseline +1914 -0
  136. data/ext/tnef/tests/files/baselines/body-body.html.baseline +95 -0
  137. data/ext/tnef/tests/files/baselines/body.baseline +124 -0
  138. data/ext/tnef/tests/files/baselines/boot.ini.baseline +6 -0
  139. data/ext/tnef/tests/files/baselines/data-before-name-body.rtf.baseline +0 -0
  140. data/ext/tnef/tests/files/baselines/data-before-name.baseline +213 -0
  141. data/ext/tnef/tests/files/baselines/garbage-at-end.baseline +73 -0
  142. data/ext/tnef/tests/files/baselines/generpts.src.baseline +1691 -0
  143. data/ext/tnef/tests/files/baselines/long-filename-body.rtf.baseline +26 -0
  144. data/ext/tnef/tests/files/baselines/long-filename.baseline +218 -0
  145. data/ext/tnef/tests/files/baselines/message.rtf.baseline +0 -0
  146. data/ext/tnef/tests/files/baselines/missing-filenames-body.rtf.baseline +20 -0
  147. data/ext/tnef/tests/files/baselines/missing-filenames.baseline +252 -0
  148. data/ext/tnef/tests/files/baselines/multi-name-property.baseline +243 -0
  149. data/ext/tnef/tests/files/baselines/one-file.baseline +155 -0
  150. data/ext/tnef/tests/files/baselines/rtf-body.rtf.baseline +0 -0
  151. data/ext/tnef/tests/files/baselines/rtf.baseline +167 -0
  152. data/ext/tnef/tests/files/baselines/triples-body.rtf.baseline +0 -0
  153. data/ext/tnef/tests/files/baselines/triples.baseline +254 -0
  154. data/ext/tnef/tests/files/baselines/two-files.baseline +186 -0
  155. data/ext/tnef/tests/files/body.test +9 -0
  156. data/ext/tnef/tests/files/data-before-name.test +9 -0
  157. data/ext/tnef/tests/files/datafiles/MAPI_ATTACH_DATA_OBJ.list +4 -0
  158. data/ext/tnef/tests/files/datafiles/MAPI_ATTACH_DATA_OBJ.tnef +0 -0
  159. data/ext/tnef/tests/files/datafiles/MAPI_OBJECT.list +2 -0
  160. data/ext/tnef/tests/files/datafiles/MAPI_OBJECT.tnef +0 -0
  161. data/ext/tnef/tests/files/datafiles/Makefile.am +27 -0
  162. data/ext/tnef/tests/files/datafiles/Makefile.in +351 -0
  163. data/ext/tnef/tests/files/datafiles/body.list +1 -0
  164. data/ext/tnef/tests/files/datafiles/body.tnef +0 -0
  165. data/ext/tnef/tests/files/datafiles/data-before-name.list +4 -0
  166. data/ext/tnef/tests/files/datafiles/data-before-name.tnef +0 -0
  167. data/ext/tnef/tests/files/datafiles/garbage-at-end.list +0 -0
  168. data/ext/tnef/tests/files/datafiles/garbage-at-end.tnef +0 -0
  169. data/ext/tnef/tests/files/datafiles/long-filename.list +1 -0
  170. data/ext/tnef/tests/files/datafiles/long-filename.tnef +0 -0
  171. data/ext/tnef/tests/files/datafiles/missing-filenames.list +1 -0
  172. data/ext/tnef/tests/files/datafiles/missing-filenames.tnef +0 -0
  173. data/ext/tnef/tests/files/datafiles/multi-name-property.list +0 -0
  174. data/ext/tnef/tests/files/datafiles/multi-name-property.tnef +0 -0
  175. data/ext/tnef/tests/files/datafiles/one-file.list +1 -0
  176. data/ext/tnef/tests/files/datafiles/one-file.tnef +0 -0
  177. data/ext/tnef/tests/files/datafiles/rtf.list +1 -0
  178. data/ext/tnef/tests/files/datafiles/rtf.tnef +0 -0
  179. data/ext/tnef/tests/files/datafiles/triples.list +1 -0
  180. data/ext/tnef/tests/files/datafiles/triples.tnef +0 -0
  181. data/ext/tnef/tests/files/datafiles/two-files.list +2 -0
  182. data/ext/tnef/tests/files/datafiles/two-files.tnef +0 -0
  183. data/ext/tnef/tests/files/file-util.sh +38 -0
  184. data/ext/tnef/tests/files/garbage-at-end.test +9 -0
  185. data/ext/tnef/tests/files/long-filename.test +9 -0
  186. data/ext/tnef/tests/files/missing-filenames.test +9 -0
  187. data/ext/tnef/tests/files/multi-name-property.test +9 -0
  188. data/ext/tnef/tests/files/one-file.test +9 -0
  189. data/ext/tnef/tests/files/rtf.test +9 -0
  190. data/ext/tnef/tests/files/triples.test +9 -0
  191. data/ext/tnef/tests/files/two-files.test +9 -0
  192. data/ext/tnef/tests/util.sh +32 -0
  193. data/ext/tnef/tnef.spec.in +44 -0
  194. data/lib/tnef.rb +30 -0
  195. data/lib/tnef/executable.rb +27 -0
  196. data/lib/tnef/version.rb +3 -0
  197. metadata +243 -0
@@ -0,0 +1,19 @@
1
+ # mapi-types.data -- data file defining all types found in MAPI TNEF attachment
2
+ # sym val name
3
+ szMAPI_UNSPECIFIED 0x0000 MAPI Unspecified
4
+ szMAPI_NULL 0x0001 MAPI null property
5
+ szMAPI_SHORT 0x0002 MAPI short (signed 16 bits)
6
+ szMAPI_INT 0x0003 MAPI integer (signed 32 bits)
7
+ szMAPI_FLOAT 0x0004 MAPI float (4 bytes)
8
+ szMAPI_DOUBLE 0x0005 MAPI double
9
+ szMAPI_CURRENCY 0x0006 MAPI currency (64 bits)
10
+ szMAPI_APPTIME 0x0007 MAPI application time
11
+ szMAPI_ERROR 0x000a MAPI error (32 bits)
12
+ szMAPI_BOOLEAN 0x000b MAPI boolean (16 bits)
13
+ szMAPI_OBJECT 0x000d MAPI embedded object
14
+ szMAPI_INT8BYTE 0x0014 MAPI 8 byte signed int
15
+ szMAPI_STRING 0x001e MAPI string
16
+ szMAPI_UNICODE_STRING 0x001f MAPI unicode-string (null terminated)
17
+ szMAPI_SYSTIME 0x0040 MAPI time (64 bits)
18
+ szMAPI_CLSID 0x0048 MAPI OLE GUID
19
+ szMAPI_BINARY 0x0102 MAPI binary
@@ -0,0 +1,419 @@
1
+ /*
2
+ * mapi_attr.c -- Functions for handling MAPI attributes
3
+ *
4
+ * Copyright (C)1999-2006 Mark Simpson <damned@theworld.com>
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation; either version 2, or (at your option)
9
+ * any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, you can either send email to this
18
+ * program's maintainer or write to: The Free Software Foundation,
19
+ * Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
20
+ *
21
+ */
22
+ #ifdef HAVE_CONFIG_H
23
+ # include "config.h"
24
+ #endif /* HAVE_CONFIG_H */
25
+
26
+ #include "common.h"
27
+
28
+ #include "mapi_attr.h"
29
+ #include "alloc.h"
30
+ #include "options.h"
31
+ #include "util.h"
32
+ #include "write.h"
33
+
34
+ /* return the length padded to a 4 byte boundary */
35
+ static size_t
36
+ pad_to_4byte (size_t length)
37
+ {
38
+ return (length+3) & ~3;
39
+ }
40
+
41
+ /* Copy the GUID data from a character buffer */
42
+ static void
43
+ copy_guid_from_buf (GUID* guid, unsigned char *buf)
44
+ {
45
+ int i;
46
+ int idx = 0;
47
+ assert (guid);
48
+ assert (buf);
49
+
50
+ guid->data1 = GETINT32(buf + idx); idx += sizeof (uint32);
51
+ guid->data2 = GETINT16(buf + idx); idx += sizeof (uint16);
52
+ guid->data3 = GETINT16(buf + idx); idx += sizeof (uint16);
53
+ for (i = 0; i < 8; i++, idx += sizeof (uint8))
54
+ guid->data4[i] = (uint8)(buf[idx]);
55
+ }
56
+
57
+
58
+ /* dumps info about MAPI attributes... useful for debugging */
59
+ static void
60
+ mapi_attr_dump (MAPI_Attr* attr)
61
+ {
62
+ char *name = get_mapi_name_str (attr->name);
63
+ char *type = get_mapi_type_str (attr->type);
64
+ size_t i;
65
+
66
+ fprintf (stdout, "(MAPI) %s [type: %s] [num_values = %lu] = \n",
67
+ name, type, (unsigned long)attr->num_values);
68
+ if (attr->guid)
69
+ {
70
+ fprintf (stdout, "\tGUID: ");
71
+ write_guid (stdout, attr->guid);
72
+ fputc ('\n', stdout);
73
+ }
74
+
75
+ for (i = 0; i < attr->num_names; i++)
76
+ fprintf (stdout, "\tname #%d: '%s'\n", (int)i, attr->names[i].data);
77
+
78
+ for (i = 0; i < attr->num_values; i++)
79
+ {
80
+ fprintf (stdout, "\t#%lu [len: %lu] = ",
81
+ (unsigned long)i,
82
+ (unsigned long)attr->values[i].len);
83
+
84
+ switch (attr->type)
85
+ {
86
+ case szMAPI_NULL:
87
+ fprintf (stdout, "NULL");
88
+ break;
89
+
90
+ case szMAPI_SHORT:
91
+ write_int16 (stdout, (int16)attr->values[i].data.bytes2);
92
+ break;
93
+
94
+ case szMAPI_INT:
95
+ write_int32 (stdout, (int32)attr->values[i].data.bytes4);
96
+ break;
97
+
98
+ case szMAPI_FLOAT:
99
+ case szMAPI_DOUBLE:
100
+ write_float (stdout, (float)attr->values[i].data.bytes4);
101
+ break;
102
+
103
+ case szMAPI_BOOLEAN:
104
+ write_boolean (stdout, attr->values[i].data.bytes4);
105
+ break;
106
+
107
+ case szMAPI_STRING:
108
+ case szMAPI_UNICODE_STRING:
109
+ write_string (stdout, (char*)attr->values[i].data.buf);
110
+ break;
111
+
112
+ case szMAPI_SYSTIME:
113
+ case szMAPI_CURRENCY:
114
+ case szMAPI_INT8BYTE:
115
+ case szMAPI_APPTIME:
116
+ write_uint64 (stdout, attr->values[i].data.bytes8);
117
+ break;
118
+
119
+ case szMAPI_ERROR:
120
+ write_uint32 (stdout, attr->values[i].data.bytes4);
121
+ break;
122
+
123
+ case szMAPI_CLSID:
124
+ write_guid (stdout, &attr->values[i].data.guid);
125
+ break;
126
+
127
+ case szMAPI_OBJECT:
128
+ case szMAPI_BINARY:
129
+ {
130
+ size_t x;
131
+
132
+ for (x = 0; x < attr->values[i].len; x++)
133
+ {
134
+ write_byte (stdout, (uint8)attr->values[i].data.buf[x]);
135
+ fputc (' ', stdout);
136
+ }
137
+ }
138
+ break;
139
+
140
+ default:
141
+ fprintf (stdout, "<unknown type>");
142
+ break;
143
+ }
144
+ fprintf (stdout, "\n");
145
+ }
146
+
147
+ fflush( NULL );
148
+ }
149
+
150
+ static MAPI_Value*
151
+ alloc_mapi_values (MAPI_Attr* a)
152
+ {
153
+ if (a && a->num_values)
154
+ {
155
+ a->values = CHECKED_XCALLOC (MAPI_Value, a->num_values);
156
+ return a->values;
157
+ }
158
+ return NULL;
159
+ }
160
+
161
+ /*
162
+ 2009/07/07
163
+ Microsoft documentation reference: [MS-OXPROPS] v 2.0, April 10, 2009
164
+
165
+ only multivalue types appearing are:
166
+ szMAPI_INT, szMAPI_SYSTIME, szMAPI_UNICODE_STRING, szMAPI_BINARY
167
+ */
168
+
169
+ /* parses out the MAPI attibutes hidden in the character buffer */
170
+ MAPI_Attr**
171
+ mapi_attr_read (size_t len, unsigned char *buf)
172
+ {
173
+ size_t idx = 0;
174
+ uint32 i,j,mvf;
175
+ uint32 num_properties = GETINT32(buf+idx);
176
+ MAPI_Attr** attrs = CHECKED_XMALLOC (MAPI_Attr*, (num_properties + 1));
177
+
178
+ idx += 4;
179
+
180
+ if (!attrs) return NULL;
181
+ for (i = 0; i < num_properties; i++)
182
+ {
183
+ MAPI_Attr* a = attrs[i] = CHECKED_XCALLOC(MAPI_Attr, 1);
184
+ MAPI_Value* v = NULL;
185
+
186
+ a->type = GETINT16(buf+idx); idx += 2;
187
+ a->name = GETINT16(buf+idx); idx += 2;
188
+
189
+
190
+ /* Multi-valued attributes have their type modified by the MULTI_VALUE_FLAG value */
191
+ if (a->type & MULTI_VALUE_FLAG)
192
+ {
193
+ a->type -= MULTI_VALUE_FLAG;
194
+ mvf = 1;
195
+
196
+ if (DEBUG_ON)
197
+ {
198
+ fprintf( stdout, "!!MULTI_VALUE_FLAG seen (0x%02x 0x%02x)\n", a->name, a->type );
199
+ fflush( NULL );
200
+ }
201
+ }
202
+ else
203
+ {
204
+ mvf = 0;
205
+ }
206
+
207
+ /* handle special case of GUID prefixed properties */
208
+ if (a->name >= GUID_EXISTS_FLAG)
209
+ {
210
+ /* copy GUID */
211
+ a->guid = CHECKED_XMALLOC(GUID, 1);
212
+ copy_guid_from_buf(a->guid, buf+idx);
213
+ idx += sizeof (GUID);
214
+
215
+ a->num_names = GETINT32(buf+idx); idx += 4;
216
+ if (a->num_names > 0)
217
+ {
218
+ /* FIXME: do something useful here! */
219
+ size_t i;
220
+
221
+ a->names = CHECKED_XCALLOC(VarLenData, a->num_names);
222
+
223
+ for (i = 0; i < a->num_names; i++)
224
+ {
225
+ size_t j;
226
+
227
+ a->names[i].len = GETINT32(buf+idx); idx += 4;
228
+
229
+ /* read the data into a buffer */
230
+ a->names[i].data
231
+ = CHECKED_XMALLOC(unsigned char, a->names[i].len);
232
+ for (j = 0; j < (a->names[i].len >> 1); j++)
233
+ a->names[i].data[j] = (buf+idx)[j*2];
234
+
235
+ /* But what are we going to do with it? */
236
+
237
+ idx += pad_to_4byte(a->names[i].len);
238
+ }
239
+ }
240
+ else
241
+ {
242
+ /* get the 'real' name */
243
+ a->name = GETINT32(buf+idx); idx+= 4;
244
+ }
245
+ }
246
+
247
+ switch (a->type)
248
+ {
249
+ case szMAPI_SHORT: /* 2 bytes */
250
+ assert(!mvf);
251
+ a->num_values = 1;
252
+ v = alloc_mapi_values (a);
253
+ v->len = 2;
254
+ v->data.bytes2 = GETINT16(buf+idx);
255
+ idx += 4; /* assume padding of 2, advance by 4! */
256
+ break;
257
+
258
+ case szMAPI_INT: /* 4 bytes, possible MV */
259
+ if ( mvf )
260
+ {
261
+ a->num_values = GETINT32(buf+idx);
262
+ idx += 4;
263
+ }
264
+ else
265
+ {
266
+ a->num_values = 1;
267
+ }
268
+ v = alloc_mapi_values (a);
269
+ for ( j=0; j< a->num_values; j++ )
270
+ {
271
+ v->len = 4;
272
+ v->data.bytes4 = GETINT32(buf+idx);
273
+ idx += 4;
274
+ v++;
275
+ }
276
+ break;
277
+
278
+ case szMAPI_FLOAT: /* 4 bytes */
279
+ case szMAPI_BOOLEAN: /* this should be 2 bytes + 2 padding */
280
+ assert(!mvf);
281
+ a->num_values = 1;
282
+ v = alloc_mapi_values (a);
283
+ v->len = 4;
284
+ v->data.bytes4 = GETINT32(buf+idx);
285
+ idx += v->len;
286
+ break;
287
+
288
+ case szMAPI_SYSTIME: /* 8 bytes */
289
+ if ( mvf )
290
+ {
291
+ a->num_values = GETINT32(buf+idx);
292
+ idx += 4;
293
+ }
294
+ else
295
+ {
296
+ a->num_values = 1;
297
+ }
298
+ v = alloc_mapi_values (a);
299
+ for ( j=0; j< a->num_values; j++ )
300
+ {
301
+ v->len = 8;
302
+ v->data.bytes8[0] = GETINT32(buf+idx);
303
+ v->data.bytes8[1] = GETINT32(buf+idx+4);
304
+ idx += 8;
305
+ v++;
306
+ }
307
+ break;
308
+
309
+ case szMAPI_DOUBLE: /* 8 bytes */
310
+ case szMAPI_APPTIME:
311
+ case szMAPI_CURRENCY:
312
+ case szMAPI_INT8BYTE:
313
+ assert(!mvf);
314
+ a->num_values = 1;
315
+ v = alloc_mapi_values (a);
316
+ v->len = 8;
317
+ v->data.bytes8[0] = GETINT32(buf+idx);
318
+ v->data.bytes8[1] = GETINT32(buf+idx+4);
319
+ idx += v->len;
320
+ break;
321
+
322
+ case szMAPI_CLSID:
323
+ assert(!mvf);
324
+ a->num_values = 1;
325
+ v = alloc_mapi_values (a);
326
+ v->len = sizeof (GUID);
327
+ copy_guid_from_buf(&v->data.guid, buf+idx);
328
+ idx += v->len;
329
+ break;
330
+
331
+ case szMAPI_STRING:
332
+ case szMAPI_UNICODE_STRING:
333
+ case szMAPI_OBJECT:
334
+ case szMAPI_BINARY: /* variable length */
335
+ a->num_values = GETINT32(buf+idx); idx += 4;
336
+ v = alloc_mapi_values (a);
337
+ for (j = 0; j < a->num_values; j++)
338
+ {
339
+ v->len = GETINT32(buf+idx); idx += 4;
340
+
341
+ if (a->type == szMAPI_UNICODE_STRING)
342
+ {
343
+ v->data.buf = (unsigned char*)unicode_to_utf8(v->len, buf+idx);
344
+ }
345
+ else
346
+ {
347
+ v->data.buf = CHECKED_XMALLOC(unsigned char, v->len);
348
+ memmove (v->data.buf, buf+idx, v->len);
349
+ }
350
+
351
+ idx += pad_to_4byte(v->len);
352
+ v++;
353
+ }
354
+ break;
355
+
356
+ case szMAPI_NULL: /* illegal in input tnef streams */
357
+ case szMAPI_ERROR:
358
+ case szMAPI_UNSPECIFIED:
359
+
360
+ fprintf (stderr,
361
+ "Invalid attribute, input file may be corrupted\n");
362
+ if (!ENCODE_SKIP) exit (1);
363
+
364
+ return NULL;
365
+
366
+ default: /* should never get here */
367
+ fprintf (stderr,
368
+ "Undefined attribute, input file may be corrupted\n");
369
+ if (!ENCODE_SKIP) exit (1);
370
+
371
+ return NULL;
372
+
373
+ }
374
+ if (DEBUG_ON) mapi_attr_dump (attrs[i]);
375
+
376
+ }
377
+ attrs[i] = NULL;
378
+
379
+ return attrs;
380
+ }
381
+
382
+ static void
383
+ mapi_attr_free (MAPI_Attr* attr)
384
+ {
385
+ if (attr)
386
+ {
387
+ size_t i;
388
+ for (i = 0; i < attr->num_values; i++)
389
+ {
390
+ if ((attr->type == szMAPI_STRING)
391
+ || (attr->type == szMAPI_UNICODE_STRING)
392
+ || (attr->type == szMAPI_BINARY))
393
+ {
394
+ XFREE (attr->values[i].data.buf);
395
+ }
396
+ }
397
+ if (attr->num_names > 0) {
398
+ for (i = 0; i < attr->num_names; i++)
399
+ {
400
+ XFREE(attr->names[i].data);
401
+ }
402
+ XFREE(attr->names);
403
+ }
404
+ XFREE (attr->values);
405
+ XFREE (attr->guid);
406
+ memset (attr, '\0', sizeof (MAPI_Attr));
407
+ }
408
+ }
409
+
410
+ void
411
+ mapi_attr_free_list (MAPI_Attr** attrs)
412
+ {
413
+ int i;
414
+ for (i = 0; attrs && attrs[i]; i++)
415
+ {
416
+ mapi_attr_free (attrs[i]);
417
+ XFREE (attrs[i]);
418
+ }
419
+ }
@@ -0,0 +1,78 @@
1
+ /*
2
+ * mapi_attr.h -- Functions for handling MAPI attributes
3
+ *
4
+ * Copyright (C)1999-2006 Mark Simpson <damned@theworld.com>
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation; either version 2, or (at your option)
9
+ * any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program; if not, you can either send email to this
18
+ * program's maintainer or write to: The Free Software Foundation,
19
+ * Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
20
+ *
21
+ */
22
+ #ifndef MAPI_ATTR_H
23
+ #define MAPI_ATTR_H
24
+
25
+ #if HAVE_CONFIG_H
26
+ # include "config.h"
27
+ #endif /* HAVE_CONFIG_H */
28
+
29
+ #include "common.h"
30
+
31
+ #include "mapi_types.h"
32
+ #include "mapi_names.h"
33
+
34
+ #define MULTI_VALUE_FLAG 0x1000
35
+ #define GUID_EXISTS_FLAG 0x8000
36
+
37
+ typedef struct
38
+ {
39
+ uint32 data1;
40
+ uint16 data2;
41
+ uint16 data3;
42
+ uint8 data4[8];
43
+ } GUID;
44
+
45
+ typedef struct
46
+ {
47
+ size_t len;
48
+ union
49
+ {
50
+ unsigned char *buf;
51
+ uint16 bytes2;
52
+ uint32 bytes4;
53
+ uint32 bytes8[2];
54
+ GUID guid;
55
+ } data;
56
+ } MAPI_Value;
57
+
58
+ typedef struct
59
+ {
60
+ size_t len;
61
+ unsigned char* data;
62
+ } VarLenData;
63
+
64
+ typedef struct
65
+ {
66
+ mapi_type type;
67
+ mapi_name name;
68
+ size_t num_values;
69
+ MAPI_Value* values;
70
+ GUID *guid;
71
+ size_t num_names;
72
+ VarLenData *names;
73
+ } MAPI_Attr;
74
+
75
+ extern MAPI_Attr** mapi_attr_read (size_t len, unsigned char *buf);
76
+ extern void mapi_attr_free_list (MAPI_Attr** attrs);
77
+
78
+ #endif /* MAPI_ATTR_H */