Preliminary IPC setup in place. May need to change IPC mechanism based on access limitations.
parent
525f059ecc
commit
292df9350b
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -8,7 +8,7 @@
|
|||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace WifiSitterGui.Properties {
|
||||
namespace WifiSitter.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace WifiSitterGui.Properties {
|
||||
namespace WifiSitter.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue