Files
TeslaSuite/Console/TeslaConsole/SitePanel.cs
T
CydandClaude Opus 4.8 548550b312 Initial commit: TeslaSuite monorepo (TeslaConsole + TeslaLauncher)
Co-locate the two cockpit-pod projects into a single repository:

- Console/  : TeslaConsole, the net48 WinForms operator console (decompiled
              reconstruction) plus its differential + catalog test suite.
- Launcher/ : TeslaLauncher, the net6 pod-side Service + Agent rewrite.

Adds a combined TeslaSuite.sln, root README documenting the shared wire
contract (and its current duplication, the main follow-up), and a root
.gitignore. Histories were not preserved per request; this is a fresh start
from the current working state of both projects.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 14:43:28 -05:00

1641 lines
52 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using Tesla.Net;
using TeslaConsole.Properties;
using WeifenLuo.WinFormsUI.Docking;
namespace TeslaConsole;
internal class SitePanel : DockContent
{
private IContainer components;
private NoDoubleClickTreeView tvSquadsNPods;
private ToolStrip tsMain;
private ToolStripButton tsbNewSquad;
private BackgroundWorker bgwConfigurePod;
private StatusStrip ssStatus;
private ToolStripStatusLabel lblStatus;
private ToolStripProgressBar pbarOpProgress;
private Panel panel1;
private PictureBox picPodIcon;
private Label lblPodName;
private Label lblPodStatus;
private ImageList ilsBigIcons;
private ToolTip ttTip;
private PictureBox picRefresh;
private ContextMenuStrip cmnuTree;
private ToolStripMenuItem mRestartCheckedPodsIn;
private ToolStripMenuItem mShutdownCheckedPodsIn;
private ToolStripButton tsbManageSite;
private System.Windows.Forms.Timer tmrPodsCheck;
private ToolStripMenuItem mnuRemoveSquad;
private SplitContainer splitContainer1;
private BackgroundWorker bgwRefreshApps;
private PictureBox picThrobber;
private AppControlGrid grdApps;
private ToolStripMenuItem mShutdownAllPodsIn;
private ToolStripMenuItem mRestartAllPodsIn;
private ToolStripDropDownButton mPowerDropDown;
private ToolStripMenuItem mRestartAllPods;
private ToolStripMenuItem mShutdownAllPods;
private ToolStripSeparator mPowerSeparator;
private ToolStripMenuItem mRestartAllCheckedPods;
private ToolStripMenuItem mShutdownAllCheckedPods;
private ToolStripMenuItem mnuVolume;
private readonly Dictionary<string, NotificationAlert> mOpenConfigAlerts = new Dictionary<string, NotificationAlert>();
private readonly Dictionary<Guid, List<PodInfo>> mSquadPodInfos = new Dictionary<Guid, List<PodInfo>>();
private readonly Dictionary<Guid, PodInfo> mAllPods = new Dictionary<Guid, PodInfo>();
private readonly ToolStripMenuItem[] rVolumeItems;
private Squad mActiveSquad;
private PodInfo mActivePod;
private BackgroundWorker mRunningRefreshWorker;
private int mActiveLaunchKillRequests;
private ManualResetEvent mNoRunningLaunchKillRequests = new ManualResetEvent(initialState: true);
private PodInfo SelectedPod
{
get
{
if (tvSquadsNPods.SelectedNode != null && tvSquadsNPods.SelectedNode.Tag is PodInfo)
{
return (PodInfo)tvSquadsNPods.SelectedNode.Tag;
}
return null;
}
}
protected override void Dispose(bool disposing)
{
if (disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TeslaConsole.SitePanel));
this.cmnuTree = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuVolume = new System.Windows.Forms.ToolStripMenuItem();
this.mRestartAllPodsIn = new System.Windows.Forms.ToolStripMenuItem();
this.mShutdownAllPodsIn = new System.Windows.Forms.ToolStripMenuItem();
this.mRestartCheckedPodsIn = new System.Windows.Forms.ToolStripMenuItem();
this.mShutdownCheckedPodsIn = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRemoveSquad = new System.Windows.Forms.ToolStripMenuItem();
this.tsMain = new System.Windows.Forms.ToolStrip();
this.tsbNewSquad = new System.Windows.Forms.ToolStripButton();
this.tsbManageSite = new System.Windows.Forms.ToolStripButton();
this.mPowerDropDown = new System.Windows.Forms.ToolStripDropDownButton();
this.mRestartAllPods = new System.Windows.Forms.ToolStripMenuItem();
this.mShutdownAllPods = new System.Windows.Forms.ToolStripMenuItem();
this.mPowerSeparator = new System.Windows.Forms.ToolStripSeparator();
this.mRestartAllCheckedPods = new System.Windows.Forms.ToolStripMenuItem();
this.mShutdownAllCheckedPods = new System.Windows.Forms.ToolStripMenuItem();
this.bgwConfigurePod = new System.ComponentModel.BackgroundWorker();
this.ssStatus = new System.Windows.Forms.StatusStrip();
this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.pbarOpProgress = new System.Windows.Forms.ToolStripProgressBar();
this.panel1 = new System.Windows.Forms.Panel();
this.picThrobber = new System.Windows.Forms.PictureBox();
this.lblPodStatus = new System.Windows.Forms.Label();
this.picPodIcon = new System.Windows.Forms.PictureBox();
this.lblPodName = new System.Windows.Forms.Label();
this.picRefresh = new System.Windows.Forms.PictureBox();
this.grdApps = new TeslaConsole.AppControlGrid();
this.ilsBigIcons = new System.Windows.Forms.ImageList(this.components);
this.ttTip = new System.Windows.Forms.ToolTip(this.components);
this.tmrPodsCheck = new System.Windows.Forms.Timer(this.components);
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.tvSquadsNPods = new TeslaConsole.NoDoubleClickTreeView();
this.bgwRefreshApps = new System.ComponentModel.BackgroundWorker();
this.cmnuTree.SuspendLayout();
this.tsMain.SuspendLayout();
this.ssStatus.SuspendLayout();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)this.picThrobber).BeginInit();
((System.ComponentModel.ISupportInitialize)this.picPodIcon).BeginInit();
((System.ComponentModel.ISupportInitialize)this.picRefresh).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
base.SuspendLayout();
this.cmnuTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[6] { this.mnuVolume, this.mRestartAllPodsIn, this.mShutdownAllPodsIn, this.mRestartCheckedPodsIn, this.mShutdownCheckedPodsIn, this.mnuRemoveSquad });
this.cmnuTree.Name = "cmnuTree";
this.cmnuTree.Size = new System.Drawing.Size(223, 158);
this.cmnuTree.Opening += new System.ComponentModel.CancelEventHandler(cmnuTree_Opening);
this.mnuVolume.Name = "mnuVolume";
this.mnuVolume.Size = new System.Drawing.Size(222, 22);
this.mnuVolume.Text = "Volume";
this.mnuVolume.DropDownOpening += new System.EventHandler(mnuVolume_DropDownOpening);
this.mRestartAllPodsIn.Name = "mRestartAllPodsIn";
this.mRestartAllPodsIn.Size = new System.Drawing.Size(222, 22);
this.mRestartAllPodsIn.Text = "Restart All Pods in";
this.mRestartAllPodsIn.Click += new System.EventHandler(mRestartAllPodsIn_Click);
this.mShutdownAllPodsIn.Name = "mShutdownAllPodsIn";
this.mShutdownAllPodsIn.Size = new System.Drawing.Size(222, 22);
this.mShutdownAllPodsIn.Text = "Shutdown All Pods in";
this.mShutdownAllPodsIn.Click += new System.EventHandler(mShutdownAllPodsIn_Click);
this.mRestartCheckedPodsIn.Name = "mRestartCheckedPodsIn";
this.mRestartCheckedPodsIn.Size = new System.Drawing.Size(222, 22);
this.mRestartCheckedPodsIn.Text = "Restart Checked Pods in";
this.mRestartCheckedPodsIn.Click += new System.EventHandler(mRestartCheckedPodsIn_Click);
this.mShutdownCheckedPodsIn.Name = "mShutdownCheckedPodsIn";
this.mShutdownCheckedPodsIn.Size = new System.Drawing.Size(222, 22);
this.mShutdownCheckedPodsIn.Text = "Shutdown Checked Pods in ";
this.mShutdownCheckedPodsIn.Click += new System.EventHandler(mShutdownCheckedPodsIn_Click);
this.mnuRemoveSquad.Name = "mnuRemoveSquad";
this.mnuRemoveSquad.Size = new System.Drawing.Size(222, 22);
this.mnuRemoveSquad.Text = "Remove Squad";
this.mnuRemoveSquad.Click += new System.EventHandler(mnuRemoveSquad_Click);
this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[3] { this.tsbNewSquad, this.tsbManageSite, this.mPowerDropDown });
this.tsMain.Location = new System.Drawing.Point(0, 0);
this.tsMain.Name = "tsMain";
this.tsMain.Size = new System.Drawing.Size(344, 25);
this.tsMain.TabIndex = 1;
this.tsMain.Text = "toolStrip1";
this.tsbNewSquad.Image = TeslaConsole.Properties.Resources.Add;
this.tsbNewSquad.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbNewSquad.Name = "tsbNewSquad";
this.tsbNewSquad.Size = new System.Drawing.Size(87, 22);
this.tsbNewSquad.Text = "New Squad";
this.tsbNewSquad.Click += new System.EventHandler(tsbNewSquad_Click);
this.tsbManageSite.Image = TeslaConsole.Properties.Resources.PodOffline16;
this.tsbManageSite.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbManageSite.Name = "tsbManageSite";
this.tsbManageSite.Size = new System.Drawing.Size(92, 22);
this.tsbManageSite.Text = "Manage Site";
this.tsbManageSite.Click += new System.EventHandler(tsbManageSite_Click);
this.mPowerDropDown.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[5] { this.mRestartAllPods, this.mShutdownAllPods, this.mPowerSeparator, this.mRestartAllCheckedPods, this.mShutdownAllCheckedPods });
this.mPowerDropDown.Image = (System.Drawing.Image)resources.GetObject("mPowerDropDown.Image");
this.mPowerDropDown.ImageTransparentColor = System.Drawing.Color.Magenta;
this.mPowerDropDown.Name = "mPowerDropDown";
this.mPowerDropDown.Size = new System.Drawing.Size(69, 22);
this.mPowerDropDown.Text = "Power";
this.mRestartAllPods.Name = "mRestartAllPods";
this.mRestartAllPods.Size = new System.Drawing.Size(206, 22);
this.mRestartAllPods.Text = "Restart All Pods";
this.mRestartAllPods.Click += new System.EventHandler(mRestartAllPods_Click);
this.mShutdownAllPods.Name = "mShutdownAllPods";
this.mShutdownAllPods.Size = new System.Drawing.Size(206, 22);
this.mShutdownAllPods.Text = "Shutdown All Pods";
this.mShutdownAllPods.Click += new System.EventHandler(mShutdownAllPods_Click);
this.mPowerSeparator.Name = "mPowerSeparator";
this.mPowerSeparator.Size = new System.Drawing.Size(203, 6);
this.mRestartAllCheckedPods.Name = "mRestartAllCheckedPods";
this.mRestartAllCheckedPods.Size = new System.Drawing.Size(206, 22);
this.mRestartAllCheckedPods.Text = "Restart Checked Pods";
this.mRestartAllCheckedPods.Click += new System.EventHandler(mRestartAllCheckedPods_Click);
this.mShutdownAllCheckedPods.Name = "mShutdownAllCheckedPods";
this.mShutdownAllCheckedPods.Size = new System.Drawing.Size(206, 22);
this.mShutdownAllCheckedPods.Text = "Shutdown Checked Pods";
this.mShutdownAllCheckedPods.Click += new System.EventHandler(mShutdownAllCheckedPods_Click);
this.bgwConfigurePod.WorkerReportsProgress = true;
this.bgwConfigurePod.DoWork += new System.ComponentModel.DoWorkEventHandler(bgwConfigurePod_DoWork);
this.bgwConfigurePod.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(bgwConfigurePod_RunWorkerCompleted);
this.bgwConfigurePod.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(bgwConfigurePod_ProgressChanged);
this.ssStatus.Items.AddRange(new System.Windows.Forms.ToolStripItem[2] { this.lblStatus, this.pbarOpProgress });
this.ssStatus.Location = new System.Drawing.Point(0, 573);
this.ssStatus.Name = "ssStatus";
this.ssStatus.Size = new System.Drawing.Size(344, 22);
this.ssStatus.TabIndex = 2;
this.ssStatus.Text = "statusStrip1";
this.lblStatus.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(329, 17);
this.lblStatus.Spring = true;
this.lblStatus.Text = "Site Idle";
this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.pbarOpProgress.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.pbarOpProgress.Name = "pbarOpProgress";
this.pbarOpProgress.Size = new System.Drawing.Size(100, 16);
this.pbarOpProgress.Visible = false;
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.panel1.Controls.Add(this.picThrobber);
this.panel1.Controls.Add(this.lblPodStatus);
this.panel1.Controls.Add(this.picPodIcon);
this.panel1.Controls.Add(this.lblPodName);
this.panel1.Controls.Add(this.picRefresh);
this.panel1.Controls.Add(this.grdApps);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(344, 217);
this.panel1.TabIndex = 4;
this.picThrobber.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right;
this.picThrobber.Image = TeslaConsole.Properties.Resources.square_throbber;
this.picThrobber.Location = new System.Drawing.Point(293, 3);
this.picThrobber.Name = "picThrobber";
this.picThrobber.Size = new System.Drawing.Size(47, 32);
this.picThrobber.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.picThrobber.TabIndex = 9;
this.picThrobber.TabStop = false;
this.picThrobber.Visible = false;
this.lblPodStatus.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right;
this.lblPodStatus.AutoEllipsis = true;
this.lblPodStatus.Location = new System.Drawing.Point(41, 19);
this.lblPodStatus.Name = "lblPodStatus";
this.lblPodStatus.Size = new System.Drawing.Size(246, 13);
this.lblPodStatus.TabIndex = 6;
this.lblPodStatus.Text = "Pod is Offline";
this.picPodIcon.Location = new System.Drawing.Point(3, 3);
this.picPodIcon.Name = "picPodIcon";
this.picPodIcon.Size = new System.Drawing.Size(32, 32);
this.picPodIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.picPodIcon.TabIndex = 5;
this.picPodIcon.TabStop = false;
this.lblPodName.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right;
this.lblPodName.AutoEllipsis = true;
this.lblPodName.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75f, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 0);
this.lblPodName.Location = new System.Drawing.Point(41, 3);
this.lblPodName.Name = "lblPodName";
this.lblPodName.Size = new System.Drawing.Size(246, 16);
this.lblPodName.TabIndex = 4;
this.lblPodName.Text = "Mistress Quickly";
this.picRefresh.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right;
this.picRefresh.Cursor = System.Windows.Forms.Cursors.Hand;
this.picRefresh.Image = (System.Drawing.Image)resources.GetObject("picRefresh.Image");
this.picRefresh.Location = new System.Drawing.Point(308, 3);
this.picRefresh.Name = "picRefresh";
this.picRefresh.Size = new System.Drawing.Size(32, 32);
this.picRefresh.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.picRefresh.TabIndex = 8;
this.picRefresh.TabStop = false;
this.picRefresh.Click += new System.EventHandler(picRefresh_Click);
this.grdApps.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right;
this.grdApps.Location = new System.Drawing.Point(0, 41);
this.grdApps.Name = "grdApps";
this.grdApps.ShowCounts = false;
this.grdApps.Size = new System.Drawing.Size(343, 172);
this.grdApps.TabIndex = 10;
this.grdApps.KillApp += new System.EventHandler<TeslaConsole.AppEventArgs>(grdApps_KillApp);
this.grdApps.LaunchApp += new System.EventHandler<TeslaConsole.AppEventArgs>(grdApps_LaunchApp);
this.ilsBigIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
this.ilsBigIcons.ImageSize = new System.Drawing.Size(32, 32);
this.ilsBigIcons.TransparentColor = System.Drawing.Color.Transparent;
this.tmrPodsCheck.Enabled = true;
this.tmrPodsCheck.Interval = 500;
this.tmrPodsCheck.Tick += new System.EventHandler(tmrPodsCheck_Tick);
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 25);
this.splitContainer1.Name = "splitContainer1";
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.splitContainer1.Panel1.Controls.Add(this.tvSquadsNPods);
this.splitContainer1.Panel2.Controls.Add(this.panel1);
this.splitContainer1.Size = new System.Drawing.Size(344, 548);
this.splitContainer1.SplitterDistance = 327;
this.splitContainer1.TabIndex = 5;
this.tvSquadsNPods.AllowDrop = true;
this.tvSquadsNPods.CheckBoxes = true;
this.tvSquadsNPods.ContextMenuStrip = this.cmnuTree;
this.tvSquadsNPods.Dock = System.Windows.Forms.DockStyle.Fill;
this.tvSquadsNPods.LabelEdit = true;
this.tvSquadsNPods.Location = new System.Drawing.Point(0, 0);
this.tvSquadsNPods.Name = "tvSquadsNPods";
this.tvSquadsNPods.Size = new System.Drawing.Size(344, 327);
this.tvSquadsNPods.TabIndex = 0;
this.tvSquadsNPods.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(tvSquadsNPods_AfterCheck);
this.tvSquadsNPods.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(tvSquadsNPods_AfterLabelEdit);
this.tvSquadsNPods.DragDrop += new System.Windows.Forms.DragEventHandler(tvSquadsNPods_DragDrop);
this.tvSquadsNPods.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(tvSquadsNPods_AfterSelect);
this.tvSquadsNPods.DragEnter += new System.Windows.Forms.DragEventHandler(tvSquadsNPods_DragEnter);
this.tvSquadsNPods.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(tvSquadsNPods_NodeMouseClick);
this.tvSquadsNPods.BeforeCheck += new System.Windows.Forms.TreeViewCancelEventHandler(tvSquadsNPods_BeforeCheck);
this.tvSquadsNPods.KeyDown += new System.Windows.Forms.KeyEventHandler(tvSquadsNPods_KeyDown);
this.tvSquadsNPods.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(tvSquadsNPods_ItemDrag);
this.tvSquadsNPods.DragOver += new System.Windows.Forms.DragEventHandler(tvSquadsNPods_DragOver);
this.bgwRefreshApps.WorkerSupportsCancellation = true;
this.bgwRefreshApps.DoWork += new System.ComponentModel.DoWorkEventHandler(bgwRefreshPodApps_DoWork);
this.bgwRefreshApps.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(bgwRefreshApps_RunWorkerCompleted);
base.AutoScaleDimensions = new System.Drawing.SizeF(6f, 13f);
base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
base.ClientSize = new System.Drawing.Size(344, 595);
base.Controls.Add(this.splitContainer1);
base.Controls.Add(this.ssStatus);
base.Controls.Add(this.tsMain);
this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0);
base.Name = "SitePanel";
base.TabText = "PodControl";
this.Text = "PodControl";
base.Load += new System.EventHandler(SitePanel_Load);
base.FormClosing += new System.Windows.Forms.FormClosingEventHandler(SitePanel_FormClosing);
this.cmnuTree.ResumeLayout(false);
this.tsMain.ResumeLayout(false);
this.tsMain.PerformLayout();
this.ssStatus.ResumeLayout(false);
this.ssStatus.PerformLayout();
this.panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)this.picThrobber).EndInit();
((System.ComponentModel.ISupportInitialize)this.picPodIcon).EndInit();
((System.ComponentModel.ISupportInitialize)this.picRefresh).EndInit();
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
this.splitContainer1.ResumeLayout(false);
base.ResumeLayout(false);
base.PerformLayout();
}
public SitePanel()
{
InitializeComponent();
rVolumeItems = new ToolStripMenuItem[11];
for (int i = 0; i <= 10; i++)
{
int vol = i * 10;
rVolumeItems[i] = new ToolStripMenuItem((vol > 0) ? vol.ToString() : "mute");
rVolumeItems[i].Click += delegate
{
ConnectAndDo(EnumerateTreeTag(checkedOnly: false), delegate(PodInfo pi)
{
pi.Volume = (float)vol / 100f;
}, "Setting Volume");
};
}
}
private void FillSite()
{
tvSquadsNPods.BeginUpdate();
tvSquadsNPods.Nodes.Clear();
mSquadPodInfos.Clear();
foreach (Squad squad in TeslaConsole.Site.Active.Squads)
{
AddSquad(squad);
}
tvSquadsNPods.ExpandAll();
tvSquadsNPods.EndUpdate();
foreach (TreeNode node in tvSquadsNPods.Nodes)
{
foreach (TreeNode node2 in node.Nodes)
{
if (((PodInfo)node2.Tag).Pod.Online)
{
node2.Checked = true;
}
}
}
}
private TreeNode AddSquad(Squad squad)
{
TreeNode treeNode = new TreeNode(squad.Name);
treeNode.Tag = squad;
treeNode.Checked = squad.Online;
if (!squad.IsLocal)
{
SetNodeFont(treeNode, underline: false);
}
mSquadPodInfos.Add(squad.Guid, new List<PodInfo>());
foreach (Pod pod in squad.Pods)
{
AddPod(new PodInfo(pod, register: false), treeNode);
}
tvSquadsNPods.Nodes.Add(treeNode);
return treeNode;
}
private TreeNode NewSquad()
{
int num = 1;
Squad squad = new Squad();
squad.Name = "New Squad";
for (int i = 0; i < TeslaConsole.Site.Active.Squads.Count; i++)
{
if (string.Compare(TeslaConsole.Site.Active.Squads[i].Name, squad.Name, ignoreCase: true) == 0)
{
squad.Name = "New Squad " + num++;
i = -1;
}
}
TeslaConsole.Site.Active.Squads.Add(squad);
return AddSquad(squad);
}
private TreeNode AddPod(PodInfo pi, TreeNode squadNode)
{
Squad squad = squadNode.Tag as Squad;
mSquadPodInfos[squad.Guid].Add(pi);
pi.ConnectCompleted += Pod_ConnectCompleted;
pi.LaunchApplicationCompleted += Pod_LaunchApplicationCompleted;
pi.KillApplicationCompleted += Pod_KillApplicationCompleted;
TreeNode treeNode = new TreeNode(pi.Pod.Name);
treeNode.Tag = pi;
string text2 = (treeNode.ImageKey = (treeNode.SelectedImageKey = Resources.PodOfflineImageKey));
if (!pi.Pod.IsLocal)
{
SetNodeFont(treeNode, underline: false);
}
squadNode.Nodes.Add(treeNode);
mAllPods[pi.Pod.ID] = pi;
return treeNode;
}
private void SetNodeFont(TreeNode node, bool underline)
{
bool flag = true;
if (node.Tag is Squad)
{
flag = ((Squad)node.Tag).IsLocal;
}
else if (node.Tag is PodInfo)
{
flag = ((PodInfo)node.Tag).Pod.IsLocal;
}
if (underline)
{
if (flag)
{
node.NodeFont = new Font(tvSquadsNPods.Font, FontStyle.Underline);
}
else
{
node.NodeFont = new Font(tvSquadsNPods.Font, FontStyle.Italic | FontStyle.Underline);
}
}
else if (flag)
{
node.NodeFont = null;
}
else
{
node.NodeFont = new Font(tvSquadsNPods.Font, FontStyle.Italic);
}
node.ForeColor = (flag ? Color.Black : Color.Gray);
}
private void FillInfoPanel(PodInfo pod, string imageKey)
{
if (pod == null)
{
picPodIcon.Image = null;
lblPodName.Text = "";
lblPodStatus.Text = "";
}
else
{
picPodIcon.Image = ilsBigIcons.Images[imageKey];
lblPodName.Text = pod.Pod.Name;
picRefresh.Enabled = false;
if (pod.Pod.IsLocal)
{
ttTip.SetToolTip(lblPodStatus, "");
if (pod.IsConnected)
{
lblPodStatus.Text = "Console is connected to pod";
lblPodStatus.ForeColor = Color.Green;
picRefresh.Enabled = true;
}
else if (pod.LastConnectionException != null)
{
lblPodStatus.Text = "Connect error: " + pod.LastConnectionException.Message;
ttTip.SetToolTip(lblPodStatus, lblPodStatus.Text);
lblPodStatus.ForeColor = Color.Red;
}
else if (pod.IsConnecting)
{
lblPodStatus.Text = "Connecting...";
ttTip.SetToolTip(lblPodStatus, lblPodStatus.Text);
lblPodStatus.ForeColor = Color.Black;
}
else
{
lblPodStatus.Text = "Not connected";
lblPodStatus.ForeColor = Color.DarkGray;
}
}
else
{
lblPodStatus.Text = "Pod is not a local pod.";
lblPodStatus.ForeColor = Color.DarkGray;
}
}
RefreshAppList(pod, forceRefresh: false);
}
private void FillInfoPanel(Squad squad)
{
if (squad == null || !mSquadPodInfos.ContainsKey(squad.Guid))
{
picPodIcon.Image = null;
lblPodName.Text = "";
lblPodStatus.Text = "";
}
else
{
picPodIcon.Image = Resources.PodOffline32;
lblPodName.Text = squad.Name;
ttTip.SetToolTip(lblPodStatus, "");
int num = 0;
int num2 = 0;
foreach (PodInfo item in mSquadPodInfos[squad.Guid])
{
if (item.Pod.IsLocal)
{
if (item.Pod.Online)
{
num++;
}
if (item.IsConnected)
{
num2++;
}
}
}
lblPodStatus.Text = $"{squad.Pods.Count} pods, {num} online, {num2} connected";
lblPodStatus.ForeColor = Color.Black;
}
RefreshAppList(squad, forceRefresh: false);
}
private void RefreshAppList(PodInfo pod, bool forceRefresh)
{
mActiveSquad = null;
mActivePod = null;
grdApps.Clear();
lblStatus.Text = "Refreshing application list...";
lblStatus.ForeColor = Color.Black;
if (pod == null)
{
picRefresh.Visible = false;
return;
}
picRefresh.Show();
picThrobber.Show();
grdApps.ShowCounts = false;
mActivePod = pod;
mRunningRefreshWorker = new BackgroundWorker();
mRunningRefreshWorker.DoWork += bgwRefreshPodApps_DoWork;
mRunningRefreshWorker.RunWorkerCompleted += bgwRefreshApps_RunWorkerCompleted;
mRunningRefreshWorker.RunWorkerAsync(Tuple.Create(pod, forceRefresh));
}
private void RefreshAppList(Squad squad, bool forceRefresh)
{
if (mActiveSquad == null || !(mActiveSquad.Guid == squad.Guid) || mRunningRefreshWorker == null)
{
mActiveSquad = null;
mActivePod = null;
grdApps.Clear();
lblStatus.Text = "Refreshing application list...";
lblStatus.ForeColor = Color.Black;
if (squad == null || !mSquadPodInfos.ContainsKey(squad.Guid))
{
picRefresh.Visible = false;
return;
}
picRefresh.Show();
picThrobber.Show();
grdApps.ShowCounts = true;
mActiveSquad = squad;
mRunningRefreshWorker = new BackgroundWorker();
mRunningRefreshWorker.DoWork += bgwRefreshSquadApps_DoWork;
mRunningRefreshWorker.RunWorkerCompleted += bgwRefreshApps_RunWorkerCompleted;
mRunningRefreshWorker.RunWorkerAsync(Tuple.Create(squad, forceRefresh));
}
}
private void IncrementActiveLaunchKillRequests()
{
if (mActiveLaunchKillRequests == 0)
{
mNoRunningLaunchKillRequests.Reset();
}
mActiveLaunchKillRequests++;
}
private void DecrementActiveLaunchKillRequests()
{
mActiveLaunchKillRequests--;
if (mActiveLaunchKillRequests == 0)
{
mNoRunningLaunchKillRequests.Set();
}
}
private void SitePanel_Load(object sender, EventArgs e)
{
tvSquadsNPods.ImageList = new ImageList();
tvSquadsNPods.ImageList.Images.Add(Resources.PodOfflineImageKey, ImageCache.PodOffline16);
tvSquadsNPods.ImageList.Images.Add(Resources.PodOnlineImageKey, ImageCache.PodOnline16);
tvSquadsNPods.ImageList.Images.Add(Resources.PodBadImageKey, ImageCache.PodBad16);
tvSquadsNPods.ImageList.Images.Add(Resources.PodQuestionImageKey, ImageCache.PodQuestion16);
tvSquadsNPods.ImageList.Images.Add(Resources.PodGoImageKey, ImageCache.PodGo16);
ilsBigIcons.Images.Add(Resources.PodOfflineImageKey, Resources.PodOffline32);
ilsBigIcons.Images.Add(Resources.PodOnlineImageKey, Resources.PodOnline32);
ilsBigIcons.Images.Add(Resources.PodBadImageKey, Resources.PodBad32);
ilsBigIcons.Images.Add(Resources.PodQuestionImageKey, Resources.PodQuestion32);
ilsBigIcons.Images.Add(Resources.PodGoImageKey, Resources.PodGo32);
FillSite();
PodManager.PodReadyForConfig += PodManager_PodReadyForConfig;
PodManager.PodConfigured += PodManager_PodConfigured;
}
private void SitePanel_FormClosing(object sender, FormClosingEventArgs e)
{
tmrPodsCheck.Stop();
PodManager.PodReadyForConfig -= PodManager_PodReadyForConfig;
PodManager.PodConfigured -= PodManager_PodConfigured;
foreach (TreeNode node in tvSquadsNPods.Nodes)
{
foreach (TreeNode node2 in node.Nodes)
{
PodInfo podInfo = (PodInfo)node2.Tag;
podInfo.ConnectCompleted -= Pod_ConnectCompleted;
podInfo.Disconnect();
}
}
TeslaConsole.Site.Active.Save();
}
private void tsbNewSquad_Click(object sender, EventArgs e)
{
NewSquad().BeginEdit();
}
private void tsbManageSite_Click(object sender, EventArgs e)
{
foreach (NotificationAlert value in mOpenConfigAlerts.Values)
{
value.Close();
}
mOpenConfigAlerts.Clear();
using (SiteManagement siteManagement = new SiteManagement())
{
siteManagement.ShowDialog(this);
}
FillSite();
}
private void tvSquadsNPods_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
if (e.Node.Tag is Squad)
{
e.Cancel = !((Squad)e.Node.Tag).IsLocal;
}
else if (e.Node.Tag is PodInfo)
{
e.Cancel = !((PodInfo)e.Node.Tag).Pod.IsLocal;
}
}
private void tvSquadsNPods_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Node.Tag is Squad)
{
(e.Node.Tag as Squad).Online = e.Node.Checked;
foreach (TreeNode node in e.Node.Nodes)
{
if (node.Checked != e.Node.Checked)
{
node.Checked = e.Node.Checked;
}
}
if (e.Node.IsSelected)
{
FillInfoPanel((Squad)e.Node.Tag);
}
}
else
{
if (!(e.Node.Tag is PodInfo))
{
return;
}
PodInfo podInfo = (PodInfo)e.Node.Tag;
if (e.Node.Checked)
{
podInfo.ConnectAsync(e.Node);
string text2 = (e.Node.ImageKey = (e.Node.SelectedImageKey = Resources.PodQuestionImageKey));
}
else
{
podInfo.Disconnect();
string text4 = (e.Node.ImageKey = (e.Node.SelectedImageKey = Resources.PodOfflineImageKey));
if (e.Node.IsSelected)
{
FillInfoPanel(podInfo, e.Node.ImageKey);
}
}
podInfo.Pod.Online = e.Node.Checked;
if (mActiveSquad != null)
{
FillInfoPanel(mActiveSquad);
}
int num = 0;
foreach (TreeNode node2 in e.Node.Parent.Nodes)
{
if (node2.Checked)
{
num++;
}
}
if (num == e.Node.Parent.Nodes.Count)
{
e.Node.Parent.Checked = true;
}
else if (num == 0)
{
e.Node.Parent.Checked = false;
}
}
}
private void tvSquadsNPods_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
if (e.Label == null)
{
return;
}
if (e.Node.Tag is Squad)
{
foreach (Squad squad in TeslaConsole.Site.Active.Squads)
{
if (string.Compare(squad.Name, e.Label, ignoreCase: true) == 0)
{
MessageBox.Show(this, "A squad already exists with the name \"" + e.Label + "\". Squad names must be unique.", "Rename Squad", MessageBoxButtons.OK, MessageBoxIcon.Hand);
e.CancelEdit = true;
return;
}
}
((Squad)e.Node.Tag).Name = e.Label;
}
else if (e.Node.Tag is PodInfo)
{
foreach (Squad squad2 in TeslaConsole.Site.Active.Squads)
{
foreach (Pod pod in squad2.Pods)
{
if (string.Compare(pod.Name, e.Label, ignoreCase: true) == 0)
{
MessageBox.Show(this, "A pod already exists with the name \"" + e.Label + "\". Pod names must be unique.", "Rename Pod", MessageBoxButtons.OK, MessageBoxIcon.Hand);
e.CancelEdit = true;
return;
}
}
}
((PodInfo)e.Node.Tag).Pod.Name = e.Label;
}
TeslaConsole.Site.Active.Save();
}
private void tvSquadsNPods_AfterSelect(object sender, TreeViewEventArgs e)
{
grdApps.Clear();
if (e.Node == null)
{
FillInfoPanel(null, "");
}
else if (e.Node.Tag is Squad)
{
FillInfoPanel((Squad)e.Node.Tag);
}
else if (e.Node.Tag is PodInfo)
{
FillInfoPanel((PodInfo)e.Node.Tag, e.Node.ImageKey);
}
}
private void tvSquadsNPods_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
tvSquadsNPods.SelectedNode = e.Node;
}
}
private void PodManager_PodReadyForConfig(string requestId, byte[] macAddress)
{
if (base.InvokeRequired)
{
Invoke(new PodManager.PodReadyConfigHandler(PodManager_PodReadyForConfig), requestId, macAddress);
}
else if (!SiteManagement.IsOpen)
{
NotificationAlert notificationAlert = new NotificationAlert();
notificationAlert.RightButtonText = "Configure";
notificationAlert.RightButtonDialogResult = DialogResult.OK;
notificationAlert.AlertButtonClick += ConfigAlert_AlertButtonClick;
notificationAlert.FormClosed += ConfigAlert_FormClosed;
notificationAlert.Tag = new Tuple<string, byte[]>(requestId, macAddress);
mOpenConfigAlerts.Add(requestId, notificationAlert);
Pod pod = TeslaConsole.Site.Active.FindPod(macAddress);
if (pod != null)
{
notificationAlert.Title = "Configuration - " + pod.Name;
notificationAlert.Text = pod.Name + " is ready to be configured." + Environment.NewLine + "Enter passphrase:";
notificationAlert.ShowInput = true;
}
else
{
notificationAlert.Title = "Configuration - " + requestId;
notificationAlert.Text = "An unrecognized pod on your site is ready to be configured.";
}
notificationAlert.Show();
}
}
private void PodManager_PodConfigured(string requestId, byte[] macAddress)
{
NotificationAlert alert = null;
if (!mOpenConfigAlerts.TryGetValue(requestId, out alert))
{
return;
}
mOpenConfigAlerts.Remove(requestId);
if (alert.InvokeRequired)
{
alert.Invoke((VoidDelegate)delegate
{
alert.Close();
});
}
else
{
alert.Close();
}
}
private void ConfigAlert_AlertButtonClick(object sender, AlertButtonClickEventArgs e)
{
NotificationAlert notificationAlert = sender as NotificationAlert;
if (e.DialogResult == DialogResult.OK)
{
Tuple<string, byte[]> tuple = (Tuple<string, byte[]>)notificationAlert.Tag;
mOpenConfigAlerts.Remove(tuple.A);
notificationAlert.Close();
if (e.Input == null)
{
Pod pod = new Pod();
pod.MacAddress = tuple.B;
SetupPod setupPod = new SetupPod(tuple.A, pod, TeslaConsole.Site.Active.Squads);
if (setupPod.ShowDialog(this) == DialogResult.OK)
{
ConfigurePod(tuple.A, setupPod.Passphrase, setupPod.Pod);
TreeNode treeNode = null;
bool flag = false;
if (setupPod.Squad.Guid == Guid.Empty)
{
treeNode = NewSquad();
flag = true;
}
else
{
foreach (TreeNode node in tvSquadsNPods.Nodes)
{
if (((Squad)node.Tag).Guid == setupPod.Squad.Guid)
{
treeNode = node;
break;
}
}
}
((Squad)treeNode.Tag).Pods.Add(setupPod.Pod);
treeNode.Expand();
tvSquadsNPods.SelectedNode = AddPod(new PodInfo(setupPod.Pod, register: false), treeNode);
tvSquadsNPods.SelectedNode.EnsureVisible();
if (flag)
{
treeNode.BeginEdit();
}
}
}
else
{
Pod pod2 = TeslaConsole.Site.Active.FindPod(tuple.B);
ConfigurePod(tuple.A, e.Input.ToUpper(), pod2);
}
}
notificationAlert.Dispose();
}
private void ConfigAlert_FormClosed(object sender, FormClosedEventArgs e)
{
NotificationAlert notificationAlert = sender as NotificationAlert;
mOpenConfigAlerts.Remove(((Tuple<string, byte[]>)notificationAlert.Tag).A);
}
private void ConfigurePod(string requestId, string passphrase, Pod pod)
{
lblStatus.Text = "Configuring " + pod.Name + "...";
pbarOpProgress.Visible = true;
pbarOpProgress.Value = 0;
tsbManageSite.Enabled = false;
tsbManageSite.ToolTipText = "Configuring Pod...";
ssStatus.Refresh();
bgwConfigurePod.RunWorkerAsync(new Tuple<string, string, Pod>(requestId, passphrase, pod));
}
private void bgwConfigurePod_DoWork(object sender, DoWorkEventArgs e)
{
Tuple<string, string, Pod> tuple = (Tuple<string, string, Pod>)e.Argument;
tuple.C.Key = PodManager.ConfigurePod(tuple.A, tuple.B, tuple.C);
if (tuple.C.Key == null)
{
e.Result = new PodConfigurationException(tuple.C.Name + " timed out configuring.", tuple.C);
return;
}
bgwConfigurePod.ReportProgress(50, "Saving site information...");
TeslaConsole.Site.Active.Save();
e.Result = tuple.C.Name + " configured.";
}
private void bgwConfigurePod_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbarOpProgress.Value = e.ProgressPercentage;
lblStatus.Text = (string)e.UserState;
}
private void bgwConfigurePod_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Result is PodConfigurationException)
{
lblStatus.Text = ((PodConfigurationException)e.Result).Message;
}
else
{
lblStatus.Text = (string)e.Result;
}
pbarOpProgress.Visible = false;
tsbManageSite.Enabled = true;
tsbManageSite.ToolTipText = "Manage Site";
}
private void bgwRefreshPodApps_DoWork(object sender, DoWorkEventArgs e)
{
PodInfo a2 = ((Tuple<PodInfo, bool>)e.Argument).A;
bool b = ((Tuple<PodInfo, bool>)e.Argument).B;
if (a2 == null)
{
return;
}
mNoRunningLaunchKillRequests.WaitOne(TimeSpan.FromMinutes(1.0));
if (!a2.IsConnected)
{
return;
}
if (b)
{
a2.Refresh();
}
List<PodAppInstance> list = new List<PodAppInstance>();
LaunchData[] allApplications = a2.AllApplications;
LaunchData app;
for (int i = 0; i < allApplications.Length; i++)
{
app = allApplications[i];
list.Add(new PodAppInstance
{
LaunchPair = app.LaunchPair,
PodId = a2.Pod.ID,
IsRunning = Array.Exists(a2.RunningApplications, (LaunchedAppData a) => app.LaunchPair.LaunchKey == a.LaunchKey)
});
}
e.Result = list;
}
private void bgwRefreshSquadApps_DoWork(object sender, DoWorkEventArgs e)
{
Squad a2 = ((Tuple<Squad, bool>)e.Argument).A;
bool b = ((Tuple<Squad, bool>)e.Argument).B;
if (a2 == null)
{
return;
}
List<PodInfo> list = mSquadPodInfos[a2.Guid];
if (list.Count <= 0)
{
return;
}
mNoRunningLaunchKillRequests.WaitOne(TimeSpan.FromMinutes(1.0));
List<PodAppInstance> list2 = new List<PodAppInstance>();
foreach (PodInfo item in list)
{
if (!item.Pod.Online || !item.IsConnected)
{
continue;
}
if (b)
{
item.Refresh();
}
LaunchData[] allApplications = item.AllApplications;
LaunchData app;
for (int i = 0; i < allApplications.Length; i++)
{
app = allApplications[i];
list2.Add(new PodAppInstance
{
LaunchPair = app.LaunchPair,
PodId = item.Pod.ID,
IsRunning = Array.Exists(item.RunningApplications, (LaunchedAppData a) => app.LaunchPair.LaunchKey == a.LaunchKey)
});
}
}
e.Result = list2;
}
private void bgwRefreshApps_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
BackgroundWorker backgroundWorker = (BackgroundWorker)sender;
if (backgroundWorker == mRunningRefreshWorker)
{
picThrobber.Visible = false;
if (e.Error != null)
{
lblStatus.Text = "Failed to retrieve list";
lblStatus.ForeColor = Color.Red;
}
else
{
if (e.Result != null)
{
List<PodAppInstance> list = (List<PodAppInstance>)e.Result;
grdApps.SetData(list.FindAll((PodAppInstance app) => mAllPods[app.PodId].IsConnected));
}
lblStatus.Text = "Site Idle";
}
mRunningRefreshWorker = null;
}
backgroundWorker.Dispose();
}
private void grdApps_LaunchApp(object sender, AppEventArgs e)
{
if (mActivePod != null)
{
mActivePod.LaunchApplicationAsync(e.ApplicationId, null);
IncrementActiveLaunchKillRequests();
}
else
{
if (mActiveSquad == null || !mSquadPodInfos.ContainsKey(mActiveSquad.Guid))
{
return;
}
foreach (PodInfo item in mSquadPodInfos[mActiveSquad.Guid])
{
if (item.IsConnected && e.PodIds.Contains(item.Pod.ID))
{
item.LaunchApplicationAsync(e.ApplicationId, null);
IncrementActiveLaunchKillRequests();
}
}
}
}
private void grdApps_KillApp(object sender, AppEventArgs e)
{
if (mActivePod != null)
{
if (mActivePod.IsConnected)
{
mActivePod.KillApplicationAsync(e.ApplicationId, null);
IncrementActiveLaunchKillRequests();
}
else
{
mActivePod.Refresh();
}
}
else
{
if (mActiveSquad == null || !mSquadPodInfos.ContainsKey(mActiveSquad.Guid))
{
return;
}
foreach (PodInfo item in mSquadPodInfos[mActiveSquad.Guid])
{
if (item.IsConnected && e.PodIds.Contains(item.Pod.ID))
{
item.KillApplicationAsync(e.ApplicationId, null);
IncrementActiveLaunchKillRequests();
}
}
}
}
private void Pod_ConnectCompleted(object sender, AsyncCompletedEventArgs e)
{
PodInfo podInfo = sender as PodInfo;
TreeNode treeNode = e.UserState as TreeNode;
if (!treeNode.Checked)
{
return;
}
if (e.Error == null)
{
string text2 = (treeNode.ImageKey = (treeNode.SelectedImageKey = Resources.PodOnlineImageKey));
}
else
{
string text4 = (treeNode.ImageKey = (treeNode.SelectedImageKey = Resources.PodBadImageKey));
}
if (tvSquadsNPods.SelectedNode == null)
{
return;
}
if (tvSquadsNPods.SelectedNode.Tag is Squad)
{
FillInfoPanel((Squad)tvSquadsNPods.SelectedNode.Tag);
}
else if (tvSquadsNPods.SelectedNode.Tag is PodInfo)
{
PodInfo podInfo2 = (PodInfo)tvSquadsNPods.SelectedNode.Tag;
if (podInfo2.Pod.ID == podInfo.Pod.ID)
{
FillInfoPanel(podInfo, treeNode.ImageKey);
}
}
}
private void Pod_LaunchApplicationCompleted(object sender, ApplicationCompletedEventArgs e)
{
PodLaunchedOrKilled((PodInfo)sender, e.ApplicationId, wasKilled: false, e.Error != null);
}
private void Pod_KillApplicationCompleted(object sender, ApplicationCompletedEventArgs e)
{
PodLaunchedOrKilled((PodInfo)sender, e.ApplicationId, wasKilled: true, e.Error != null);
}
private void PodLaunchedOrKilled(PodInfo pod, Guid appId, bool wasKilled, bool failed)
{
DecrementActiveLaunchKillRequests();
if ((mActivePod == null || !(pod.Pod.ID == mActivePod.Pod.ID)) && (mActiveSquad == null || !mActiveSquad.Pods.Contains(pod.Pod)))
{
return;
}
if (wasKilled)
{
if (failed)
{
grdApps.StopAppFailed(appId, pod.Pod.Name);
}
else
{
grdApps.StopApp(pod.Pod.ID, appId);
}
}
else if (failed)
{
grdApps.StartAppFailed(appId, pod.Pod.Name);
}
else
{
grdApps.StartApp(pod.Pod.ID, appId);
}
}
private void picRefresh_Click(object sender, EventArgs e)
{
if (mActivePod != null)
{
RefreshAppList(mActivePod, forceRefresh: true);
}
else if (mActiveSquad != null)
{
RefreshAppList(mActiveSquad, forceRefresh: true);
}
}
private void cmnuTree_Opening(object sender, CancelEventArgs e)
{
cmnuTree.Items.Clear();
cmnuTree.Items.Add(mnuVolume);
cmnuTree.Items.Add(new ToolStripSeparator());
TreeNode selectedNode = tvSquadsNPods.SelectedNode;
if (selectedNode == null)
{
return;
}
if (selectedNode.Tag is Squad)
{
Squad squad = (Squad)selectedNode.Tag;
cmnuTree.Tag = squad;
mRestartAllPodsIn.Text = "Restart All Pods in " + squad.Name;
mShutdownAllPodsIn.Text = "Shutdown All Pods in " + squad.Name;
mRestartCheckedPodsIn.Text = "Restart Checked Pods in " + squad.Name;
mShutdownCheckedPodsIn.Text = "Shutdown Checked Pods in " + squad.Name;
cmnuTree.Items.Add(mRestartAllPodsIn);
cmnuTree.Items.Add(mShutdownAllPodsIn);
cmnuTree.Items.Add(mRestartCheckedPodsIn);
cmnuTree.Items.Add(mShutdownCheckedPodsIn);
cmnuTree.Items.Add(new ToolStripSeparator());
cmnuTree.Items.Add(mnuRemoveSquad);
}
else
{
if (!(selectedNode.Tag is PodInfo))
{
return;
}
PodInfo podInfo = (PodInfo)selectedNode.Tag;
cmnuTree.Tag = podInfo;
mRestartAllPodsIn.Text = "Restart " + podInfo.Pod.Name;
mShutdownAllPodsIn.Text = "Shutdown " + podInfo.Pod.Name;
cmnuTree.Items.Add(mRestartAllPodsIn);
cmnuTree.Items.Add(mShutdownAllPodsIn);
if (!podInfo.IsConnected)
{
return;
}
LaunchData[] allApplications = podInfo.AllApplications;
if (allApplications.Length > 0)
{
cmnuTree.Items.Add(new ToolStripSeparator());
LaunchData[] array = allApplications;
for (int i = 0; i < array.Length; i++)
{
LaunchData launchData = array[i];
bool flag = podInfo.IsAppRunning(launchData.LaunchPair.LaunchKey);
cmnuTree.Items.Add((flag ? "Stop " : "Start ") + launchData.LaunchPair.DisplayName, flag ? Resources.Stop : Resources.Play, cmnuApplicationItem_Click).Tag = new Tuple<bool, LaunchPair>(flag, launchData.LaunchPair);
}
}
}
}
private void mRestartAllPods_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateSite(checkedOnly: false), delegate(PodInfo pi)
{
pi.Shutdown(restart: true);
}, "Restarting All Pods");
}
private void mShutdownAllPods_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateSite(checkedOnly: false), delegate(PodInfo pi)
{
pi.Shutdown(restart: false);
}, "Shutting Down Pods");
}
private void mRestartAllCheckedPods_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateSite(checkedOnly: true), delegate(PodInfo pi)
{
pi.Shutdown(restart: true);
}, "Restarting Pods");
}
private void mShutdownAllCheckedPods_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateSite(checkedOnly: true), delegate(PodInfo pi)
{
pi.Shutdown(restart: false);
}, "Shutting Down Pods");
}
private void mRestartAllPodsIn_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateTreeTag(checkedOnly: false), delegate(PodInfo pi)
{
pi.Shutdown(restart: true);
}, "Restarting Pods");
}
private void mShutdownAllPodsIn_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateTreeTag(checkedOnly: false), delegate(PodInfo pi)
{
pi.Shutdown(restart: false);
}, "Shutting Down Pods");
}
private void mRestartCheckedPodsIn_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateTreeTag(checkedOnly: true), delegate(PodInfo pi)
{
pi.Shutdown(restart: true);
}, "Restarting Pods");
}
private void mShutdownCheckedPodsIn_Click(object sender, EventArgs e)
{
ConnectAndDo(EnumerateTreeTag(checkedOnly: true), delegate(PodInfo pi)
{
pi.Shutdown(restart: false);
}, "Shutting Down Pods");
}
private IEnumerable<PodInfo> EnumerateSite(bool checkedOnly)
{
foreach (Squad squad in TeslaConsole.Site.Active.Squads)
{
foreach (PodInfo item in EnumerateSquad(squad, checkedOnly))
{
yield return item;
}
}
}
private IEnumerable<PodInfo> EnumerateTreeTag(bool checkedOnly)
{
if (cmnuTree.Tag is Squad)
{
foreach (PodInfo item in EnumerateSquad((Squad)cmnuTree.Tag, checkedOnly))
{
yield return item;
}
yield break;
}
if (cmnuTree.Tag is PodInfo)
{
yield return (PodInfo)cmnuTree.Tag;
}
}
private IEnumerable<PodInfo> EnumerateSquad(Squad squad, bool checkedOnly)
{
if (!mSquadPodInfos.TryGetValue(squad.Guid, out var podInfos))
{
yield break;
}
foreach (PodInfo podInfo in podInfos)
{
if (!checkedOnly || podInfo.Pod.Online)
{
yield return podInfo;
}
}
}
private void ConnectAndDo(IEnumerable<PodInfo> podInfos, Action<PodInfo> action, string title)
{
List<PodInfo> list = new List<PodInfo>();
foreach (PodInfo podInfo in podInfos)
{
if (MakeChecked(podInfo, tvSquadsNPods.Nodes))
{
list.Add(podInfo);
}
}
PodActionDialog.Show(list, action, title);
}
private bool MakeChecked(PodInfo podInfo, TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
if (object.ReferenceEquals(node.Tag, podInfo))
{
if (!node.Checked)
{
node.Checked = true;
}
return true;
}
if (MakeChecked(podInfo, node.Nodes))
{
return true;
}
}
return false;
}
private void GetConnectedPodNodes(TreeNodeCollection nodes, List<TreeNode> connectedPods)
{
foreach (TreeNode node in nodes)
{
if (node.Tag is Squad)
{
GetConnectedPodNodes(node.Nodes, connectedPods);
continue;
}
PodInfo podInfo = (PodInfo)node.Tag;
if (podInfo.IsConnected)
{
connectedPods.Add(node);
}
}
}
private void mnuRemoveSquad_Click(object sender, EventArgs e)
{
if (tvSquadsNPods.SelectedNode != null)
{
Squad squad = (Squad)tvSquadsNPods.SelectedNode.Tag;
if (squad.Pods.Count == 0 || MessageBox.Show(this, "Removing this squad will remove the pods it contains as well. Are you sure you want to continue?", "Remove Squad", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
tvSquadsNPods.SelectedNode.Remove();
TeslaConsole.Site.Active.Squads.Remove(squad);
mSquadPodInfos.Remove(squad.Guid);
}
}
}
private void cmnuApplicationItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem toolStripMenuItem = sender as ToolStripMenuItem;
PodInfo podInfo = cmnuTree.Tag as PodInfo;
Tuple<bool, LaunchPair> tuple = (Tuple<bool, LaunchPair>)toolStripMenuItem.Tag;
if (tuple.A)
{
podInfo.KillApplicationAsync(tuple.B.LaunchKey, null);
toolStripMenuItem.Text = "Start " + tuple.B.DisplayName;
toolStripMenuItem.Image = Resources.Play;
return;
}
podInfo.LaunchApplicationAsync(tuple.B.LaunchKey, null);
toolStripMenuItem.Text = "Stop " + tuple.B.DisplayName;
toolStripMenuItem.Image = Resources.Stop;
if (tuple.B.LaunchKey == SiteManagement.RPAppGuid || tuple.B.LaunchKey == SiteManagement.MW4AppGuid)
{
podInfo.Pod.HostType = HostType.GameMachineHostType;
}
else if (tuple.B.LaunchKey == SiteManagement.RPLCAppGuid || tuple.B.LaunchKey == SiteManagement.RPMRAppGuid || tuple.B.LaunchKey == SiteManagement.MW4LCAppGuid)
{
podInfo.Pod.HostType = HostType.MissionReviewHostType;
}
}
private void mnuVolume_DropDownOpening(object sender, EventArgs e)
{
PodInfo podInfo = tvSquadsNPods.SelectedNode.Tag as PodInfo;
mnuVolume.DropDownItems.Clear();
if (podInfo == null)
{
mnuVolume.DropDownItems.AddRange(rVolumeItems);
return;
}
float volume = podInfo.Volume;
if (float.IsNaN(volume))
{
mnuVolume.DropDownItems.Add("There was a problem accessing the pod's volume.");
return;
}
int num = (int)(Math.Round((double)volume * 10.0, 0) * 10.0);
for (int i = 0; i < rVolumeItems.Length; i++)
{
mnuVolume.DropDownItems.Add(rVolumeItems[i]);
((ToolStripMenuItem)mnuVolume.DropDownItems[i]).Checked = i + 1 == num / 10;
}
}
private void tmrPodsCheck_Tick(object sender, EventArgs e)
{
foreach (TreeNode node in tvSquadsNPods.Nodes)
{
foreach (TreeNode node2 in node.Nodes)
{
PodInfo podInfo = node2.Tag as PodInfo;
if (node2.Checked && !podInfo.IsConnecting && !podInfo.IsConnected)
{
podInfo.ConnectAsync(node2);
}
}
}
}
private void tvSquadsNPods_ItemDrag(object sender, ItemDragEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
tvSquadsNPods.SelectedNode = null;
tvSquadsNPods.Tag = null;
DoDragDrop(e.Item, DragDropEffects.Move);
}
}
private void tvSquadsNPods_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.AllowedEffect;
}
private void tvSquadsNPods_DragOver(object sender, DragEventArgs e)
{
Point pt = tvSquadsNPods.PointToClient(new Point(e.X, e.Y));
TreeNode treeNode = e.Data.GetData(typeof(TreeNode)) as TreeNode;
TreeNode treeNode2 = tvSquadsNPods.Tag as TreeNode;
TreeNode nodeAt = tvSquadsNPods.GetNodeAt(pt);
e.Effect = DragDropEffects.None;
if (treeNode.Tag is PodInfo)
{
if (nodeAt != null)
{
e.Effect = e.AllowedEffect;
}
}
else if (treeNode.Tag is Squad && nodeAt != null && nodeAt.Tag is Squad)
{
e.Effect = e.AllowedEffect;
}
if (treeNode2 != nodeAt)
{
if (treeNode2 != null)
{
SetNodeFont(treeNode2, underline: false);
}
if (nodeAt != null)
{
SetNodeFont(nodeAt, underline: true);
}
tvSquadsNPods.Tag = nodeAt;
}
}
private void tvSquadsNPods_DragDrop(object sender, DragEventArgs e)
{
Point pt = tvSquadsNPods.PointToClient(new Point(e.X, e.Y));
TreeNode nodeAt = tvSquadsNPods.GetNodeAt(pt);
TreeNode treeNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
if (!treeNode.Equals(nodeAt) && e.Effect == DragDropEffects.Move)
{
if (treeNode.Tag is Squad)
{
Squad item = (Squad)treeNode.Tag;
Squad item2 = (Squad)nodeAt.Tag;
TeslaConsole.Site.Active.Squads.Remove(item);
treeNode.Remove();
TeslaConsole.Site.Active.Squads.Insert(TeslaConsole.Site.Active.Squads.IndexOf(item2) + 1, item);
tvSquadsNPods.Nodes.Insert(tvSquadsNPods.Nodes.IndexOf(nodeAt) + 1, treeNode);
}
else if (treeNode.Tag is PodInfo)
{
Pod pod = ((PodInfo)treeNode.Tag).Pod;
((Squad)treeNode.Parent.Tag).Pods.Remove(pod);
mSquadPodInfos[((Squad)treeNode.Parent.Tag).Guid].Remove((PodInfo)treeNode.Tag);
SetNodeFont(treeNode.Parent, underline: false);
treeNode.Remove();
if (nodeAt.Parent == null)
{
nodeAt.Nodes.Insert(0, treeNode);
((Squad)nodeAt.Tag).Pods.Insert(0, pod);
mSquadPodInfos[((Squad)nodeAt.Tag).Guid].Add((PodInfo)treeNode.Tag);
SetNodeFont(nodeAt, underline: false);
}
else
{
Pod pod2 = ((PodInfo)nodeAt.Tag).Pod;
Squad squad = (Squad)nodeAt.Parent.Tag;
nodeAt.Parent.Nodes.Insert(nodeAt.Parent.Nodes.IndexOf(nodeAt) + 1, treeNode);
squad.Pods.Insert(squad.Pods.IndexOf(pod2) + 1, pod);
mSquadPodInfos[squad.Guid].Add((PodInfo)treeNode.Tag);
SetNodeFont(nodeAt.Parent, underline: false);
}
}
tvSquadsNPods.SelectedNode = treeNode;
}
if (tvSquadsNPods.Tag != null)
{
((TreeNode)tvSquadsNPods.Tag).NodeFont = null;
}
}
private void tvSquadsNPods_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F2 && tvSquadsNPods.SelectedNode != null)
{
tvSquadsNPods.SelectedNode.BeginEdit();
}
}
}