Qore Mime Module Reference
1.3.1
Main Page
Modules
Namespaces
Classes
All
Classes
Namespaces
Functions
Variables
Groups
Pages
Mime.qm.dox.h
1
// -*- mode: c++; indent-tabs-mode: nil -*-
2
// @file Mime.qm Mime module definition
3
4
/* Mime.qm Copyright 2012 - 2013 David Nichols
5
6
Permission is hereby granted, free of charge, to any person obtaining a
7
copy of this software and associated documentation files (the "Software"),
8
to deal in the Software without restriction, including without limitation
9
the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
and/or sell copies of the Software, and to permit persons to whom the
11
Software is furnished to do so, subject to the following conditions:
12
13
The above copyright notice and this permission notice shall be included in
14
all copies or substantial portions of the Software.
15
16
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
DEALINGS IN THE SOFTWARE.
23
*/
24
25
26
27
/* Version History
28
* 2013-04-05 v1.3.1: David Nichols <david@qore.org>
29
+ added get_mime_type_from_ext()
30
+ minor corrections
31
+ added constants for css and js files + more extension -> mime type mappings
32
33
* 2012-11-02 v1.3: David Nichols <david@qore.org>
34
+ made get MultiPartMessage::getMsgAndHeaders() abstract as originally intended
35
+ added MultiPartMessage::parseBody() static method
36
37
* 2012-09-17 v1.2.1: David Nichols <david@qore.org>
38
+ fixed q-encoding mail headers (always encode '_' chars otherwise they will be decoded as spaces)
39
40
* 2012-06-14 v1.2: David Nichols <david@qore.org>
41
+ added MIME decoding functions
42
43
* 2012-05-31 v1.1: David Nichols <david@qore.org>
44
+ added initial MultiPartMessage classes
45
46
* 2012-05-24 v1.0: David Nichols <david@qore.org>
47
+ pulled MIME implementation out of other code and made a user module to aggregate MIME definitions and functions
48
49
based on:
50
- http://tools.ietf.org/html/rfc1521: quoted printable & base 64 transfer encodings
51
- http://tools.ietf.org/html/rfc2045: mime headers, content types, etc
52
- http://tools.ietf.org/html/rfc2047: "Q" and "B" encoded words (implemented by the Mime module)
53
*/
54
94
95
namespace
Mime {
100
101
const
MimeTypeUnknown
=
"application/octet-stream"
;
102
104
const
MimeTypeText
=
"text/plain"
;
105
107
const
MimeTypeHtml
=
"text/html"
;
108
110
const
MimeTypeCsv
=
"text/csv"
;
111
113
const
MimeTypeJpeg
=
"image/jpeg"
;
114
116
const
MimeTypePng
=
"image/png"
;
117
119
const
MimeTypeSoapXml
=
"application/soap+xml"
;
120
122
const
MimeTypeYaml
=
"text/x-yaml"
;
123
125
const
MimeTypeXml
=
"text/xml"
;
126
128
const
MimeTypeXmlApp
=
"application/xml"
;
129
131
const
MimeTypeJson
=
"application/json"
;
132
134
const
MimeTypeJsonRpc
=
MimeTypeJson
;
135
137
const
MimeTypeXmlRpc
=
MimeTypeXml
;
138
140
const
MimeTypeYamlRpc
=
"application/x-yaml"
;
141
143
const
MimeTypeJavascript
=
"application/javascript"
;
144
146
const
MimeTypeCss
=
"text/css"
;
147
149
151
const
MimeTypes
= (
152
"7z"
:
"application/x-7z-compressed"
,
153
"ai"
:
"application/postscript"
,
154
"aif"
:
"audio/x-aiff"
,
155
"aifc"
:
"audio/x-aiff"
,
156
"aiff"
:
"audio/x-aiff"
,
157
"asc"
:
MimeTypeText
,
158
"atom"
:
"application/atom+xml"
,
159
"au"
:
"audio/basic"
,
160
"avi"
:
"video/x-msvideo"
,
161
"bcpio"
:
"application/x-bcpio"
,
162
"bin"
:
MimeTypeUnknown
,
163
"bmp"
:
"image/bmp"
,
164
"bz2"
:
"application/x-bzip"
,
165
"cc"
:
MimeTypeText
,
166
"cdf"
:
"application/x-netcdf"
,
167
"cgm"
:
"image/cgm"
,
168
"class"
:
MimeTypeUnknown
,
169
"cpio"
:
"application/x-cpio"
,
170
"cpp"
:
MimeTypeText
,
171
"cpt"
:
"application/mac-compactpro"
,
172
"csh"
:
"application/x-csh"
,
173
"css"
:
MimeTypeCss
,
174
"csv"
:
MimeTypeCsv
,
175
"dcr"
:
"application/x-director"
,
176
"dif"
:
"video/x-dv"
,
177
"dir"
:
"application/x-director"
,
178
"djv"
:
"image/vnd.djvu"
,
179
"djvu"
:
"image/vnd.djvu"
,
180
"dll"
:
MimeTypeUnknown
,
181
"dmg"
:
MimeTypeUnknown
,
182
"dms"
:
MimeTypeUnknown
,
183
"doc"
:
"application/msword"
,
184
"dtd"
:
"application/xml-dtd"
,
185
"dv"
:
"video/x-dv"
,
186
"dvi"
:
"application/x-dvi"
,
187
"dxr"
:
"application/x-director"
,
188
"eps"
:
"application/postscript"
,
189
"etx"
:
"text/x-setext"
,
190
"exe"
:
MimeTypeUnknown
,
191
"ez"
:
"application/andrew-inset"
,
192
"gif"
:
"image/gif"
,
193
"gram"
:
"application/srgs"
,
194
"grxml"
:
"application/srgs+xml"
,
195
"gtar"
:
"application/x-gtar"
,
196
"gz"
:
"application/x-gzip"
,
197
"h"
:
MimeTypeText
,
198
"hdf"
:
"application/x-hdf"
,
199
"hh"
:
MimeTypeText
,
200
"hpp"
:
MimeTypeText
,
201
"hqx"
:
"application/mac-binhex40"
,
202
"htm"
:
MimeTypeHtml
,
203
"html"
:
MimeTypeHtml
,
204
"ice"
:
"x-conference/x-cooltalk"
,
205
"ico"
:
"image/x-icon"
,
206
"ics"
:
"text/calendar"
,
207
"ief"
:
"image/ief"
,
208
"ifb"
:
"text/calendar"
,
209
"iges"
:
"model/iges"
,
210
"igs"
:
"model/iges"
,
211
"jar"
:
"application/java-archive"
,
212
"java"
:
MimeTypeText
,
213
"jnlp"
:
"application/x-java-jnlp-file"
,
214
"jp2"
:
"image/jp2"
,
215
"jpe"
:
MimeTypeJpeg
,
216
"jpeg"
:
MimeTypeJpeg
,
217
"jpg"
:
MimeTypeJpeg
,
218
"js"
:
MimeTypeJavascript
,
219
"kar"
:
"audio/midi"
,
220
"latex"
:
"application/x-latex"
,
221
"lha"
:
MimeTypeUnknown
,
222
"lzh"
:
MimeTypeUnknown
,
223
"m3u"
:
"audio/x-mpegurl"
,
224
"m4a"
:
"audio/mp4a-latm"
,
225
"m4b"
:
"audio/mp4a-latm"
,
226
"m4p"
:
"audio/mp4a-latm"
,
227
"m4u"
:
"video/vnd.mpegurl"
,
228
"m4v"
:
"video/x-m4v"
,
229
"mac"
:
"image/x-macpaint"
,
230
"man"
:
"application/x-troff-man"
,
231
"mathml"
:
"application/mathml+xml"
,
232
"me"
:
"application/x-troff-me"
,
233
"mesh"
:
"model/mesh"
,
234
"mid"
:
"audio/midi"
,
235
"midi"
:
"audio/midi"
,
236
"mif"
:
"application/vnd.mif"
,
237
"mov"
:
"video/quicktime"
,
238
"movie"
:
"video/x-sgi-movie"
,
239
"mp2"
:
"audio/mpeg"
,
240
"mp3"
:
"audio/mpeg"
,
241
"mp4"
:
"video/mp4"
,
242
"mpe"
:
"video/mpeg"
,
243
"mpeg"
:
"video/mpeg"
,
244
"mpg"
:
"video/mpeg"
,
245
"mpga"
:
"audio/mpeg"
,
246
"ms"
:
"application/x-troff-ms"
,
247
"msh"
:
"model/mesh"
,
248
"mxu"
:
"video/vnd.mpegurl"
,
249
"nc"
:
"application/x-netcdf"
,
250
"oda"
:
"application/oda"
,
251
"ogg"
:
"application/ogg"
,
252
"pbm"
:
"image/x-portable-bitmap"
,
253
"pct"
:
"image/pict"
,
254
"pdb"
:
"chemical/x-pdb"
,
255
"pdf"
:
"application/pdf"
,
256
"pgm"
:
"image/x-portable-graymap"
,
257
"pgn"
:
"application/x-chess-pgn"
,
258
"pic"
:
"image/pict"
,
259
"pict"
:
"image/pict"
,
260
"png"
:
MimeTypePng
,
261
"pnm"
:
"image/x-portable-anymap"
,
262
"pnt"
:
"image/x-macpaint"
,
263
"pntg"
:
"image/x-macpaint"
,
264
"ppm"
:
"image/x-portable-pixmap"
,
265
"ppt"
:
"application/vnd.ms-powerpoint"
,
266
"ps"
:
"application/postscript"
,
267
268
// Qore script
269
"q"
:
MimeTypeText
,
270
271
// Qore class include file
272
"qc"
:
MimeTypeText
,
273
274
// Qorus function definition file
275
"qfd"
:
MimeTypeText
,
276
277
// Qorus class definition file
278
"qclass"
:
MimeTypeText
,
279
280
// Qorus constant definition file
281
"qconst"
:
MimeTypeText
,
282
283
// Qorus job definition
284
"qjob"
:
MimeTypeText
,
285
286
// Qore include file
287
"ql"
:
MimeTypeText
,
288
289
// Qore user module source
290
"qm"
:
MimeTypeText
,
291
292
// Qorus service definition
293
"qsd"
:
MimeTypeText
,
294
295
// Qorus workflow definition
296
"qwf"
:
MimeTypeText
,
297
298
"qt"
:
"video/quicktime"
,
299
"qti"
:
"image/x-quicktime"
,
300
"qtif"
:
"image/x-quicktime"
,
301
"ra"
:
"audio/x-pn-realaudio"
,
302
"ram"
:
"audio/x-pn-realaudio"
,
303
"ras"
:
"image/x-cmu-raster"
,
304
"rdf"
:
"application/rdf+xml"
,
305
"rgb"
:
"image/x-rgb"
,
306
"rm"
:
"application/vnd.rn-realmedia"
,
307
"roff"
:
"application/x-troff"
,
308
"rtf"
:
"text/rtf"
,
309
"rtx"
:
"text/richtext"
,
310
"sgm"
:
"text/sgml"
,
311
"sgml"
:
"text/sgml"
,
312
"sh"
:
"application/x-sh"
,
313
"shar"
:
"application/x-shar"
,
314
"silo"
:
"model/mesh"
,
315
"sit"
:
"application/x-stuffit"
,
316
"skd"
:
"application/x-koan"
,
317
"skm"
:
"application/x-koan"
,
318
"skp"
:
"application/x-koan"
,
319
"skt"
:
"application/x-koan"
,
320
"smi"
:
"application/smil"
,
321
"smil"
:
"application/smil"
,
322
"snd"
:
"audio/basic"
,
323
"so"
:
MimeTypeUnknown
,
324
"spl"
:
"application/x-futuresplash"
,
325
"src"
:
"application/x-wais-source"
,
326
"sv4cpio"
:
"application/x-sv4cpio"
,
327
"sv4crc"
:
"application/x-sv4crc"
,
328
"svg"
:
"image/svg+xml"
,
329
"swf"
:
"application/x-shockwave-flash"
,
330
"t"
:
"application/x-troff"
,
331
"tar"
:
"application/x-tar"
,
332
"tar.bz2"
:
"application/x-bzip-compressed-tar"
,
333
"tar.gz"
:
"application/x-tar-gz"
,
334
"tbz"
:
"application/x-bzip-compressed-tar"
,
335
"tcl"
:
"application/x-tcl"
,
336
"tex"
:
"application/x-tex"
,
337
"texi"
:
"application/x-texinfo"
,
338
"texinfo"
:
"application/x-texinfo"
,
339
"text"
:
MimeTypeText
,
340
"tgz"
:
"application/x-tar-gz"
,
341
"tif"
:
"image/tiff"
,
342
"tiff"
:
"image/tiff"
,
343
"tr"
:
"application/x-troff"
,
344
"tsv"
:
"text/tab-separated-values"
,
345
"txt"
:
MimeTypeText
,
346
"ustar"
:
"application/x-ustar"
,
347
"vcd"
:
"application/x-cdlink"
,
348
"vrml"
:
"model/vrml"
,
349
"vxml"
:
"application/voicexml+xml"
,
350
"wav"
:
"audio/x-wav"
,
351
"wbmp"
:
"image/vnd.wap.wbmp"
,
352
"wbmxl"
:
"application/vnd.wap.wbxml"
,
353
"wml"
:
"text/vnd.wap.wml"
,
354
"wmlc"
:
"application/vnd.wap.wmlc"
,
355
"wmls"
:
"text/vnd.wap.wmlscript"
,
356
"wmlsc"
:
"application/vnd.wap.wmlscriptc"
,
357
"wrl"
:
"model/vrml"
,
358
"xbm"
:
"image/x-xbitmap"
,
359
"xht"
:
"application/xhtml+xml"
,
360
"xhtml"
:
"application/xhtml+xml"
,
361
"xls"
:
"application/vnd.ms-excel"
,
362
"xml"
:
MimeTypeXml
,
363
"xpm"
:
"image/x-xpixmap"
,
364
"xsl"
:
"application/xml"
,
365
"xslt"
:
"application/xslt+xml"
,
366
"xul"
:
"application/vnd.mozilla.xul+xml"
,
367
"xwd"
:
"image/x-xwindowdump"
,
368
"xyz"
:
"chemical/x-xyz"
,
369
"yaml"
:
MimeTypeYaml
,
370
"zip"
:
"application/zip"
,
371
);
373
377
378
const
ContentTransEnc7Bit
=
"7bit"
;
379
381
const
ContentTransEnc8Bit
=
"8bit"
;
382
384
const
ContentTransEncBinary
=
"binary"
;
385
387
const
ContentTransEncBase64
=
"base64"
;
388
390
const
ContentTransEncQuotedPrintable
=
"quoted-printable"
;
391
393
395
const
MimeBase64LineLen
= 76;
396
398
400
const
MimeQuotedPrintableLineLen
= 76;
402
406
407
412
string
mime_encode_base64
(data str,
int
len =
MimeBase64LineLen
);
413
414
416
419
string
mime_encode_quoted_printable
(
string
str,
bool
hdr =
False
);
420
421
423
428
data
mime_encode_transfer_data
(data data,
string
enc);
429
430
432
string
mime_encode_header_word_b
(
string
str);
433
434
436
string
mime_encode_header_word_q
(
string
str);
437
439
443
444
448
binary
mime_decode_base64
(data str);
449
450
452
457
string
mime_decode_base64_to_string
(data str, *
string
encoding);
458
459
461
466
string
mime_decode_quoted_printable
(
string
str, *
string
encoding);
467
468
470
476
data
mime_decode_transfer_data
(data data,
string
enc, *
string
ct);
477
478
480
483
string
mime_decode_header
(
string
hdr);
484
486
490
491
string
get_mime_type_from_ext
(
string
path);
492
494
498
499
const
MPT_FORM_DATA
=
"form-data"
;
500
502
const
MPT_MIXED
=
"mixed"
;
503
505
const
MPT_MESSAGE
=
"message"
;
506
508
const
MPT_DIGEST
=
"digest"
;
509
511
const
MPT_ALTERNATIVE
=
"alternative"
;
512
514
const
MPT_RELATED
=
"related"
;
515
517
const
MPT_SIGNED
=
"signed"
;
518
520
const
MPT_ENCRYPTED
=
"encrypted"
;
521
523
const
MPT_BYTERANGES
=
"byteranges"
;
525
527
class
MultiPartMessage
{
528
529
public
:
530
const
MP_DEFAULT_MSG =
"This is a MIME multipart message"
;
531
533
private
:
535
string
mptype;
536
538
string
boundary;
539
541
string
ct;
542
544
list
l = ();
545
547
hash
hdr;
548
549
public
:
551
553
556
constructor
(
string
mptype,
string
boundary =
MultiPartMessage::getBoundary
());
557
558
560
static
string
getBoundary
();
561
563
567
static
string
getRandomString
(
int
len);
568
570
628
static
hash
parseBody
(
string
boundary,
string
body,
bool
decode =
True
);
629
631
binary
serialize
();
632
633
635
639
static
binary
serializeHeaders
(
hash
hdr);
640
642
abstract
hash
getMsgAndHeaders();
643
644
// don't reimplement this method; fix/enhance it in the module
645
646
private
:
647
final
hash
getMsgAndHeadersIntern(*
string
content_type,
bool
conlen =
True
);
648
public
:
649
650
651
// don't reimplement this method; fix/enhance it in the module
652
653
private
:
654
splicePartIntern(data data,
hash
hdr);
655
public
:
656
657
658
// don't reimplement this method; fix/enhance it in the module
659
660
private
:
661
addPartIntern(data data,
hash
hdr);
662
public
:
663
664
665
666
private
:
667
static
hash
getPart(data data,
hash
hdr);
668
public
:
669
671
};
672
674
class
MultiPartRelatedMessage
:
public
MultiPartMessage
{
675
676
public
:
678
private
:
679
// the starting part ID
680
string
startid;
681
682
public
:
684
686
688
constructor
(
string
boundary =
MultiPartMessage::getBoundary
());
689
690
692
699
splicePart
(data data,
string
id
,
string
content_type, *
hash
hdr);
700
701
703
710
addPart
(data data,
string
id
,
string
content_type, *
hash
hdr);
711
712
714
718
hash
getMsgAndHeaders
();
719
720
};
721
723
class
MultiPartMixedMessage
:
public
MultiPartMessage
{
724
725
public
:
727
729
constructor
(
string
boundary =
MultiPartMessage::getBoundary
());
730
731
733
745
splicePart
(data data,
string
content_type =
MimeTypeText
,
string
disp =
"inline"
, *
hash
hdr);
746
747
749
761
addPart
(data data,
string
content_type =
MimeTypeText
,
string
disp =
"inline"
, *
hash
hdr);
762
763
765
779
spliceEncodePart
(data data,
string
enc,
string
content_type =
MimeTypeText
,
string
disp =
"inline"
, *
hash
hdr);
780
781
783
797
addEncodePart
(data data,
string
enc,
string
content_type =
MimeTypeText
,
string
disp =
"inline"
, *
hash
hdr);
798
799
801
805
hash
getMsgAndHeaders
();
806
807
};
808
};