621f1f096746ef7e37a8e301d9cb2b9586d8f2da
[gpgol.git] / src / mimemaker.h
1 /* mimemaker.h - Construct MIME from MAPI
2  * Copyright (C) 2007, 2008 g10 Code GmbH
3  * Copyright (C) 2015, 2016 by Bundesamt für Sicherheit in der Informationstechnik
4  * Software engineering by Intevation GmbH
5  *
6  * This file is part of GpgOL.
7  * 
8  * GpgOL is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  * 
13  * GpgOL is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17  * 
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #ifndef MIMEMAKER_H
23 #define MIMEMAKER_H
24
25 class Mail;
26 #ifdef __cplusplus
27 extern "C" {
28 #if 0
29 }
30 #endif
31 #endif
32
33 /* Names for our attachments */
34 #define OPENPGP_ENC_NAME "openpgp-encrypted-message.asc"
35 #define OPENPGP_SIG_NAME "openpgp-digital-signature.asc"
36 #define SMIME_SIG_NAME "smime.p7s"
37
38 /* The object we use instead of IStream.  It allows us to have a
39    callback method for output and thus for processing stuff
40    recursively.  */
41 struct sink_s;
42 typedef struct sink_s *sink_t;
43 struct sink_s
44 {
45   void *cb_data;
46   sink_t extrasink;
47   int (*writefnc)(sink_t sink, const void *data, size_t datalen);
48   unsigned long enc_counter; /* Used by write_buffer_for_cb.  */
49 /*   struct { */
50 /*     int idx; */
51 /*     unsigned char inbuf[4]; */
52 /*     int quads; */
53 /*   } b64; */
54 };
55
56 int sink_std_write (sink_t sink, const void *data, size_t datalen);
57 int sink_file_write (sink_t sink, const void *data, size_t datalen);
58 int sink_encryption_write (sink_t encsink, const void *data, size_t datalen);
59 int write_buffer_for_cb (void *opaque, const void *data, size_t datalen);
60 int write_buffer (sink_t sink, const void *data, size_t datalen);
61
62 /** @brief Try to restore a message from the moss attachment.
63   *
64   * Try to turn the moss attachment back into a Mail that other
65   * MUAs could handle. Uses all the tricks available to archive
66   * that. Returns 0 on success.
67   */
68 int restore_msg_from_moss (LPMESSAGE message, LPDISPATCH moss_att,
69                            msgtype_t type, char *msgcls);
70
71 int count_usable_attachments (mapi_attach_item_t *table);
72
73 int add_body_and_attachments (sink_t sink, LPMESSAGE message,
74                               mapi_attach_item_t *att_table, Mail *mail,
75                               const char *body, int n_att_usable);
76 int create_top_encryption_header (sink_t sink, protocol_t protocol, char *boundary,
77                               bool is_inline = false, int exchange_major_version = -1);
78
79 /* Helper to write a boundary to the output sink.  The leading LF
80    will be written as well.  */
81 int write_boundary (sink_t sink, const char *boundary, int lastone);
82
83 LPATTACH create_mapi_attachment (LPMESSAGE message, sink_t sink,
84                                  const char *overrideMimeTag = nullptr);
85 int close_mapi_attachment (LPATTACH *attach, sink_t sink);
86 int finalize_message (LPMESSAGE message, mapi_attach_item_t *att_table,
87                       protocol_t protocol, int encrypt, bool is_inline = false);
88 void cancel_mapi_attachment (LPATTACH *attach, sink_t sink);
89 void create_top_signing_header (char *buffer, size_t buflen, protocol_t protocol,
90                            int first, const char *boundary, const char *micalg);
91 int write_string (sink_t sink, const char *text);
92 int write_b64 (sink_t sink, const void *data, size_t datalen);
93
94 #ifdef __cplusplus
95 }
96 #endif
97 #endif /*MIMEMAKER_H*/