/// <summary> /// Handle a column click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lvMacomberMapServers_ColumnClick(object sender, ColumnClickEventArgs e) { ServerLinkedColumnHeader col = lvMacomberMapServers.Columns[e.Column] as ServerLinkedColumnHeader; if (col == null) { return; } cmsSystemInteraction.Items.Clear(); cmsSystemInteraction.Items.Add("Server " + col.Uri.Host + ":" + col.Uri.Port).Enabled = false; if (col.SysInfo != null) { cmsSystemInteraction.Items.Add("Server process memory: " + col.SysInfo.SystemFreeMemory.ToString("#,##0")).Enabled = false; cmsSystemInteraction.Items.Add("Free memory: " + col.SysInfo.SystemFreeMemory.ToString("#,##0")).Enabled = false; } cmsSystemInteraction.Items.Add("-"); cmsSystemInteraction.Items.Add("Change Server Description").Tag = col; cmsSystemInteraction.Items.Add("-"); cmsSystemInteraction.Items.Add("Generate server savecase").Tag = col; cmsSystemInteraction.Items.Add("Load server savecase").Tag = col; cmsSystemInteraction.Items.Add("-"); if (Environment.UserName.ToLower().Contains("legat")) { cmsSystemInteraction.Items.Add("Stress test clients ON").Tag = col; cmsSystemInteraction.Items.Add("Stress test clients OFF").Tag = col; cmsSystemInteraction.Items.Add("-"); } cmsSystemInteraction.Items.Add("Send a message to all users").Tag = col; cmsSystemInteraction.Items.Add("Force all user logoff").Tag = col; cmsSystemInteraction.Show(Cursor.Position); }
/// <summary> /// This thread-safe object goes through all the servers, pulling in values /// </summary> /// <param name="state"></param> private void ServerInformationUpdater(object state) { while (true) { foreach (Uri ServerURI in MMServerConnections.Keys.ToArray()) { MM_Administrator_Types Client = MMServerConnections[ServerURI]; ServerLinkedColumnHeader TargetCol = MMServers[ServerURI]; if (Client.State == CommunicationState.Opening) { SetColor(TargetCol, Color.Yellow); } else if (Client.State == CommunicationState.Faulted || Client.State == CommunicationState.Closed || Client.State == CommunicationState.Closing) { SetColor(TargetCol, Color.Red); } else { try { TargetCol.SysInfo = Client.GetSystemInformation(); TargetCol.Users = Client.GetUserInformation(); } catch (Exception ex) { SetColor(TargetCol, Color.Red); } } } Thread.Sleep(1000); } }
/// <summary> /// Handle an input UDP message /// </summary> /// <param name="remoteEndPoint"></param> /// <param name="splStr"></param> private void HandleUDPMessage(IPEndPoint remoteEndPoint, string[] splStr) { try { if (IsDisposed || Disposing) { return; } else if (InvokeRequired) { Invoke(new SafeHandleUDPMessage(HandleUDPMessage), remoteEndPoint, splStr); } else { Uri TargetUri = new Uri(splStr[3]); ServerLinkedColumnHeader TargetCol; if (!MMServers.TryGetValue(TargetUri, out TargetCol)) { TargetCol = new ServerLinkedColumnHeader(splStr[2], TargetUri, null); lvMacomberMapServers.Columns.Add(TargetCol); MMServers.Add(TargetUri, TargetCol); foreach (ListViewItem lvI in lvMacomberMapServers.Items) { lvI.SubItems.Add("").Tag = DateTime.Now; } lvMacomberMapServers.Items[0].SubItems[TargetCol.Index].Text = splStr.Length == 5 ? "(null)" : splStr[5]; lvMacomberMapServers.Items[1].SubItems[TargetCol.Index].Text = splStr[4] + " users"; lvMacomberMapServers.Items[2].SubItems[TargetCol.Index].Text = splStr[1]; MM_Administrator_Types AdminClient = CreateProxy(TargetUri.ToString().Replace("MacomberMapWCFService", "MacomberMapAdministratorInterface")); MMServerConnections.Add(TargetUri, AdminClient); AdminClient.RegisterCallback(); frm_Command_Information.Instance.AddCommands(AdminClient.GetEMSCommands(), AdminClient); lvMacomberMapServers.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); } else { MM_Administrator_Types Proxy = MMServerConnections[TargetUri]; if (Proxy.State == CommunicationState.Faulted || Proxy.State == CommunicationState.Closing || Proxy.State == CommunicationState.Closed) { MMServerConnections[TargetUri] = CreateProxy(TargetUri.ToString().Replace("MacomberMapWCFService", "MacomberMapAdministratorInterface")); for (int a = 4; a < lvMacomberMapServers.Items.Count; a++) { lvMacomberMapServers.Items[a].SubItems[MMServers[TargetUri].Index].Tag = DateTime.Now; } } lvMacomberMapServers.Items[0].SubItems[TargetCol.Index].Text = splStr.Length == 5 ? "(null)" : splStr[5]; lvMacomberMapServers.Items[1].SubItems[TargetCol.Index].Text = splStr[4] + " users"; lvMacomberMapServers.Items[2].SubItems[TargetCol.Index].Text = splStr[1]; } } } catch { } }
private void SetColor(ServerLinkedColumnHeader Column, Color TargetColor) { if (InvokeRequired) { lvMacomberMapServers.Invoke(new SafeSetColor(SetColor), Column, TargetColor); } else { for (int a = 3; a < lvMacomberMapServers.Items.Count; a++) { lvMacomberMapServers.Items[a].SubItems[Column.Index].ForeColor = TargetColor; } } }
/// <summary> /// Handle a menu item click /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void cmsSystemInteraction_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { cmsSystemInteraction.Close(); if (e.ClickedItem.Tag is KeyValuePair <Uri, MM_User> ) { KeyValuePair <Uri, MM_User> User = (KeyValuePair <Uri, MM_User>)e.ClickedItem.Tag; IMM_Administrator_Types AdminConn = MMServerConnections[User.Key]; if (e.ClickedItem.Text == "Send a message to user") { using (MM_Input_Box InputBox = new MM_Input_Box()) if (InputBox.ShowDialog(this, "Please enter the message to send to " + User.Value.UserName, Application.ProductName) == DialogResult.OK) { AdminConn.SendMessage(User.Value, InputBox.Message, Environment.UserName + " on " + Environment.MachineName, InputBox.TargetIcon); } } else if (e.ClickedItem.Text == "Force user logoff" && MessageBox.Show("Are you sure you want to log off " + User.Value.UserName + " from " + User.Key.Host + "?", Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { AdminConn.CloseClient(User.Value); } } else if (e.ClickedItem.Tag is ServerLinkedColumnHeader) { ServerLinkedColumnHeader Server = (ServerLinkedColumnHeader)e.ClickedItem.Tag; IMM_Administrator_Types Admin = MMServerConnections[Server.Uri]; if (e.ClickedItem.Text == "Send a message to all users") { using (MM_Input_Box InputBox = new MM_Input_Box()) if (InputBox.ShowDialog(this, "Please enter the message to send to all users on server " + Server.Uri.Host, Application.ProductName) == DialogResult.OK) { Admin.SendMessageToAllClients(InputBox.Message, Environment.UserName + " on " + Environment.MachineName, InputBox.TargetIcon); } } else if (e.ClickedItem.Text == "Force all user logoff" && MessageBox.Show("Are you sure you want to log off all users on server " + Server.Uri.Host + "?", Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { Admin.CloseAllClients(); } else if (e.ClickedItem.Text == "Generate server savecase") { using (SaveFileDialog sFd = new SaveFileDialog() { Title = "Macomber Map Server Savecase Generation", Filter = "MM Server Savecase (*.MM_Savecase)|*.MM_Savecase" }) if (sFd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { using (FileStream fsOut = new FileStream(sFd.FileName, FileMode.Create)) { MM_Savecase Savecase = Admin.GenerateSavecase(); DataContractSerializer dcs = new DataContractSerializer(typeof(MM_Savecase)); XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateBinaryWriter(fsOut); dcs.WriteObject(xdw, Savecase); xdw.Flush(); } } } else if (e.ClickedItem.Text == "Load server savecase") { using (OpenFileDialog oFd = new OpenFileDialog() { Title = "Macomber Map Server Savecase Generation", Filter = "MM Server Savecase (*.MM_Savecase)|*.MM_Savecase" }) if (oFd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { using (FileStream fsIn = new FileStream(oFd.FileName, FileMode.Open)) { DataContractSerializer dcs = new DataContractSerializer(typeof(MM_Savecase)); XmlDictionaryReader xrd = XmlDictionaryReader.CreateBinaryReader(fsIn, new XmlDictionaryReaderQuotas()); MM_Savecase Savecase = (MM_Savecase)dcs.ReadObject(xrd); Admin.ApplySavecase(Savecase); } } } else if (e.ClickedItem.Text.StartsWith("Stress test clients")) { Admin.SetServerClientStressTest(e.ClickedItem.Text.EndsWith("ON")); } else if (e.ClickedItem.Text == "Change Server Description") { using (MM_Input_Box InputBox = new MM_Input_Box() { Message = lvMacomberMapServers.Items[0].SubItems[Server.Index].Text }) if (InputBox.ShowDialog(this, "Please enter the updated server description", Application.ProductName) == DialogResult.OK) { Admin.SetServerDescription(InputBox.Message); } } } }
/// <summary> /// For all of our connected servers, determine our user information /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tmrUpdateUserInfo_Tick(object sender, EventArgs e) { //Create our total list of users Dictionary <Guid, bool> ToRemove = new Dictionary <Guid, bool>(); foreach (Guid guid in MMServerUsers.Keys) { ToRemove.Add(guid, true); } foreach (Uri ServerURI in MMServerConnections.Keys.ToArray()) { MM_Administrator_Types Client = MMServerConnections[ServerURI]; ServerLinkedColumnHeader TargetCol = MMServers[ServerURI]; if (Client.State == CommunicationState.Opened && TargetCol.SysInfo != null && TargetCol.Users != null) { for (int a = 4; a < lvMacomberMapServers.Items.Count; a++) { ListViewItem lvI = lvMacomberMapServers.Items[a]; PropertyInfo pI = (PropertyInfo)lvI.Tag; UpdateProperty(lvI.SubItems[TargetCol.Index], pI.GetValue(TargetCol.SysInfo), lvI.Text); } //Update the users, removing any disconnected ones foreach (MM_User User in TargetCol.Users) { ListViewItem lvUser; if (!MMServerUsers.TryGetValue(User.UserId, out lvUser)) { MMServerUsers.Add(User.UserId, lvUser = lvUsers.Items.Add(ServerURI.Host + ":" + ServerURI.Port.ToString())); lvUser.Tag = new KeyValuePair <Uri, MM_User>(ServerURI, User); lvUser.UseItemStyleForSubItems = false; for (int a = 1; a < lvUsers.Columns.Count; a++) { lvUser.SubItems.Add(GetReadableString(((PropertyInfo)lvUsers.Columns[a].Tag).GetValue(User))).Tag = DateTime.Now; } } else { ToRemove.Remove(User.UserId); for (int a = 1; a < lvUsers.Columns.Count; a++) { UpdateProperty(lvUser.SubItems[a], ((PropertyInfo)lvUsers.Columns[a].Tag).GetValue(User), lvUsers.Columns[a].Text); } } } } else if (Client.State == CommunicationState.Faulted || Client.State == CommunicationState.Closing || Client.State == CommunicationState.Closed) { foreach (ListViewItem lvI in lvUsers.Items) { KeyValuePair <Uri, MM_User> kvp = (KeyValuePair <Uri, MM_User>)lvI.Tag; if (kvp.Key == ServerURI) { lvI.ForeColor = Color.Red; ToRemove.Remove(kvp.Value.UserId); } } } } //Now, remove all users not found ListViewItem FoundItem; foreach (Guid guid in ToRemove.Keys) { if (MMServerUsers.TryGetValue(guid, out FoundItem)) { lvUsers.Items.Remove(FoundItem); MMServerUsers.Remove(guid); } } }