示例#1
0
        /// <summary>
        /// Creates a AVC file from a json string.
        /// </summary>
        /// <returns>The new created AVCInfo object or null.</returns>
        public static AVCInfo ReadFromString(string jsonString)
        {
            AVCInfo avcInfo = new AVCInfo();
            JObject jObject = JObject.Parse(jsonString);

            avcInfo.Name         = GetString(jObject["NAME"]);
            avcInfo.Url          = GetString(jObject["URL"]);
            avcInfo.Download     = GetString(jObject["DOWNLOAD"]);
            avcInfo.ChangeLog    = GetString(jObject["CHANGE_LOG"]);
            avcInfo.ChangeLogUrl = GetString(jObject["CHANGE_LOG_URL"]);
            JToken jGitHub = jObject["GITHUB"];

            if (jGitHub != null)
            {
                avcInfo.GitHubUsername        = GetString(jGitHub["USERNAME"]);
                avcInfo.GitHubRepository      = GetString(jGitHub["REPOSITORY"]);
                avcInfo.GitHubAllowPreRelease = GetString(jGitHub["ALLOW_PRE_RELEASE"]).Equals(Constants.TRUE, StringComparison.CurrentCultureIgnoreCase);
            }
            avcInfo.Version       = GetVersion(jObject["VERSION"] as JToken);
            avcInfo.KspVersion    = GetVersion(jObject["KSP_VERSION"] as JToken, 3);
            avcInfo.KspVersionMin = GetVersion(jObject["KSP_VERSION_MIN"] as JToken, 3);
            avcInfo.KspVersionMax = GetVersion(jObject["KSP_VERSION_MAX"] as JToken, 3);

            return(avcInfo);
        }
