/// <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 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)); } }