示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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());
            }
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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 { }
        }
示例#5
0
        /// <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;
                }
            }
        }
示例#6
0
        /// <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);
                }
            }
        }