Skip to content

Commit cec1a8c

Browse files
committed
Support uploading attachments
1 parent 2487616 commit cec1a8c

16 files changed

+457
-96
lines changed

Signal-Windows.Lib/Events/SignalMessageEventArgs.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77

88
namespace Signal_Windows.Lib.Events
99
{
10-
public enum SignalMessageType
10+
public enum SignalPipeMessageType
1111
{
1212
NormalMessage,
1313
PipeEmptyMessage
1414
}
1515
public class SignalMessageEventArgs : EventArgs
1616
{
1717
public SignalMessage Message { get; private set; }
18-
public SignalMessageType MessageType { get; private set; }
18+
public SignalPipeMessageType MessageType { get; private set; }
1919

20-
public SignalMessageEventArgs(SignalMessage message, SignalMessageType type)
20+
public SignalMessageEventArgs(SignalMessage message, SignalPipeMessageType type)
2121
{
2222
Message = message;
2323
MessageType = type;

Signal-Windows.Lib/IncomingMessages.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ private async Task HandleExpirationUpdateMessage(SignalServiceEnvelope envelope,
336336
ComposedTimestamp = composedTimestamp,
337337
ReceivedTimestamp = timestamp,
338338
};
339-
await SignalLibHandle.Instance.SaveAndDispatchSignalMessage(sm, conversation);
339+
await SignalLibHandle.Instance.SaveAndDispatchSignalMessage(sm, null, conversation);
340340
}
341341

342342
private async Task HandleSessionResetMessage(SignalServiceEnvelope envelope, SignalServiceContent content, SignalServiceDataMessage dataMessage, bool isSync, long timestamp)
@@ -384,7 +384,7 @@ private async Task HandleSessionResetMessage(SignalServiceEnvelope envelope, Sig
384384
ComposedTimestamp = composedTimestamp,
385385
ReceivedTimestamp = timestamp,
386386
};
387-
await SignalLibHandle.Instance.SaveAndDispatchSignalMessage(sm, conversation);
387+
await SignalLibHandle.Instance.SaveAndDispatchSignalMessage(sm, null, conversation);
388388
}
389389

390390
/// <summary>
@@ -654,7 +654,7 @@ private async Task HandleSignalMessage(SignalServiceEnvelope envelope, SignalSer
654654
// Make sure to update attachments count
655655
message.AttachmentsCount = (uint)attachments.Count;
656656
}
657-
await SignalLibHandle.Instance.SaveAndDispatchSignalMessage(message, conversation);
657+
await SignalLibHandle.Instance.SaveAndDispatchSignalMessage(message, null, conversation);
658658
}
659659
}
660660
}

Signal-Windows.Lib/OutgoingMessages.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
using System;
1313
using System.Collections.Generic;
1414
using System.Diagnostics;
15+
using System.IO;
1516
using System.Linq;
1617
using System.Text;
1718
using System.Threading;
1819
using System.Threading.Tasks;
20+
using Windows.Storage;
1921

