Preliminary IPC setup in place. May need to change IPC mechanism based on access limitations.

systray
Sean McArdle 2016-11-16 10:10:30 -08:00
parent 525f059ecc
commit 292df9350b
11 changed files with 223 additions and 17 deletions

View File

@ -6,6 +6,7 @@ using System.Linq;
using System.Net.NetworkInformation;
using System.Threading;
using System.Reflection;
using SimpleIPC;
using WifiSitter.Helpers;
using System.Threading.Tasks;
@ -23,7 +24,8 @@ namespace WifiSitter
private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
private static string[] _ignoreNics;
private volatile bool _paused;
private static WifiSitterIpc _wsIpc;
private Action<object, MessageEventArgs> _handleMsgRecv;
#endregion // fields
@ -83,6 +85,11 @@ namespace WifiSitter
Version v = asm.GetName().Version;
LogLine("Version: {0}", v.ToString());
// Setup IPC
LogLine("Initializing IPC...");
_handleMsgRecv = new Action<object, MessageEventArgs>(HandleMsgReceived);
_wsIpc = new WifiSitterIpc(_handleMsgRecv);
// Check if there are any interfaces not detected by GetAllNetworkInterfaces()
// That method will not show disabled interfaces
_ignoreNics = ReadNicWhitelist();
@ -348,6 +355,30 @@ namespace WifiSitter
}
}
private void HandleMsgReceived(object sender, MessageEventArgs e) {
LogLine("Message received");
if (!e.DataGram.IsValid) {
Trace.WriteLine("Invalid datagram received.");
return;
}
WifiSitterIpcMessage _msg = null;
try { _msg = Newtonsoft.Json.JsonConvert.DeserializeObject<WifiSitterIpcMessage>(e.DataGram.Message); }
catch { Trace.WriteLine("Deserialize to ServiceRequest failed."); }
if (_msg != null) {
if (_msg.Request == "get_netstate") {
LogLine("Sending netstate to: {0}", _msg.Requestor);
var response = new WifiSitterIpcMessage("give_netstate", _wsIpc.MyChannelName, "", Newtonsoft.Json.JsonConvert.SerializeObject(netstate));
_wsIpc.MsgBroadcaster.SendToChannel(_msg.Target, response);
}
}
else {
Trace.WriteLine(e.DataGram.Message);
}
}
#endregion // methods

View File

