private static void OnDataOpened(object sender, OpenReadCompletedEventArgs openReadCompletedEventArgs)
        {
            EventWaitHandle evt = openReadCompletedEventArgs.UserState as EventWaitHandle;
            if (openReadCompletedEventArgs.Error != null)
            {
                if (evt != null) evt.Set();
                return;
            }

            XmlSerializer deser = new XmlSerializer(typeof (XK3Y), new[] {typeof (Game), typeof (Directory)});
            XK3Y info = (XK3Y)deser.Deserialize(openReadCompletedEventArgs.Result);
            if (Information != null)
            {
                Information.TrayState = info.TrayState;
                Information.GuiState = info.GuiState;
                Information.Emergency = info.Emergency;
                Information.Active = info.Active;
                if (evt != null) evt.Set();
                return;
            }
            Information = info;

            // Set the game information to the source of the coverflow
            Games = new List<Game>();
            if (Information.Games.Hdds != null)
            {
                foreach (Hdd hdd in Information.Games.Hdds)
                {
                    if (hdd.DirectoryItems != null)
                    {
                        foreach (Directory directory in hdd.DirectoryItems.OfType<Directory>())
                        {
                            AddGames(directory);
                        }
                    }
                    if (hdd.Games != null) Games.AddRange(hdd.Games);
                }
            }
            GroupedGames = Games.ToGroupedOC(g => g.Key);
            DataLoaded = true;
            if (evt != null) evt.Set();
        }
        private static void ProcessString(string content)
        {
            XmlSerializer deser = new XmlSerializer(content.Contains("<XKEY>") ? typeof(XKEY) : typeof(PS3KEY), new[] { typeof(Game), typeof(Directory) });
            using (TextReader r = new StringReader(content))
            {
                K3Y info = (K3Y) deser.Deserialize(r);
                if (Information != null)
                {
                    Information.TrayState = info.TrayState;
                    Information.GuiState = info.GuiState;
                    Information.Emergency = info.Emergency;
                    Information.Active = info.Active;
                    return;
                }
                Information = info;

                // Set the game information to the source of the coverflow
                Games = new List<Game>();
                if (Information.Games.Hdds != null)
                {
                    foreach (Hdd hdd in Information.Games.Hdds)
                    {
                        if (hdd.DirectoryItems != null)
                        {
                            foreach (Directory directory in hdd.DirectoryItems.OfType<Directory>())
                            {
                                AddGames(directory);
                            }
                        }
                        if (hdd.Games != null) Games.AddRange(hdd.Games);
                    }
                }
                GroupedGames = Games.ToGroupedOC(g => g.Key);
                DataLoaded = true;
            }
        }