-
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathOutgoing.cs
More file actions
145 lines (125 loc) · 4.32 KB
/
Outgoing.cs
File metadata and controls
145 lines (125 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
public class Outgoing
{
#region OutgoingWithStreamInstance
class HandlerFactory :
IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, HandlerContext context)
{
var sendOptions = new SendOptions();
var attachments = sendOptions.Attachments();
attachments.AddStream(
name: "attachment1",
writer: async stream =>
{
await using var source = File.OpenRead("FilePath.txt");
await source.CopyToAsync(stream);
});
return context.Send(new OtherMessage(), sendOptions);
}
}
#endregion
#region OutgoingWithSyncStreamInstance
class HandlerSyncFactory :
IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, HandlerContext context)
{
var sendOptions = new SendOptions();
var attachments = sendOptions.Attachments();
attachments.AddStream(
name: "attachment1",
writer: stream =>
{
using var source = File.OpenRead("FilePath.txt");
source.CopyTo(stream);
});
return context.Send(new OtherMessage(), sendOptions);
}
}
#endregion
#region OutgoingWithSavePattern
class HandlerStreamWriter :
IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, HandlerContext context)
{
var document = new Document();
var sendOptions = new SendOptions();
var attachments = sendOptions.Attachments();
attachments.AddStream(
name: "attachment1",
writer: document.SaveAsync);
return context.Send(new OtherMessage(), sendOptions);
}
}
#endregion
#region OutgoingInstance
class HandlerInstance :
IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, HandlerContext context)
{
var sendOptions = new SendOptions();
var attachments = sendOptions.Attachments();
var stream = File.OpenRead("FilePath.txt");
attachments.Add(
name: "attachment1",
stream: stream,
cleanup: () => File.Delete("FilePath.txt"));
return context.Send(new OtherMessage(), sendOptions);
}
}
#endregion
#region OutgoingFromIncoming
class HandlerFromIncoming :
IHandleMessages<MyMessage>
{
public Task Handle(MyMessage message, HandlerContext context)
{
var replyOptions = new ReplyOptions();
var attachments = replyOptions.Attachments();
attachments.AddFromIncoming(
fromName: "input",
toName: "output",
transform: async (source, sink, cancel) =>
{
using var reader = new StreamReader(source, leaveOpen: true);
var content = await reader.ReadToEndAsync(cancel);
await using var writer = new StreamWriter(sink, leaveOpen: true);
await writer.WriteAsync(content.ToUpperInvariant());
});
return context.Reply(new OtherMessage(), replyOptions);
}
}
#endregion
#region OpenOutgoingAttachment
class HandlerImmediateWrite :
IHandleMessages<MyMessage>
{
public async Task Handle(MyMessage message, HandlerContext context)
{
var replyOptions = new ReplyOptions();
bool truncated;
await using (var sink = await context.OpenOutgoingAttachment(
replyOptions,
"TheAttachmentName"))
{
// Convert directly to the sink. The result (e.g. truncated)
// is available before the reply body is composed.
truncated = MyConverter.Convert(message.Source, sink);
}
await context.Reply(
new OtherMessage
{
Truncated = truncated
},
replyOptions);
}
}
#endregion
}
static class MyConverter
{
public static bool Convert(string source, Stream sink) => false;
}