2022
namespace Signal_Windows.Lib
2123
{
@@ -68,11 +70,29 @@ public async Task HandleOutgoingMessages()
6870
try
6971
{
7072
outgoingSignalMessage = Handle.OutgoingQueue.Take(Token);
73+
List<SignalServiceAttachment> outgoingAttachmentsList = null;
74+
if (outgoingSignalMessage.Attachments != null && outgoingSignalMessage.Attachments.Count > 0)
75+
{
76+
outgoingAttachmentsList = new List<SignalServiceAttachment>();
77+
foreach (var attachment in outgoingSignalMessage.Attachments)
78+
{
79+
var file = await ApplicationData.Current.LocalCacheFolder.GetFileAsync(@"Attachments\" + attachment.Id + ".plain");
80+
var stream = await file.OpenStreamForReadAsync();
81+
outgoingAttachmentsList.Add(SignalServiceAttachment.NewStreamBuilder()
82+
.WithContentType(attachment.ContentType)
83+
.WithStream(stream)
84+
.WithLength(stream.Length)
85+
.WithFileName(attachment.SentFileName)
86+
.Build());
87+
}
88+
}
89+
7190
SignalServiceDataMessage message = new SignalServiceDataMessage()
7291
{
7392
Body = outgoingSignalMessage.Content.Content,
7493
Timestamp = outgoingSignalMessage.ComposedTimestamp,
75-
ExpiresInSeconds = (int)outgoingSignalMessage.ExpiresAt
94+
ExpiresInSeconds = (int)outgoingSignalMessage.ExpiresAt,
95+
Attachments = outgoingAttachmentsList
7696
};
7797

7898
if (!outgoingSignalMessage.ThreadId.EndsWith("="))

Signal-Windows.Lib/Signal-Windows.Lib.csproj

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,28 +166,25 @@
166166
</ItemGroup>
167167
<ItemGroup>
168168
<PackageReference Include="libsignal-service-dotnet">
169-
<Version>2.7.5.12</Version>
169+
<Version>2.7.5.14</Version>
170170
</PackageReference>
171171
<PackageReference Include="Microsoft.EntityFrameworkCore">
172-
<Version>1.1.4</Version>
172+
<Version>1.1.5</Version>
173173
</PackageReference>
174174
<PackageReference Include="Microsoft.EntityFrameworkCore.Design">
175-
<Version>1.1.4</Version>
175+
<Version>1.1.5</Version>
176176
</PackageReference>
177177
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite">
178-
<Version>1.1.4</Version>
178+
<Version>1.1.5</Version>
179179
</PackageReference>
180180
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools">
181-
<Version>1.1.4</Version>
181+
<Version>1.1.5</Version>
182182
</PackageReference>
183183
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
184-
<Version>6.0.1</Version>
184+
<Version>6.1.5</Version>
185185
</PackageReference>
186186
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications">
187-
<Version>2.1.1</Version>
188-
</PackageReference>
189-
<PackageReference Include="System.ValueTuple">
190-
<Version>4.4.0</Version>
187+
<Version>3.0.0</Version>
191188
</PackageReference>
192189
</ItemGroup>
193190
<ItemGroup>

Signal-Windows.Lib/SignalLibHandle.cs

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public interface ISignalLibHandle
5656
SignalStore Store { get; set; }
5757

5858
void RequestSync();
59-
Task SendMessage(SignalMessage message, SignalConversation conversation);
59+
Task SendMessage(string messageText, StorageFile attachment, SignalConversation conversation);
6060
Task SendBlockedMessage();
6161
Task SetMessageRead(long index, SignalMessage message, SignalConversation conversation);
6262
void ResendMessage(SignalMessage message);
@@ -330,7 +330,7 @@ public void BackgroundRelease()
330330
Instance = null;
331331
}
332332

333-
public async Task SendMessage(SignalMessage message, SignalConversation conversation)
333+
public async Task SendMessage(string messageText, StorageFile attachmentStorageFile, SignalConversation conversation)
334334
{
335335
await Task.Run(async () =>
336336
{
@@ -339,8 +339,32 @@ await Task.Run(async () =>
339339
Logger.LogTrace("SendMessage() locked");
340340
try
341341
{
342-
Logger.LogDebug("SendMessage saving message " + message.ComposedTimestamp);
343-
await SaveAndDispatchSignalMessage(message, conversation);
342+
var now = Util.CurrentTimeMillis();
343+
var attachmentsList = new List<SignalAttachment>();
344+
if (attachmentStorageFile != null)
345+
{
346+
attachmentsList.Add(new SignalAttachment()
347+
{
348+
ContentType = attachmentStorageFile.ContentType,
349+
SentFileName = attachmentStorageFile.Name
350+
});
351+
}
352+
353+
SignalMessage message = new SignalMessage()
354+
{
355+
Author = null,
356+
ComposedTimestamp = now,
357+
ExpiresAt = conversation.ExpiresInSeconds,
358+
Content = new SignalMessageContent() { Content = messageText },
359+
ThreadId = conversation.ThreadId,
360+
ReceivedTimestamp = now,
361+
Direction = SignalMessageDirection.Outgoing,
362+
Read = true,
363+
Type = SignalMessageType.Normal,
364+
Attachments = attachmentsList,
365+
AttachmentsCount = (uint) attachmentsList.Count()
366+
};
367+
await SaveAndDispatchSignalMessage(message, attachmentStorageFile, conversation);
344368
OutgoingQueue.Add(message);
345369
}
346370
finally
@@ -497,7 +521,7 @@ await dispatcher.RunAsync(CoreDispatcherPriority.Normal,async () =>
497521
}
498522
}
499523

500-
internal async Task SaveAndDispatchSignalMessage(SignalMessage message, SignalConversation conversation)
524+
internal async Task SaveAndDispatchSignalMessage(SignalMessage message, StorageFile attachmentStorageFile, SignalConversation conversation)
501525
{
502526
conversation.MessagesCount += 1;
503527
if (message.Direction == SignalMessageDirection.Incoming)
@@ -512,7 +536,15 @@ internal async Task SaveAndDispatchSignalMessage(SignalMessage message, SignalCo
512536
SignalDBContext.SaveMessageLocked(message);
513537
conversation.LastMessage = message;
514538
conversation.LastActiveTimestamp = message.ComposedTimestamp;
515-
//StartAttachmentDownloads(message);
539+
if (attachmentStorageFile != null)
540+
{
541+
StorageFolder plaintextFile = await ApplicationData.Current.LocalCacheFolder.GetFolderAsync(@"Attachments\");
542+
foreach (var attachment in message.Attachments)
543+
{
544+
Logger.LogTrace(@"Copying attachment to \Attachments\{0}.plain", attachment.Id.ToString());
545+
await attachmentStorageFile.CopyAsync(plaintextFile, attachment.Id.ToString() + ".plain", NameCollisionOption.ReplaceExisting);
546+
}
547+
}
516548
await DispatchHandleMessage(message, conversation);
517549
}
518550

@@ -630,7 +662,7 @@ await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
630662
});
631663
operations.Add(taskCompletionSource.Task);
632664
}
633-
SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(message, Events.SignalMessageType.NormalMessage));
665+
SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(message, Events.SignalPipeMessageType.NormalMessage));
634666
if (message.Author != null)
635667
{
636668
bool wasInstantlyRead = false;
@@ -712,7 +744,7 @@ await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
712744

713745
internal void DispatchPipeEmptyMessage()
714746
{
715-
SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(null, Events.SignalMessageType.PipeEmptyMessage));
747+
SignalMessageEvent?.Invoke(this, new SignalMessageEventArgs(null, Events.SignalPipeMessageType.PipeEmptyMessage));
716748
}
717749

718750
internal async Task HandleMessageSentLocked(SignalMessage msg)

Signal-Windows.RC/Signal-Windows.RC.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,10 @@
112112
</ItemGroup>
113113
<ItemGroup>
114114
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
115-
<Version>6.0.1</Version>
115+
<Version>6.1.5</Version>
116116
</PackageReference>
117117
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications">
118-
<Version>2.1.1</Version>
118+
<Version>3.0.0</Version>
119119
</PackageReference>
120120
</ItemGroup>
121121
<ItemGroup>

Signal-Windows.RC/SignalBackgroundTask.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellati
7979

8080
private void Handle_SignalMessageEvent(object sender, SignalMessageEventArgs e)
8181
{
82-
if (e.MessageType == Lib.Events.SignalMessageType.NormalMessage)
82+
if (e.MessageType == Lib.Events.SignalPipeMessageType.NormalMessage)
8383
{
8484
NotificationsUtils.Notify(e.Message);
8585
}
86-
else if (e.MessageType == Lib.Events.SignalMessageType.PipeEmptyMessage)
86+
else if (e.MessageType == Lib.Events.SignalPipeMessageType.PipeEmptyMessage)
8787
{
8888
Logger.LogInformation("Background task has drained the pipe");
8989
ResetEvent.Set();
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<UserControl
2+
x:Class="Signal_Windows.Controls.AddedAttachment"
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:local="using:Signal_Windows.Controls"
6+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8+
mc:Ignorable="d"
9+
d:DesignHeight="60"
10+
d:DesignWidth="150">
11+
12+
<Grid HorizontalAlignment="Center" VerticalAlignment="Center" BorderThickness="1 1 1 1" BorderBrush="Gray" Margin="2 2 2 2">
13+
<Grid.ColumnDefinitions>
14+
<ColumnDefinition Width="Auto"/>
15+
<ColumnDefinition Width="Auto"/>
16+
</Grid.ColumnDefinitions>
17+
<TextBlock Grid.Column="0" x:Name="AddedAttachmentFilename" Text="Test.txt" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10 0 10 0"/>
18+
<Button Grid.Column="1" x:Name="CancelAttachmentButton" Click="CancelAttachmentButton_Click">
19+
<SymbolIcon Symbol="Cancel" Foreground="{ThemeResource ApplicationPageBackgroundThemeBrush}" />
20+
</Button>
21+
</Grid>
22+
</UserControl>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Runtime.InteropServices.WindowsRuntime;
6+
using Windows.Foundation;
7+
using Windows.Foundation.Collections;
8+
using Windows.UI.Xaml;
9+
using Windows.UI.Xaml.Controls;
10+
using Windows.UI.Xaml.Controls.Primitives;
11+
using Windows.UI.Xaml.Data;
12+
using Windows.UI.Xaml.Input;
13+
using Windows.UI.Xaml.Media;
14+
using Windows.UI.Xaml.Navigation;
15+
16+
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
17+
18+
namespace Signal_Windows.Controls
19+
{
20+
public sealed partial class AddedAttachment : UserControl
21+
{
22+
public event Action OnCancelAttachmentButtonClicked;
23+
public AddedAttachment()
24+
{
25+
this.InitializeComponent();
26+
}
27+
28+
public void ShowAttachment(string filename)
29+
{
30+
Visibility = Visibility.Visible;
31+
AddedAttachmentFilename.Text = filename;
32+
}
33+
34+
public void HideAttachment()
35+
{
36+
Visibility = Visibility.Collapsed;
37+
}
38+
39+
private void CancelAttachmentButton_Click(object sender, RoutedEventArgs e)
40+
{
41+
OnCancelAttachmentButtonClicked?.Invoke();
42+
}
43+
}
44+
}

Signal-Windows/Controls/Attachment.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private void Attachment_DataContextChanged(FrameworkElement sender, DataContextC
6565
{
6666
if (Model != null)
6767
{
68-
if (Model.Status == SignalAttachmentStatus.Finished)
68+
if (Model.Status == SignalAttachmentStatus.Finished || Model.Message.Direction == SignalMessageDirection.Outgoing)
6969
{
7070
AttachmentImage.Visibility = Visibility.Visible;
7171
AttachmentDownloadIcon.Visibility = Visibility.Collapsed;

0 commit comments

Comments
 (0)