/// <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> /// Reconnect our server /// </summary> /// <param name="ServerName"></param> private void ReconnectServer(Uri ServerName, Exception ex) { MM_Administrator_Types Admin = MMServerConnections[ServerName]; if (Admin.State == CommunicationState.Faulted || Admin.State == CommunicationState.Closed) { MMServerConnections[ServerName] = CreateProxy(ServerName.ToString()); } }
/// <summary> /// Create a new TCP proxy to our server /// </summary> /// <param name="Address"></param> /// <returns></returns> private MM_Administrator_Types CreateProxy(String Address) { NetTcpBinding tcpBinding = MM_Binding_Configuration.CreateBinding(); MM_AdministratorMessage_Types Callback = new MM_AdministratorMessage_Types(); MM_Administrator_Types OutComm = new MM_Administrator_Types(Callback.Context, tcpBinding, new EndpointAddress(Address)); Callback.Server = OutComm; return(OutComm); }
/// <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 { } }
/// <summary> /// Handle an EMS command /// </summary> /// <param name="Commands"></param> /// <param name="Server"></param> public void AddCommands(MM_EMS_Command[] Commands, MM_Administrator_Types Server) { if (btnCommandHistory.Owner.InvokeRequired) { btnCommandHistory.Owner.Invoke(new SafeAddCommands(AddCommands), Commands, Server); } else { foreach (MM_EMS_Command Command in Commands) { Command.Server = Server.ToString(); if (!Servers.ContainsKey(Server.ToString())) { Servers.Add(Server.ToString(), Server); cmbServer.Items.Add(Server.ToString()); if (cmbServer.SelectedIndex == -1) { cmbServer.SelectedIndex = 0; } } EMSCommands.Add(Command); } EMSCommands.Sort(); btnCommandHistory.Text = "Command History: " + EMSCommands.Count.ToString("#,##0"); //If our checkbox is checked, update the near and far dates DateTime FarDate = DateTime.Now.AddDays(5000); DateTime NearDate = DateTime.Now.AddDays(-5000); foreach (MM_EMS_Command Command in EMSCommands) { if (Command.IssuedOn < FarDate) { FarDate = Command.IssuedOn; } if (Command.IssuedOn > NearDate) { NearDate = Command.IssuedOn; } } if (dtStartTime.Checked) { dtStartTime.Value = FarDate; } if (dtEndTime.Checked) { dtEndTime.Value = NearDate; } } }
/// <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); } } }