protected virtual ContentWriteInfo WriteNotLoadedContentFiles( Stream source, Stream target, uint contentOffset, IEnumerable <ProxyContentFile> contentFiles, CancellationToken token) { ContentWriteInfo info = new ContentWriteInfo(); target.Seek(contentOffset, SeekOrigin.Begin); var writtenContentFiles = new Dictionary <String, ProxyContentFile>(); foreach (var file in contentFiles) { uint originalFileLength = file.Length; uint originalFileOffset = file.Offset; uint originalTotalOffset = file.TotalOffset; var thisContentKey = originalFileLength.ToString() + originalFileOffset.ToString(); bool canReferenceWrittenContent = writtenContentFiles.ContainsKey(thisContentKey) && !file.IsCustomContentLoaded; if (canReferenceWrittenContent) { var matchingWrittenContent = writtenContentFiles[thisContentKey]; file.Length = matchingWrittenContent.Length; file.Offset = matchingWrittenContent.Offset; file.TotalOffset = file.Offset + contentOffset; } else { file.Offset = (uint)target.Position - contentOffset; file.TotalOffset = file.Offset + contentOffset; byte[] fileBuffer; if (file.IsContentLoaded) { fileBuffer = file.Content; file.Length = (uint)file.Content.Length; } else { fileBuffer = new byte[file.Length]; source.Seek(originalTotalOffset, SeekOrigin.Begin); source.Read(fileBuffer, 0, fileBuffer.Length); } target.Write(fileBuffer, 0, fileBuffer.Length); info.Length += (uint)fileBuffer.Length; writtenContentFiles.Add(thisContentKey, file); } token.ThrowIfCancellationRequested(); } return(info); }
/// <summary> /// /// </summary> /// <param name="target"></param> /// <param name="contentFiles"></param> /// <param name="contentOffset"></param> /// <returns></returns> protected virtual ContentWriteInfo WriteLoadedContent( Stream target, IEnumerable <EdataContentFile> contentFiles, uint contentOffset, CancellationToken token) { ContentWriteInfo info = new ContentWriteInfo(); //Dodane, spr: target.Seek(contentOffset, SeekOrigin.Begin); byte[] spaceBuffer = null; foreach (var file in contentFiles) { byte[] fileBuffer = file.Content; file.Checksum = MD5.Create().ComputeHash(fileBuffer); file.Length = file.Content.Length; file.Offset = target.Position - contentOffset; long spaceSize = GetSpaceSizeForFile(file); spaceBuffer = GetNewBufferIfNeeded(spaceBuffer, spaceSize); target.Write(fileBuffer, 0, fileBuffer.Length); target.Write(spaceBuffer, 0, (int)spaceSize); info.Length += (uint)fileBuffer.Length + (uint)spaceSize; token.ThrowIfCancellationRequested(); } return(info); }
protected virtual ContentWriteInfo WriteLoadedContentFiles( Stream target, uint contentOffset, IEnumerable <ProxyContentFile> contentFiles, CancellationToken token) { //ProxyPcPC doesn't use any spacing between content files ContentWriteInfo info = new ContentWriteInfo(); target.Seek(contentOffset, SeekOrigin.Begin); //Przydała by się jakaś funkcja haszujaca która potrafi zmiksować w hasz stary offset i długość //tyle trzeba uważać bo np przy dodawani które jest przeminne moze dosjc do powtózeń jesli offset i dł by sie zamieniły miejscami. //ProxyPCPC shares content between the files if content is the same. //Therefore we're not writing each content uniquely but adjust values of file's offset to point to the same content spot. var uniqueContentEntries = new Dictionary <String, ProxyContentFile>(); foreach (var file in contentFiles) { uint originalFileLength = file.Length; uint originalFileOffset = file.Offset; var thisContentKey = originalFileLength.ToString() + originalFileOffset.ToString(); bool canReferenceWrittenContent = uniqueContentEntries.ContainsKey(thisContentKey) && !file.IsCustomContentLoaded; if (canReferenceWrittenContent) { var matchingWrittenContent = uniqueContentEntries[thisContentKey]; file.Length = matchingWrittenContent.Length; file.Offset = matchingWrittenContent.Offset; file.TotalOffset = file.Offset + contentOffset; } else { byte[] fileBuffer = file.Content; file.Length = (uint)file.Content.Length; file.Offset = (uint)target.Position - contentOffset; file.TotalOffset = file.Offset + contentOffset; target.Write(fileBuffer, 0, fileBuffer.Length); info.Length += (uint)fileBuffer.Length; uniqueContentEntries.Add(thisContentKey, file); } token.ThrowIfCancellationRequested(); } return(info); }