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);
        }
Exemplo n.º 2
0
        /// <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);
        }