示例#2
0
        /// <summary>
        /// Creates a AVC file from a json string.
        /// </summary>
        /// <returns>The new created AVCInfo object or null.</returns>
        public static AVCInfo ReadFromString(string jsonString)
        {
            AVCInfo avcInfo = new AVCInfo();
            JObject jObject = JObject.Parse(jsonString);
            avcInfo.Name = GetString(jObject["NAME"]);
            avcInfo.Url = GetString(jObject["URL"]);
            avcInfo.Download = GetString(jObject["DOWNLOAD"]);
            avcInfo.ChangeLog = GetString(jObject["CHANGE_LOG"]);
            avcInfo.ChangeLogUrl = GetString(jObject["CHANGE_LOG_URL"]);
            JToken jGitHub = jObject["GITHUB"];
            if (jGitHub != null)
            {
                avcInfo.GitHubUsername = GetString(jGitHub["USERNAME"]);
                avcInfo.GitHubRepository = GetString(jGitHub["REPOSITORY"]);
                avcInfo.GitHubAllowPreRelease = GetString(jGitHub["ALLOW_PRE_RELEASE"]).Equals(Constants.TRUE, StringComparison.CurrentCultureIgnoreCase);
            }
            avcInfo.Version = GetVersion(jObject["VERSION"] as JToken);
            avcInfo.KspVersion = GetVersion(jObject["KSP_VERSION"] as JToken, 3);
            avcInfo.KspVersionMin = GetVersion(jObject["KSP_VERSION_MIN"] as JToken, 3);
            avcInfo.KspVersionMax = GetVersion(jObject["KSP_VERSION_MAX"] as JToken, 3);

            return avcInfo;
        }
        /// <summary>
        /// Creates a tree of TreeNodeMod nodes that represent the content of a mod archive.
        /// </summary>
        /// <param name="modInfo">The ModInfo of the mod the create a tree for.</param>
        /// <param name="silent">Determines if info messages should be added.</param>
        /// <returns>A tree of TreeNodeMod nodes that represent the content of a mod archive.</returns>
        public static ModNode CreateModNode(ModInfo modInfo, bool silent = false)
        {
            if (File.Exists(modInfo.LocalPath))
            {
                // Get AVC version file informations.
                if (OptionsController.AVCSupportOnOff)
                {
                    AVCInfo avcInfo = TryReadAVCVersionFile(modInfo.LocalPath);
                    if (avcInfo != null)
                    {
                        ImportAvcInfo(avcInfo, ref modInfo);
                    }
                }

                // Still no name? Use filename then
                if (string.IsNullOrEmpty(modInfo.Name))
                {
                    modInfo.Name = Path.GetFileNameWithoutExtension(modInfo.LocalPath);
                }

                ModNode node = new ModNode(modInfo);
                using (IArchive archive = ArchiveFactory.Open(modInfo.LocalPath))
                {
                    char   seperator = '/';
                    string extension = Path.GetExtension(modInfo.LocalPath);
                    if (extension != null && extension.Equals(Constants.EXT_RAR, StringComparison.CurrentCultureIgnoreCase))
                    {
                        seperator = '\\';
                    }

                    // create a TreeNode for every archive entry
                    foreach (IArchiveEntry entry in archive.Entries)
                    {
                        CreateModNode(entry.FilePath, node, seperator, entry.IsDirectory, silent);
                    }
                }

                // Destination detection
                switch (OptionsController.DestinationDetectionType)
                {
                case DestinationDetectionType.SmartDetection:
                    // Find installation root node (first folder that contains (Parts or Plugins or ...)
                    if (!FindAndSetDestinationPaths(node) && !silent)
                    {
                        Messenger.AddInfo(string.Format(Messages.MSG_ROOT_NOT_FOUND_0, node.Text));
                    }

                    if (OptionsController.CopyToGameData)
                    {
                        if (!silent)
                        {
                            Messenger.AddInfo(string.Format(Messages.MSG_DESTINATION_0_SET_TO_GAMEDATA, node.Text));
                        }
                        SetDestinationPaths(node, KSPPathHelper.GetPath(KSPPaths.GameData));
                    }
                    break;

                case DestinationDetectionType.SimpleDump:
                    if (!silent)
                    {
                        Messenger.AddInfo(string.Format(Messages.MSG_DESTINATION_0_SET_TO_GAMEDATA, node.Text));
                    }
                    SetDestinationPaths(node, KSPPathHelper.GetPath(KSPPaths.GameData));
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                SetToolTips(node);
                CheckNodesWithDestination(node);

                return(node);
            }
            else
            {
                if (!silent)
                {
                    Messenger.AddInfo(string.Format(Messages.MSG_MOD_ZIP_NOT_FOUND_0, modInfo.LocalPath));
                }
            }

            return(null);
        }
        /// <summary>
        /// Copies Infos to the ModInfo.
        /// Try to find a compatible SiteHandler for the provided urls (like Download, URL, ChangeLogUrl, GitHub)
        /// </summary>
        private static void ImportAvcInfo(AVCInfo avcInfo, ref ModInfo modInfo)
        {
            Messenger.AddDebug(string.Format(Messages.MSG_IMPORTING_AVC_VERSIONFILE_INFO_0, modInfo.Name));

            string fileName = Path.GetFileNameWithoutExtension(modInfo.LocalPath);

            if (!OptionsController.AVCIgnoreName && !string.IsNullOrEmpty(avcInfo.Name) && (string.IsNullOrEmpty(modInfo.Name) || modInfo.Name == fileName))
            {
                modInfo.Name = avcInfo.Name;
            }
            if (!string.IsNullOrEmpty(avcInfo.Version) && (string.IsNullOrEmpty(modInfo.Version)))
            {
                modInfo.Version = avcInfo.Version;
            }
            if (!string.IsNullOrEmpty(avcInfo.KspVersion) && (string.IsNullOrEmpty(modInfo.KSPVersion)))
            {
                modInfo.KSPVersion = avcInfo.KspVersion;
            }

            if (!OptionsController.AVCIgnoreURL && !string.IsNullOrEmpty(avcInfo.Url) && (string.IsNullOrEmpty(modInfo.AvcURL)))
            {
                AVCInfo newAvcInfo = null;
                try
                {
                    // Get newest AVC informations for this mod.
                    newAvcInfo = AVCParser.ReadFromWeb(avcInfo.Url);
                }
                catch (Exception ex)
                {
                    Messenger.AddError(string.Format(Messages.MSG_ERROR_DOWNLOADING_NEW_AVC_VERION_FILE_FAILED), ex);
                }

                if (newAvcInfo != null)
                {
                    modInfo.AvcURL                = avcInfo.Url;
                    avcInfo.Download              = newAvcInfo.Download;
                    avcInfo.ChangeLog             = newAvcInfo.ChangeLog;
                    avcInfo.ChangeLogUrl          = newAvcInfo.ChangeLogUrl;
                    avcInfo.GitHubUsername        = newAvcInfo.GitHubUsername;
                    avcInfo.GitHubRepository      = newAvcInfo.GitHubRepository;
                    avcInfo.GitHubAllowPreRelease = newAvcInfo.GitHubAllowPreRelease;
                }
            }

            if (string.IsNullOrEmpty(modInfo.ModURL) && !modInfo.HasSiteHandler)
            {
                ISiteHandler siteHandler = null;
                string       downloadUrl = string.Empty;
                string[]     urls        = new[] { GitHubHandler.GetProjectUrl(avcInfo.GitHubUsername, avcInfo.GitHubRepository), avcInfo.Download, avcInfo.Url, avcInfo.ChangeLogUrl };
                foreach (string url in urls)
                {
                    downloadUrl = url;
                    siteHandler = SiteHandlerManager.GetSiteHandlerByURL(downloadUrl);

                    if (siteHandler != null)
                    {
                        break;
                    }
                }

                if (siteHandler != null)
                {
                    modInfo.ModURL          = downloadUrl;
                    modInfo.SiteHandlerName = siteHandler.Name;
                    Messenger.AddDebug(string.Format(Messages.MSG_COMPATIBLE_SITEHANDLER_0_FOUND_1, siteHandler.Name, modInfo.Name));
                }
                else
                {
                    Messenger.AddDebug(string.Format(Messages.MSG_NO_COMPATIBLE_SITEHANDLER_FOUND_0, modInfo.Name));
                }
            }
        }
        /// <summary>
        /// Copies Infos to the ModInfo.
        /// Try to find a compatible SiteHandler for the provided urls (like Download, URL, ChangeLogUrl, GitHub)
        /// </summary>
        private static void ImportAvcInfo(AVCInfo avcInfo, ref ModInfo modInfo)
        {
            Messenger.AddDebug(string.Format(Messages.MSG_IMPORTING_AVC_VERSIONFILE_INFO_0, modInfo.Name));

            string fileName = Path.GetFileNameWithoutExtension(modInfo.LocalPath);
            if (!OptionsController.AVCIgnoreName && !string.IsNullOrEmpty(avcInfo.Name) && (string.IsNullOrEmpty(modInfo.Name) || modInfo.Name == fileName))
                modInfo.Name = avcInfo.Name;
            if (!string.IsNullOrEmpty(avcInfo.Version) && (string.IsNullOrEmpty(modInfo.Version)))
                modInfo.Version = avcInfo.Version;
            if (!string.IsNullOrEmpty(avcInfo.KspVersion) && (string.IsNullOrEmpty(modInfo.KSPVersion)))
                modInfo.KSPVersion = avcInfo.KspVersion;

            if (!OptionsController.AVCIgnoreURL && !string.IsNullOrEmpty(avcInfo.Url) && (string.IsNullOrEmpty(modInfo.AvcURL)))
            {
                AVCInfo newAvcInfo = null;
                try
                {
                    // Get newest AVC informations for this mod.
                    newAvcInfo = AVCParser.ReadFromWeb(avcInfo.Url);
                }
                catch (Exception ex)
                {
                    Messenger.AddError(string.Format(Messages.MSG_ERROR_DOWNLOADING_NEW_AVC_VERION_FILE_FAILED), ex);
                }

                if (newAvcInfo != null)
                {
                    modInfo.AvcURL = avcInfo.Url;
                    avcInfo.Download = newAvcInfo.Download;
                    avcInfo.ChangeLog = newAvcInfo.ChangeLog;
                    avcInfo.ChangeLogUrl = newAvcInfo.ChangeLogUrl;
                    avcInfo.GitHubUsername = newAvcInfo.GitHubUsername;
                    avcInfo.GitHubRepository = newAvcInfo.GitHubRepository;
                    avcInfo.GitHubAllowPreRelease = newAvcInfo.GitHubAllowPreRelease;
                }
            }

            if (string.IsNullOrEmpty(modInfo.ModURL) && !modInfo.HasSiteHandler)
            {
                ISiteHandler siteHandler = null;
                string downloadUrl = string.Empty;
                string[] urls = new[] { GitHubHandler.GetProjectUrl(avcInfo.GitHubUsername, avcInfo.GitHubRepository), avcInfo.Download, avcInfo.Url, avcInfo.ChangeLogUrl };
                foreach (string url in urls)
                {
                    downloadUrl = url;
                    siteHandler = SiteHandlerManager.GetSiteHandlerByURL(downloadUrl);

                    if (siteHandler != null)
                        break;
                }

                if (siteHandler != null)
                {
                    modInfo.ModURL = downloadUrl;
                    modInfo.SiteHandlerName = siteHandler.Name;
                    Messenger.AddDebug(string.Format(Messages.MSG_COMPATIBLE_SITEHANDLER_0_FOUND_1, siteHandler.Name, modInfo.Name));
                }
                else
                    Messenger.AddDebug(string.Format(Messages.MSG_NO_COMPATIBLE_SITEHANDLER_FOUND_0, modInfo.Name));
            }
        }