@ -112,6 +112,8 @@
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SitterNic.cs" />
<Compile Include="WifiSitterIpc.cs" />
<Compile Include="WifiSitterIpcMessage.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
@ -142,7 +144,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
<UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_BuildVersioningStyle="None.None.None.Increment" BuildVersion_UpdateFileVersion="False" />
<UserProperties BuildVersion_UpdateFileVersion="False" BuildVersion_BuildVersioningStyle="None.None.None.Increment" BuildVersion_StartDate="2000/1/1" />
</VisualStudio>
</ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SimpleIPC;
using System.Diagnostics;
namespace WifiSitter
{
public class WifiSitterIpc
{
private static string _myChannel = String.Format("{0}-{1}", Process.GetCurrentProcess().Id, Process.GetCurrentProcess().ProcessName);
public MessageListener MsgListener { get; private set; }
public MessageBroadcaster MsgBroadcaster { get; private set; }
public string MyChannelName { get { return _myChannel; } }
public WifiSitterIpc (Action<object, MessageEventArgs> MessageReceivedHandler) {
MsgListener = new MessageListener();
try {
WifiSitter.LogLine("Registering listener channel: {0}", _myChannel);
MsgListener.RegisterChannel(_myChannel);
}
catch {
WifiSitter.LogLine("Failed to register IPC listener channel {0}", _myChannel);
}
MsgListener.MessageReceived += (o,e) => { MessageReceivedHandler(o, e); };
MsgBroadcaster = new MessageBroadcaster();
}
}
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WifiSitter
{
public class WifiSitterIpcMessage
{
public string Request { get; set; }
public string Requestor { get; set; }
public string Target { get; set; }
public string Payload { get; set; }
public WifiSitterIpcMessage(string Verb, string WhosAsking, string WhereTo, string SendingWhat = "") {
Request = Verb;
Requestor = WhosAsking;
Target = WhereTo;
Payload = SendingWhat;
}
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WifiSitter
{
static class WifiSitter
{
public static void LogLine(params string[] msg) {
LogLine(ConsoleColor.White, msg);
}
public static void LogLine(ConsoleColor color, params string[] msg) {
if (msg.Length == 0) return;
string log = msg.Length > 0 ? String.Format(msg[0], msg.Skip(1).ToArray()) : msg[0];
Console.Write(DateTime.Now.ToString());
Console.ForegroundColor = color;
Console.WriteLine(" {0}", log);
Console.ResetColor();
}
}
}

View File

@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace WifiSitterGui.Properties {
namespace WifiSitter.Properties {
using System;

View File

@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace WifiSitterGui.Properties {
namespace WifiSitter.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

View File

@ -13,12 +13,13 @@
</Window.Resources>
<Grid>
<tb:TaskbarIcon
x:Name="TaskBarIcon"
IconSource="pack://application:,,,/Resources/wifisitter-icon.ico"
ToolTipText="hello world"
MenuActivation="LeftOrRightClick">
x:Name="TaskBarIcon"
IconSource="pack://application:,,,/Resources/wifisitter-icon.ico"
ToolTipText="hello world"
MenuActivation="LeftOrRightClick"
NoLeftClickDelay="True">
<tb:TaskbarIcon.ContextMenu>
<ContextMenu>
<MenuItem Header="Pause for 5 minutes"

View File

@ -11,6 +11,11 @@ using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using SimpleIPC;
using System.Diagnostics;
using WifiSitterGui.ViewModel;
using WifiSitter;
namespace WifiSitterGui
{
@ -23,6 +28,9 @@ namespace WifiSitterGui
private static MainWindowViewModel _windowVm;
private static MainWindow _statusGui;
private static WifiSitter.WifiSitterIpc _wsIpc;
private static string _serviceChannel;
private Action<object, MessageEventArgs> _handleMsgRcv;
#endregion // fields
@ -31,21 +39,50 @@ namespace WifiSitterGui
public TrayIconControl() {
InitializeComponent();
_windowVm = new ViewModel.MainWindowViewModel();
//ShowStatusSettingsWindow();
// Setup IPC message listener
_handleMsgRcv = new Action<object, MessageEventArgs>(wsIpc_MessageReceived);
_wsIpc = new WifiSitter.WifiSitterIpc( _handleMsgRcv );
Trace.WriteLine(String.Format("WifiSitter service msg channel: {0}", ServiceChannelName));
if (! String.IsNullOrEmpty(ServiceChannelName)) {
_wsIpc.MsgBroadcaster.SendToChannel(ServiceChannelName, new WifiSitterIpcMessage("get_netstate", _wsIpc.MyChannelName, _wsIpc.MyChannelName));
}
_windowVm = new MainWindowViewModel();
ShowStatusSettingsWindow();
}
~TrayIconControl() {
}
#endregion // constructor
#region properties
internal string ServiceChannelName {
get {
if (_serviceChannel == null) GetServiceChannelName();
return _serviceChannel;
}
}
private void GetServiceChannelName() {
var serviceProc = Process.GetProcesses().Where(x => x.ProcessName.ToLower() == "wifisitter").ToArray();
if (serviceProc != null &&
serviceProc.Length > 0) {
_serviceChannel = String.Format("{0}-{1}", serviceProc[0].Id, serviceProc[0].ProcessName);
}
}
#endregion // properties
#region methods
void ShowStatusSettingsWindow() {
@ -59,6 +96,7 @@ namespace WifiSitterGui
#endregion // methods
#region eventhandlers
private void ContextMenu_StatusSettings(object sender, RoutedEventArgs e) {
@ -73,11 +111,35 @@ namespace WifiSitterGui
private void ContextMenu_Quit(object sender, RoutedEventArgs e) {
_statusGui?.Close();
_statusGui?.Close();
Environment.Exit(0);
}
internal void wsIpc_MessageReceived(object sender, MessageEventArgs e) {
if (!e.DataGram.IsValid) {
Trace.WriteLine("Invalid datagram received.");
return;
}
WifiSitterIpcMessage _sr = null;
try { _sr = Newtonsoft.Json.JsonConvert.DeserializeObject<WifiSitterIpcMessage>(e.DataGram.Message); }
catch { Trace.WriteLine("Deserialize to ServiceRequest failed."); }
if (_sr != null) {
if (_sr.Request == "give_netstate") {
try {
WifiSitter.NetworkState ns = Newtonsoft.Json.JsonConvert.DeserializeObject<WifiSitter.NetworkState>(_sr.Payload);
}
catch { WifiSitter.WifiSitter.LogLine("Failed to deserialize netstate, payload: {0}", _sr.Payload); }
}
}
else {
Trace.WriteLine(e.DataGram.Message);
}
}
#endregion // eventhandlers
}
}

View File

@ -3,24 +3,35 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WifiSitterGui
using WifiSitter;
namespace WifiSitterGui.ViewModel
{
class MainWindowViewModel : MvvmObservable
{
#region fields
WifiSitter.NetworkState _netState;
#endregion // fields
#region constructor
public MainWindowViewModel () {
_netState = new NetworkState(new string[] { });
}
#endregion // constructor
#region properties
public NetworkState NetState {
get { return _netState; }
set { _netState = value; }
}
#endregion // properties

View File

@ -53,6 +53,7 @@
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
@ -67,6 +68,22 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="..\WifiSitter\Helpers\NetshHelper.cs">
<Link>Model\NetshHelper.cs</Link>
</Compile>
<Compile Include="..\WifiSitter\NetworkState.cs">
<Link>Model\NetworkState.cs</Link>
</Compile>
<Compile Include="..\WifiSitter\SitterNic.cs">
<Link>Model\SitterNic.cs</Link>
</Compile>
<Compile Include="..\WifiSitter\WifiSitterIpc.cs">
<Link>WifiSitterIpc.cs</Link>
</Compile>
<Compile Include="..\WifiSitter\WifiSitterIpcMessage.cs">
<Link>WifiSitterIpcMessage.cs</Link>
</Compile>
<Compile Include="Model\WifiSitterStub.cs" />
<Compile Include="TrayIconControl.xaml.cs">
<DependentUpon>TrayIconControl.xaml</DependentUpon>
</Compile>
@ -88,7 +105,7 @@
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="MainWindowViewModel.cs" />
<Compile Include="ViewModel\MainWindowViewModel.cs" />
<Compile Include="MvvmObservable.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
@ -123,6 +140,9 @@
<ItemGroup>
<Resource Include="wifisitter-icon.ico" />
</ItemGroup>
<ItemGroup>
<Folder Include="View\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.