Skip to content

Commit ebc9976

Browse files
committed
Update MimeVisitor to only use interfaces (e.g. IMimePart)
This allows us to include the necessary APIs for things like IMultipartEncrypted, IMultipartSigned, IApplicationPkcs7Mime, etc. while only providing the implementation of those types in a future separate MimeKit.Cryptography extension nuget package. Classes like ApplicationPgpEEncrypted and ApplicationPgpSignature, on the other hand, could be part of the core MimeKit package because they don't actually provide any crypto routines. They are just convenience classes. Another partial fix for issue #820
1 parent 221f83d commit ebc9976

5 files changed

+58
-70
lines changed

MimeKit/MimeVisitor.cs

+27-36
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,8 @@
2424
// THE SOFTWARE.
2525
//
2626

27-
#if ENABLE_CRYPTO
28-
using MimeKit.Cryptography;
29-
#endif
30-
3127
using MimeKit.Tnef;
28+
using MimeKit.Cryptography;
3229

3330
namespace MimeKit {
3431
/// <summary>
@@ -50,7 +47,7 @@ public abstract class MimeVisitor
5047
/// Dispatches the entity to one of the more specialized visit methods in this class.
5148
/// </remarks>
5249
/// <param name="entity">The MIME entity.</param>
53-
public virtual void Visit (MimeEntity entity)
50+
public virtual void Visit (IMimeEntity entity)
5451
{
5552
entity?.Accept (this);
5653
}
@@ -62,12 +59,11 @@ public virtual void Visit (MimeEntity entity)
6259
/// Dispatches the message to one of the more specialized visit methods in this class.
6360
/// </remarks>
6461
/// <param name="message">The MIME message.</param>
65-
public virtual void Visit (MimeMessage message)
62+
public virtual void Visit (IMimeMessage message)
6663
{
6764
message?.Accept (this);
6865
}
6966

70-
#if ENABLE_CRYPTO
7167
/// <summary>
7268
/// Visit the application/pgp-encrypted MIME entity.
7369
/// </summary>
@@ -76,7 +72,7 @@ public virtual void Visit (MimeMessage message)
7672
/// </remarks>
7773
/// <seealso cref="MimeKit.Cryptography.MultipartEncrypted"/>
7874
/// <param name="entity">The application/pgp-encrypted MIME entity.</param>
79-
protected internal virtual void VisitApplicationPgpEncrypted (ApplicationPgpEncrypted entity)
75+
protected internal virtual void VisitApplicationPgpEncrypted (IApplicationPgpEncrypted entity)
8076
{
8177
VisitMimePart (entity);
8278
}
@@ -89,7 +85,7 @@ protected internal virtual void VisitApplicationPgpEncrypted (ApplicationPgpEncr
8985
/// </remarks>
9086
/// <seealso cref="MimeKit.Cryptography.MultipartSigned"/>
9187
/// <param name="entity">The application/pgp-signature MIME entity.</param>
92-
protected internal virtual void VisitApplicationPgpSignature (ApplicationPgpSignature entity)
88+
protected internal virtual void VisitApplicationPgpSignature (IApplicationPgpSignature entity)
9389
{
9490
VisitMimePart (entity);
9591
}
@@ -101,7 +97,7 @@ protected internal virtual void VisitApplicationPgpSignature (ApplicationPgpSign
10197
/// Visits the application/pkcs7-mime MIME entity.
10298
/// </remarks>
10399
/// <param name="entity">The application/pkcs7-mime MIME entity.</param>
104-
protected internal virtual void VisitApplicationPkcs7Mime (ApplicationPkcs7Mime entity)
100+
protected internal virtual void VisitApplicationPkcs7Mime (IApplicationPkcs7Mime entity)
105101
{
106102
VisitMimePart (entity);
107103
}
@@ -114,11 +110,10 @@ protected internal virtual void VisitApplicationPkcs7Mime (ApplicationPkcs7Mime
114110
/// </remarks>
115111
/// <seealso cref="MimeKit.Cryptography.MultipartSigned"/>
116112
/// <param name="entity">The application/pkcs7-signature MIME entity.</param>
117-
protected internal virtual void VisitApplicationPkcs7Signature (ApplicationPkcs7Signature entity)
113+
protected internal virtual void VisitApplicationPkcs7Signature (IApplicationPkcs7Signature entity)
118114
{
119115
VisitMimePart (entity);
120116
}
121-
#endif
122117

123118
/// <summary>
124119
/// Visit the message/disposition-notification MIME entity.
@@ -127,7 +122,7 @@ protected internal virtual void VisitApplicationPkcs7Signature (ApplicationPkcs7
127122
/// Visits the message/disposition-notification MIME entity.
128123
/// </remarks>
129124
/// <param name="entity">The message/disposition-notification MIME entity.</param>
130-
protected internal virtual void VisitMessageDispositionNotification (MessageDispositionNotification entity)
125+
protected internal virtual void VisitMessageDispositionNotification (IMessageDispositionNotification entity)
131126
{
132127
VisitMimePart (entity);
133128
}
@@ -139,7 +134,7 @@ protected internal virtual void VisitMessageDispositionNotification (MessageDisp
139134
/// Visits the message/delivery-status MIME entity.
140135
/// </remarks>
141136
/// <param name="entity">The message/delivery-status MIME entity.</param>
142-
protected internal virtual void VisitMessageDeliveryStatus (MessageDeliveryStatus entity)
137+
protected internal virtual void VisitMessageDeliveryStatus (IMessageDeliveryStatus entity)
143138
{
144139
VisitMimePart (entity);
145140
}
@@ -151,7 +146,7 @@ protected internal virtual void VisitMessageDeliveryStatus (MessageDeliveryStatu
151146
/// Visits the message/feedback-report MIME entity.
152147
/// </remarks>
153148
/// <param name="entity">The message/feedback-report MIME entity.</param>
154-
protected internal virtual void VisitMessageFeedbackReport (MessageFeedbackReport entity)
149+
protected internal virtual void VisitMessageFeedbackReport (IMessageFeedbackReport entity)
155150
{
156151
VisitMimePart (entity);
157152
}
@@ -163,7 +158,7 @@ protected internal virtual void VisitMessageFeedbackReport (MessageFeedbackRepor
163158
/// Visits the message contained within a message/rfc822 or message/news MIME entity.
164159
/// </remarks>
165160
/// <param name="entity">The message/rfc822 or message/news MIME entity.</param>
166-
protected virtual void VisitMessage (MessagePart entity)
161+
protected virtual void VisitMessage (IMessagePart entity)
167162
{
168163
entity.Message?.Accept (this);
169164
}
@@ -178,7 +173,7 @@ protected virtual void VisitMessage (MessagePart entity)
178173
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
179174
/// </example>
180175
/// <param name="entity">The message/rfc822 or message/news MIME entity.</param>
181-
protected internal virtual void VisitMessagePart (MessagePart entity)
176+
protected internal virtual void VisitMessagePart (IMessagePart entity)
182177
{
183178
VisitMimeEntity (entity);
184179
VisitMessage (entity);
@@ -191,7 +186,7 @@ protected internal virtual void VisitMessagePart (MessagePart entity)
191186
/// Visits the message/partial MIME entity.
192187
/// </remarks>
193188
/// <param name="entity">The message/partial MIME entity.</param>
194-
protected internal virtual void VisitMessagePartial (MessagePartial entity)
189+
protected internal virtual void VisitMessagePartial (IMessagePartial entity)
195190
{
196191
VisitMimePart (entity);
197192
}
@@ -203,7 +198,7 @@ protected internal virtual void VisitMessagePartial (MessagePartial entity)
203198
/// Visits the abstract MIME entity.
204199
/// </remarks>
205200
/// <param name="entity">The MIME entity.</param>
206-
protected internal virtual void VisitMimeEntity (MimeEntity entity)
201+
protected internal virtual void VisitMimeEntity (IMimeEntity entity)
207202
{
208203
}
209204

@@ -214,7 +209,7 @@ protected internal virtual void VisitMimeEntity (MimeEntity entity)
214209
/// Visits the body of the message.
215210
/// </remarks>
216211
/// <param name="message">The message.</param>
217-
protected virtual void VisitBody (MimeMessage message)
212+
protected virtual void VisitBody (IMimeMessage message)
218213
{
219214
message.Body?.Accept (this);
220215
}
@@ -226,7 +221,7 @@ protected virtual void VisitBody (MimeMessage message)
226221
/// Visits the MIME message.
227222
/// </remarks>
228223
/// <param name="message">The MIME message.</param>
229-
protected internal virtual void VisitMimeMessage (MimeMessage message)
224+
protected internal virtual void VisitMimeMessage (IMimeMessage message)
230225
{
231226
VisitBody (message);
232227
}
@@ -241,7 +236,7 @@ protected internal virtual void VisitMimeMessage (MimeMessage message)
241236
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
242237
/// </example>
243238
/// <param name="entity">The MIME part entity.</param>
244-
protected internal virtual void VisitMimePart (MimePart entity)
239+
protected internal virtual void VisitMimePart (IMimePart entity)
245240
{
246241
VisitMimeEntity (entity);
247242
}
@@ -253,7 +248,7 @@ protected internal virtual void VisitMimePart (MimePart entity)
253248
/// Visits the children of a <see cref="Multipart"/>.
254249
/// </remarks>
255250
/// <param name="multipart">Multipart.</param>
256-
protected virtual void VisitChildren (Multipart multipart)
251+
protected virtual void VisitChildren (IMultipart multipart)
257252
{
258253
for (int i = 0; i < multipart.Count; i++)
259254
multipart[i].Accept (this);
@@ -266,7 +261,7 @@ protected virtual void VisitChildren (Multipart multipart)
266261
/// Visits the abstract multipart MIME entity.
267262
/// </remarks>
268263
/// <param name="multipart">The multipart MIME entity.</param>
269-
protected internal virtual void VisitMultipart (Multipart multipart)
264+
protected internal virtual void VisitMultipart (IMultipart multipart)
270265
{
271266
VisitMimeEntity (multipart);
272267
VisitChildren (multipart);
@@ -282,24 +277,22 @@ protected internal virtual void VisitMultipart (Multipart multipart)
282277
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
283278
/// </example>
284279
/// <param name="alternative">The multipart/alternative MIME entity.</param>
285-
protected internal virtual void VisitMultipartAlternative (MultipartAlternative alternative)
280+
protected internal virtual void VisitMultipartAlternative (IMultipartAlternative alternative)
286281
{
287282
VisitMultipart (alternative);
288283
}
289284

290-
#if ENABLE_CRYPTO
291285
/// <summary>
292286
/// Visit the multipart/encrypted MIME entity.
293287
/// </summary>
294288
/// <remarks>
295289
/// Visits the multipart/encrypted MIME entity.
296290
/// </remarks>
297291
/// <param name="encrypted">The multipart/encrypted MIME entity.</param>
298-
protected internal virtual void VisitMultipartEncrypted (MultipartEncrypted encrypted)
292+
protected internal virtual void VisitMultipartEncrypted (IMultipartEncrypted encrypted)
299293
{
300294
VisitMultipart (encrypted);
301295
}
302-
#endif
303296

304297
/// <summary>
305298
/// Visit the multipart/related MIME entity.
@@ -311,7 +304,7 @@ protected internal virtual void VisitMultipartEncrypted (MultipartEncrypted encr
311304
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
312305
/// </example>
313306
/// <param name="related">The multipart/related MIME entity.</param>
314-
protected internal virtual void VisitMultipartRelated (MultipartRelated related)
307+
protected internal virtual void VisitMultipartRelated (IMultipartRelated related)
315308
{
316309
VisitMultipart (related);
317310
}
@@ -326,24 +319,22 @@ protected internal virtual void VisitMultipartRelated (MultipartRelated related)
326319
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
327320
/// </example>
328321
/// <param name="report">The multipart/report MIME entity.</param>
329-
protected internal virtual void VisitMultipartReport (MultipartReport report)
322+
protected internal virtual void VisitMultipartReport (IMultipartReport report)
330323
{
331324
VisitMultipart (report);
332325
}
333326

334-
#if ENABLE_CRYPTO
335327
/// <summary>
336328
/// Visit the multipart/signed MIME entity.
337329
/// </summary>
338330
/// <remarks>
339331
/// Visits the multipart/signed MIME entity.
340332
/// </remarks>
341333
/// <param name="signed">The multipart/signed MIME entity.</param>
342-
protected internal virtual void VisitMultipartSigned (MultipartSigned signed)
334+
protected internal virtual void VisitMultipartSigned (IMultipartSigned signed)
343335
{
344336
VisitMultipart (signed);
345337
}
346-
#endif
347338

348339
/// <summary>
349340
/// Visit the text-based MIME part entity.
@@ -355,7 +346,7 @@ protected internal virtual void VisitMultipartSigned (MultipartSigned signed)
355346
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
356347
/// </example>
357348
/// <param name="entity">The text-based MIME part entity.</param>
358-
protected internal virtual void VisitTextPart (TextPart entity)
349+
protected internal virtual void VisitTextPart (ITextPart entity)
359350
{
360351
VisitMimePart (entity);
361352
}
@@ -370,7 +361,7 @@ protected internal virtual void VisitTextPart (TextPart entity)
370361
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
371362
/// </example>
372363
/// <param name="entity">The text/rfc822-headers MIME entity.</param>
373-
protected internal virtual void VisitTextRfc822Headers (TextRfc822Headers entity)
364+
protected internal virtual void VisitTextRfc822Headers (ITextRfc822Headers entity)
374365
{
375366
VisitMessagePart (entity);
376367
}
@@ -385,7 +376,7 @@ protected internal virtual void VisitTextRfc822Headers (TextRfc822Headers entity
385376
/// <code language="c#" source="Examples\MimeVisitorExamples.cs" region="HtmlPreviewVisitor" />
386377
/// </example>
387378
/// <param name="entity">The Microsoft TNEF MIME part entity.</param>
388-
protected internal virtual void VisitTnefPart (TnefPart entity)
379+
protected internal virtual void VisitTnefPart (ITnefPart entity)
389380
{
390381
VisitMimePart (entity);
391382
}

MimeKit/ParserOptions.cs

+2-5
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,9 @@
2929
using System.Reflection;
3030
using System.Collections.Generic;
3131

32-
#if ENABLE_CRYPTO
33-
using MimeKit.Cryptography;
34-
#endif
35-
3632
using MimeKit.Tnef;
3733
using MimeKit.Utils;
34+
using MimeKit.Cryptography;
3835

3936
namespace MimeKit {
4037
/// <summary>
@@ -399,6 +396,7 @@ internal MimeEntity CreateEntity (ContentType contentType, IList<Header> headers
399396
if (subtype.Equals ("pkcs7-signature", StringComparison.OrdinalIgnoreCase) ||
400397
subtype.Equals ("x-pkcs7-signature", StringComparison.OrdinalIgnoreCase))
401398
return new ApplicationPkcs7Signature (args);
399+
#endif
402400

403401
// application/pgp-encrypted
404402
if (subtype.Equals ("pgp-encrypted", StringComparison.OrdinalIgnoreCase) ||
@@ -409,7 +407,6 @@ internal MimeEntity CreateEntity (ContentType contentType, IList<Header> headers
409407
if (subtype.Equals ("pgp-signature", StringComparison.OrdinalIgnoreCase) ||
410408
subtype.Equals ("x-pgp-signature", StringComparison.OrdinalIgnoreCase))
411409
return new ApplicationPgpSignature (args);
412-
#endif
413410

414411
// application/ms-tnef
415412
if (subtype.Equals ("ms-tnef", StringComparison.OrdinalIgnoreCase) ||

UnitTests/HtmlPreviewVisitor.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace UnitTests {
3333
/// </summary>
3434
class HtmlPreviewVisitor : MimeVisitor
3535
{
36-
readonly List<MultipartRelated> stack = new List<MultipartRelated> ();
36+
readonly List<IMultipartRelated> stack = new List<IMultipartRelated> ();
3737
string body;
3838

3939
/// <summary>
@@ -59,14 +59,14 @@ public string HtmlBody {
5959
get { return body ?? string.Empty; }
6060
}
6161

62-
protected internal override void VisitMultipartAlternative (MultipartAlternative alternative)
62+
protected internal override void VisitMultipartAlternative (IMultipartAlternative alternative)
6363
{
6464
// walk the multipart/alternative children backwards from greatest level of faithfulness to the least faithful
6565
for (int i = alternative.Count - 1; i >= 0 && body == null; i--)
6666
alternative[i].Accept (this);
6767
}
6868

69-
protected internal override void VisitMultipartRelated (MultipartRelated related)
69+
protected internal override void VisitMultipartRelated (IMultipartRelated related)
7070
{
7171
var root = related.Root;
7272

@@ -170,7 +170,7 @@ void HtmlTagCallback (HtmlTagContext ctx, HtmlWriter htmlWriter)
170170
}
171171
}
172172

173-
protected internal override void VisitTextPart (TextPart entity)
173+
protected internal override void VisitTextPart (ITextPart entity)
174174
{
175175
TextConverter converter;
176176

@@ -200,7 +200,7 @@ protected internal override void VisitTextPart (TextPart entity)
200200
base.VisitTextPart (entity);
201201
}
202202

203-
protected internal override void VisitMessagePart (MessagePart entity)
203+
protected internal override void VisitMessagePart (IMessagePart entity)
204204
{
205205
// don't descend into message/rfc822 parts
206206
}

0 commit comments

Comments
 (0)