Skip to content

Commit

Permalink
Use SocketActivityTrigger to put irc sockets in the background, as per
Browse files Browse the repository at this point in the history
  • Loading branch information
jmurth1234 committed Aug 12, 2016
1 parent 373bc6e commit 3e37c1c
Show file tree
Hide file tree
Showing 6 changed files with 288 additions and 113 deletions.
135 changes: 129 additions & 6 deletions WinIRC/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.Background;
using Windows.ApplicationModel.Core;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Foundation.Metadata;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;
using Windows.UI;
using Windows.UI.Notifications;
using Windows.UI.Popups;
Expand Down Expand Up @@ -48,14 +52,17 @@ public App()
this.SetTheme();

this.InitializeComponent();

foreach (var current in BackgroundTaskRegistration.AllTasks)
{
current.Value.Unregister(true);
}

this.Suspending += OnSuspending;
this.Resuming += App_Resuming;
}

private void App_Resuming(object sender, object e)
{
MainPage.instance.ExtendExecution();
}
private Boolean CanBackground = false;

public void SetTheme()
{
Expand Down Expand Up @@ -99,7 +106,7 @@ public void SetTheme()
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
protected override void OnLaunched(LaunchActivatedEventArgs e)
protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
AppLaunched = true;
#if DEBUG
Expand All @@ -108,6 +115,18 @@ protected override void OnLaunched(LaunchActivatedEventArgs e)
this.DebugSettings.EnableFrameRateCounter = true;
}
#endif
try
{
var check = await BackgroundExecutionManager.RequestAccessAsync();
CanBackground = check == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity ||
check == BackgroundAccessStatus.AllowedSubjectToSystemPolicy ||
check == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity ||
check == BackgroundAccessStatus.AlwaysAllowed;
}
catch
{
CanBackground = false;
}

Frame rootFrame = Window.Current.Content as Frame;

Expand Down Expand Up @@ -174,11 +193,115 @@ void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
private void OnSuspending(object sender, SuspendingEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
MainPage.instance.ExtendExecution();

var deferral = e.SuspendingOperation.GetDeferral();

if (CanBackground)
{
var servers = IrcUiHandler.Instance.connectedServers.Values;

foreach (Irc server in servers)
{
if (server is IrcSocket)
{
server.SocketTransfer();
}
}
}
else
{
MainPage.instance.ExtendExecution();
}

deferral.Complete();
}

private void App_Resuming(object sender, object e)
{
if (CanBackground)
{
var servers = IrcUiHandler.Instance.connectedServers.Values;

foreach (Irc server in servers)
{
if (server is IrcSocket)
{
server.SocketReturn();
}
}
}
else
{
MainPage.instance.ExtendExecution();
}
}

protected async override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
var taskInstance = args.TaskInstance;
var deferral = taskInstance.GetDeferral();
Debug.WriteLine("Attempting background execution: " + taskInstance.Task.Name);
try
{
var details = taskInstance.TriggerDetails as SocketActivityTriggerDetails;
var socketInformation = details.SocketInformation;

var servers = IrcUiHandler.Instance.connectedServers.Values;

IrcSocket irc = null;

foreach (Irc server in servers)
{
Debug.WriteLine("Irc server name " + server.BackgroundTaskName + " - Task name " + taskInstance.Task.Name);

if (server is IrcSocket && taskInstance.Task.Name == server.BackgroundTaskName )
{
irc = server as IrcSocket;
}
}

if (irc == null)
{
Debug.WriteLine("Unable to get irc server: " + taskInstance.Task.Name);
return;
}

Debug.WriteLine("Able to get irc server: " + taskInstance.Task.Name);

switch (details.Reason)
{
case SocketActivityTriggerReason.SocketActivity:
case SocketActivityTriggerReason.KeepAliveTimerExpired:
var socket = socketInformation.StreamSocket;
DataReader reader = new DataReader(socket.InputStream);
DataWriter writer = new DataWriter(socket.OutputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
await irc.ReadFromServer(reader, writer);
break;
case SocketActivityTriggerReason.SocketClosed:
// implement reconnecting
break;
default:
break;
}
deferral.Complete();
}
catch (Exception exception)
{
Debug.WriteLine(exception.Message);
Debug.WriteLine(exception.StackTrace);
deferral.Complete();
}
}

private void ShowToast(string title, string message)
{
var toast = Irc.CreateBasicToast(title, message);

var toastNotifier = ToastNotificationManager.CreateToastNotifier();

toastNotifier.Show(toast);
}


protected override void OnActivated(IActivatedEventArgs e)
Expand Down
32 changes: 22 additions & 10 deletions WinIRC/Net/Irc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
Expand All @@ -29,6 +30,13 @@ public class Irc

public IrcServer server { get; set; }

public String BackgroundTaskName {
get
{
return "WinIRCBackgroundTask." + server.name;
}
}

public bool IsAuthed { get; set; }

public ObservableCollection<Message> ircMessages { get; set; }
Expand All @@ -44,6 +52,8 @@ public class Irc

public string buffer;
public string currentChannel;
public bool Transferred = false;

private string lightTextColor;
private string chatTextColor;

Expand All @@ -60,6 +70,8 @@ public Irc()

public virtual async void Connect() { }
public virtual async void Disconnect(string msg = "Powered by WinIRC") { }
public virtual async void SocketTransfer() { }
public virtual async void SocketReturn() { }

internal void AttemptAuth()
{
Expand Down Expand Up @@ -88,8 +100,8 @@ internal void AttemptAuth()
private async void AttemptRegister()
{
try {
writer.WriteString(String.Format("NICK {0}", server.username) + "\r\n");
writer.WriteString(String.Format("USER {0} {1} * :{2}", server.username, "8", server.username) + "\r\n");
WriteLine(String.Format("NICK {0}", server.username) + "\r\n");
WriteLine(String.Format("USER {0} {1} * :{2}", server.username, "8", server.username) + "\r\n");
await writer.StoreAsync();
await writer.FlushAsync();
}
Expand All @@ -100,14 +112,8 @@ private async void AttemptRegister()
}
}

internal void HandleLine(string receivedData)
internal async Task HandleLine(string receivedData)
{
if (receivedData.StartsWith("PING"))
{
WriteLine(receivedData.Replace("PING", "PONG"));
return;
}

var parsedLine = new IrcMessage(receivedData);

if (parsedLine.CommandMessage.Command == "CAP")
Expand Down Expand Up @@ -413,7 +419,7 @@ internal void HandleLine(string receivedData)
{
if (!channelList.Contains("Server"))
{
AddChannel("Server");
await AddChannel("Server");
}

Message msg = new Message();
Expand All @@ -429,6 +435,7 @@ internal void HandleLine(string receivedData)

}


public void SendAction(string message)
{
Message msg = new Message();
Expand Down Expand Up @@ -583,6 +590,11 @@ public void ClientMessage(string text)
}

public async void WriteLine(string str)
{
await WriteLine(writer, str);
}

public async Task WriteLine(DataWriter writer, string str)
{
try
{
Expand Down
Loading

0 comments on commit 3e37c1c

Please sign in to comment.