/// <summary> /// Writes the file represented by the given byte array to the given path. /// </summary> /// <remarks> /// This method writes the given data as a file at the given path, if it is owned /// by the mod being upgraded. If the specified data file is not owned by the mod /// being upgraded, the file is instead written to the overwrites directory. /// /// If the file was not previously installed by the mod, then the normal install rules apply, /// including confirming overwrite if applicable. /// </remarks> /// <param name="p_strPath">The path where the file is to be created.</param> /// <param name="p_bteData">The data that is to make up the file.</param> /// <param name="p_booSecondaryInstallPath">Whether to use the secondary install path.</param> /// <returns><c>true</c> if the file was written; <c>false</c> if the user chose /// not to overwrite an existing file.</returns> /// <exception cref="IllegalFilePathException">Thrown if <paramref name="p_strPath"/> is /// not safe.</exception> public override bool GenerateDataFile(string p_strPath, byte[] p_bteData, bool p_booSecondaryInstallPath) { DataFileUtility.AssertFilePathIsSafe(p_strPath); string strInstallFilePath = Path.Combine(GameModeInfo.InstallationPath, p_strPath); IList <IMod> lstInstallers = InstallLog.GetFileInstallers(p_strPath); if (lstInstallers.Contains(Mod, ModComparer.Filename)) { string strWritePath = null; if (!ModComparer.Filename.Equals(lstInstallers[lstInstallers.Count - 1], Mod)) { string strDirectory = Path.GetDirectoryName(p_strPath); string strBackupPath = Path.Combine(GameModeInfo.OverwriteDirectory, strDirectory); string strOldModKey = InstallLog.GetModKey(Mod); string strFile = strOldModKey + "_" + Path.GetFileName(p_strPath); strWritePath = Path.Combine(strBackupPath, strFile); } else { strWritePath = strInstallFilePath; } TransactionalFileManager.WriteAllBytes(strWritePath, p_bteData); OriginallyInstalledFiles.Remove(p_strPath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar)); return(true); } return(base.GenerateDataFile(p_strPath, p_bteData, false)); }
/// <summary> /// Writes the file represented by the given byte array to the given path. /// </summary> /// <remarks> /// This method writes the given data as a file at the given path. If the file /// already exists the user is prompted to overwrite the file. /// </remarks> /// <param name="p_strPath">The path where the file is to be created.</param> /// <param name="p_bteData">The data that is to make up the file.</param> /// <returns><c>true</c> if the file was written; <c>false</c> if the user chose /// not to overwrite an existing file.</returns> /// <exception cref="IllegalFilePathException">Thrown if <paramref name="p_strPath"/> is /// not safe.</exception> public virtual bool GenerateDataFile(string p_strPath, byte[] p_bteData) { string strInstallFilePath = p_strPath; if (!Directory.Exists(Path.GetDirectoryName(strInstallFilePath))) { TransactionalFileManager.CreateDirectory(Path.GetDirectoryName(strInstallFilePath)); } else { if (!TestDoOverwrite(p_strPath)) { return(false); } } TransactionalFileManager.WriteAllBytes(strInstallFilePath, p_bteData); InstallLog.AddDataFile(Mod, p_strPath); return(true); }
/// <summary> /// Writes the file represented by the given byte array to the given path. /// </summary> /// <remarks> /// This method writes the given data as a file at the given path. If the file /// already exists the user is prompted to overwrite the file. /// </remarks> /// <param name="p_strPath">The path where the file is to be created.</param> /// <param name="p_bteData">The data that is to make up the file.</param> /// <returns><c>true</c> if the file was written; <c>false</c> if the user chose /// not to overwrite an existing file.</returns> /// <exception cref="IllegalFilePathException">Thrown if <paramref name="p_strPath"/> is /// not safe.</exception> public virtual bool GenerateDataFile(string p_strPath, byte[] p_bteData) { DataFileUtility.AssertFilePathIsSafe(p_strPath); string[] components = p_strPath.Split(Path.DirectorySeparatorChar); p_strPath = string.Join("" + Path.DirectorySeparatorChar, components.Skip(1).Take(components.Length - 1).ToArray()); string strInstallFilePath = installPath(p_strPath); //string strInstallFilePath = null; //strInstallFilePath = Path.Combine(GameModeInfo.InstallationPath, p_strPath); string installDirPath = Path.GetDirectoryName(strInstallFilePath); FileInfo Info = new FileInfo(strInstallFilePath); if (!Directory.Exists(installDirPath)) { CreateDirectory(installDirPath); } else { if (!TestDoOverwrite(p_strPath)) { return(false); } if (File.Exists(strInstallFilePath)) { if (Info.IsReadOnly == true) { File.SetAttributes(strInstallFilePath, File.GetAttributes(strInstallFilePath) & ~FileAttributes.ReadOnly); } string strInstallDirectory = Path.GetDirectoryName(p_strPath); string strBackupDirectory = Path.Combine(GameModeInfo.OverwriteDirectory, strInstallDirectory); string strOldModKey = InstallLog.GetCurrentFileOwnerKey(p_strPath); if (strOldModKey == null) { InstallLog.LogOriginalDataFile(p_strPath); strOldModKey = InstallLog.OriginalValuesKey; } string strInstallingModKey = InstallLog.GetModKey(Mod); //if this mod has installed this file already we just replace it and don't // need to back it up. if (!strOldModKey.Equals(strInstallingModKey)) { //back up the current version of the file if the current mod // didn't install it if (!Directory.Exists(strBackupDirectory)) { CreateDirectory(strBackupDirectory); } //we get the file name this way in order to preserve the file name's case string strFile = Path.GetFileName(Directory.GetFiles(installDirPath, Path.GetFileName(strInstallFilePath))[0]); strFile = strOldModKey + "_" + strFile; string strBackupFilePath = Path.Combine(strBackupDirectory, strFile); Info = new FileInfo(strBackupFilePath); if ((Info.IsReadOnly == true) && (File.Exists(strBackupFilePath))) { File.SetAttributes(strBackupFilePath, File.GetAttributes(strBackupFilePath) & ~FileAttributes.ReadOnly); } TransactionalFileManager.Copy(strInstallFilePath, strBackupFilePath, true); } TransactionalFileManager.Delete(strInstallFilePath); } } TransactionalFileManager.WriteAllBytes(strInstallFilePath, p_bteData); // Checks whether the file is a gamebryo plugin if (IsPlugin) { if (PluginManager.IsActivatiblePluginFile(strInstallFilePath)) { PluginManager.AddPlugin(strInstallFilePath); } } InstallLog.AddDataFile(Mod, p_strPath); return(IsPlugin); }
/// <summary> /// Writes the file represented by the given byte array to the given path. /// </summary> /// <remarks> /// This method writes the given data as a file at the given path. If the file /// already exists the user is prompted to overwrite the file. /// </remarks> /// <param name="p_strPath">The path where the file is to be created.</param> /// <param name="p_bteData">The data that is to make up the file.</param> /// <param name="p_booSecondaryInstallPath">Whether to use the secondary install path.</param> /// <returns><c>true</c> if the file was written; <c>false</c> if the user chose /// not to overwrite an existing file.</returns> /// <exception cref="IllegalFilePathException">Thrown if <paramref name="p_strPath"/> is /// not safe.</exception> public virtual bool GenerateDataFile(string p_strPath, byte[] p_bteData, bool p_booSecondaryInstallPath) { DataFileUtility.AssertFilePathIsSafe(p_strPath); string strInstallFilePath = String.Empty; if (p_booSecondaryInstallPath && !(String.IsNullOrEmpty(GameModeInfo.SecondaryInstallationPath))) { strInstallFilePath = Path.Combine(GameModeInfo.SecondaryInstallationPath, p_strPath); } else { strInstallFilePath = Path.Combine(GameModeInfo.InstallationPath, p_strPath); } FileInfo Info = new FileInfo(strInstallFilePath); if (!Directory.Exists(Path.GetDirectoryName(strInstallFilePath))) { TransactionalFileManager.CreateDirectory(Path.GetDirectoryName(strInstallFilePath)); } else { if (!TestDoOverwrite(p_strPath)) { return(false); } if (File.Exists(strInstallFilePath)) { if (Info.IsReadOnly == true) { File.SetAttributes(strInstallFilePath, File.GetAttributes(strInstallFilePath) & ~FileAttributes.ReadOnly); } string strInstallDirectory = Path.GetDirectoryName(p_strPath); string strBackupDirectory = Path.Combine(GameModeInfo.OverwriteDirectory, strInstallDirectory); string strOldModKey = InstallLog.GetCurrentFileOwnerKey(p_strPath); if (strOldModKey == null) { InstallLog.LogOriginalDataFile(p_strPath); strOldModKey = InstallLog.OriginalValuesKey; } string strInstallingModKey = InstallLog.GetModKey(Mod); //if this mod has installed this file already we just replace it and don't // need to back it up. if (!strOldModKey.Equals(strInstallingModKey)) { //back up the current version of the file if the current mod // didn't install it if (!Directory.Exists(strBackupDirectory)) { TransactionalFileManager.CreateDirectory(strBackupDirectory); } //we get the file name this way in order to preserve the file name's case string strFile = Path.GetFileName(Directory.GetFiles(Path.GetDirectoryName(strInstallFilePath), Path.GetFileName(strInstallFilePath))[0]); strFile = strOldModKey + "_" + strFile; string strBackupFilePath = Path.Combine(strBackupDirectory, strFile); Info = new FileInfo(strBackupFilePath); if ((Info.IsReadOnly == true) && (File.Exists(strBackupFilePath))) { File.SetAttributes(strBackupFilePath, File.GetAttributes(strBackupFilePath) & ~FileAttributes.ReadOnly); } TransactionalFileManager.Copy(strInstallFilePath, strBackupFilePath, true); } TransactionalFileManager.Delete(strInstallFilePath); } } TransactionalFileManager.WriteAllBytes(strInstallFilePath, p_bteData); // Checks whether the file is a gamebryo plugin if (IsPlugin) { if (PluginManager.IsActivatiblePluginFile(strInstallFilePath)) { if (!PluginManager.CanActivatePlugins()) { string strTooManyPlugins = String.Format("The requested change to the active plugins list would result in over {0} plugins being active.", PluginManager.MaxAllowedActivePluginsCount); strTooManyPlugins += Environment.NewLine + String.Format("The current game doesn't support more than {0} active plugins, you need to disable at least one plugin to continue.", PluginManager.MaxAllowedActivePluginsCount); strTooManyPlugins += Environment.NewLine + Environment.NewLine + String.Format("NOTE: This is a game engine limitation.") + Environment.NewLine; throw new Exception(strTooManyPlugins); } PluginManager.AddPlugin(strInstallFilePath); } } InstallLog.AddDataFile(Mod, p_strPath); return(IsPlugin); }