public static CompressAndSave ( Stream uncompressedPcc, string pccFileName ) : void | ||
uncompressedPcc | Stream | uncompressed pcc stream. |
pccFileName | string | pcc file name to save. |
return | void |
/// <summary> /// save PCCObject to file by reconstruction from data /// </summary> /// <param name="path">full path + file name.</param> /// <param name="compress">true if you want a zlib compressed pcc file.</param> public void saveByReconstructing(string path, bool compress) { try { IsCompressed = false; MemoryStream m = new MemoryStream(); m.WriteBytes(header); //name table NameOffset = (int)m.Position; NameCount = names.Count; foreach (string s in names) { m.WriteStringUnicode(s); } //import table ImportOffset = (int)m.Position; ImportCount = imports.Count; foreach (ImportEntry e in imports) { m.WriteBytes(e.Header); } //export table ExportOffset = (int)m.Position; ExportCount = exports.Count; foreach (IExportEntry e in exports) { e.headerOffset = (uint)m.Position; m.WriteBytes(e.Header); } //freezone int FreeZoneSize = FreeZoneEnd - FreeZoneStart; FreeZoneStart = (int)m.Position; m.WriteBytes(new byte[FreeZoneSize]); FreeZoneEnd = expDataBegOffset = (int)m.Position; //export data foreach (IExportEntry e in exports) { e.DataOffset = (int)m.Position; e.DataSize = e.Data.Length; UpdateOffsets(e); m.WriteBytes(e.Data); //update size and offset in already-written header long pos = m.Position; m.Seek(e.headerOffset + 32, SeekOrigin.Begin); m.WriteValueS32(e.DataSize); m.WriteValueS32(e.DataOffset); m.Seek(pos, SeekOrigin.Begin); } //update header m.Seek(0, SeekOrigin.Begin); m.WriteBytes(header); if (compress) { CompressionHelper.CompressAndSave(m, path); } else { File.WriteAllBytes(path, m.ToArray()); } AfterSave(); } catch (Exception ex) { MessageBox.Show("PCC Save error:\n" + ex.Message); } }
/// <summary> /// save PCCObject to file by reconstruction from data /// </summary> /// <param name="path">full path + file name.</param> /// <param name="compress">true if you want a zlib compressed pcc file.</param> public void saveByReconstructing(string path, bool compress) { try { this.IsCompressed = false; MemoryStream m = new MemoryStream(); m.WriteBytes(header); //name table NameOffset = (int)m.Position; NameCount = names.Count; foreach (string s in names) { string text = s; if (!text.EndsWith("\0")) { text += "\0"; } m.WriteValueS32(-text.Length); foreach (char c in text) { m.WriteByte((byte)c); m.WriteByte(0); } } //import table ImportOffset = (int)m.Position; ImportCount = imports.Count; foreach (ImportEntry e in imports) { m.WriteBytes(e.header); } //export table ExportOffset = (int)m.Position; ExportCount = exports.Count; for (int i = 0; i < exports.Count; i++) { ME3ExportEntry e = exports[i]; e.headerOffset = (uint)m.Position; m.WriteBytes(e.header); } //freezone int FreeZoneSize = FreeZoneEnd - FreeZoneStart; FreeZoneStart = (int)m.Position; m.Write(new byte[FreeZoneSize], 0, FreeZoneSize); FreeZoneEnd = expDataBegOffset = (int)m.Position; //export data for (int i = 0; i < exports.Count; i++) { ME3ExportEntry e = exports[i]; e.DataOffset = (int)m.Position; e.DataSize = e.Data.Length; //update offsets for pcc-stored audio in wwisestreams if (e.ClassName == "WwiseStream" && e.GetProperty <NameProperty>("Filename") == null) { byte[] binData = e.getBinaryData(); binData.OverwriteRange(12, BitConverter.GetBytes(e.DataOffset + e.propsEnd() + 16)); e.setBinaryData(binData); } m.WriteBytes(e.Data); long pos = m.Position; m.Seek(e.headerOffset + 32, SeekOrigin.Begin); m.WriteValueS32(e.DataSize); m.WriteValueS32(e.DataOffset); m.Seek(pos, SeekOrigin.Begin); } //update header m.Seek(0, SeekOrigin.Begin); m.WriteBytes(header); if (compress) { CompressionHelper.CompressAndSave(m, path); } else { File.WriteAllBytes(path, m.ToArray()); } AfterSave(); } catch (Exception ex) { MessageBox.Show("PCC Save error:\n" + ex.Message); } }