Beispiel #1
0
 /// <summary>Saves container to new file.</summary>
 /// <param name="fileName">Name of the file.</param>
 public void SaveAs(string fileName)
 {
     using (var stream = new FileStream(fileName, FileMode.Create))
         using (var writer = new BinaryWriter(stream))
         {
             WriteHeadTo(writer);
             var newEntries = new List <LibZEntry>();
             foreach (var oldEntry in _entries.Values.OrderBy(e => e.Offset))
             {
                 byte[] buffer;
                 lock (_stream)
                 {
                     _stream.Position = oldEntry.Offset;
                     buffer           = _reader.ReadBytes(oldEntry.StorageLength);
                 }
                 var newEntry = new LibZEntry(oldEntry)
                 {
                     Offset = stream.Position
                 };
                 writer.Write(buffer);
                 newEntries.Add(newEntry);
             }
             WriteTailTo(writer, _containerId, newEntries);
         }
 }
Beispiel #2
0
 /// <summary>Writes the entry to.</summary>
 /// <param name="writer">The writer.</param>
 /// <param name="entry">The entry.</param>
 private static void WriteEntryTo(BinaryWriter writer, LibZEntry entry)
 {
     writer.Write(entry.Id.ToByteArray());
     writer.Write(entry.AssemblyName.FullName);
     writer.Write(entry.Hash.ToByteArray());
     writer.Write((int)entry.Flags);
     writer.Write(entry.Offset);
     writer.Write(entry.OriginalLength);
     writer.Write(entry.StorageLength);
     writer.Write(entry.CodecName ?? string.Empty);
 }
Beispiel #3
0
        /// <summary>Saves entry to file.</summary>
        /// <param name="resourceName">Name of the resource.</param>
        /// <param name="assemblyName">Name of the assembly.</param>
        /// <param name="input">The content of the assembly.</param>
        /// <param name="flags">The flags.</param>
        /// <param name="options">The options.</param>
        private void SetBytes(
            string resourceName,
            AssemblyName assemblyName, byte[] input, LibZEntry.EntryFlags flags, AppendOptions options)
        {
            var codecName = options.CodecName;

            lock (_stream)
            {
                // prepare entry
                var entry = new LibZEntry {
                    Id             = Hash.Get(resourceName),
                    Hash           = Hash.Get(input),
                    AssemblyName   = assemblyName,
                    Offset         = _magicOffset,
                    Flags          = flags,
                    OriginalLength = input.Length,
                };

                // add it to dictionary
                if (options.Overwrite)
                {
                    _entries[entry.Id] = entry;
                }
                else
                {
                    _entries.Add(entry.Id, entry);
                }

                // encode it
                var encoded = Encode(codecName, input);
                if (encoded != null)
                {
                    entry.CodecName = codecName;
                    input           = encoded;
                }

                // write it
                _magicOffset += entry.StorageLength = WriteBytes(_stream, _magicOffset, input);
                _stream.SetLength(_stream.Position);

                _containerId = Guid.NewGuid();

                _dirty = true;
            }
        }
Beispiel #4
0
		/// <summary>Saves entry to file.</summary>
		/// <param name="resourceName">Name of the resource.</param>
		/// <param name="assemblyName">Name of the assembly.</param>
		/// <param name="input">The content of the assembly.</param>
		/// <param name="flags">The flags.</param>
		/// <param name="options">The options.</param>
		private void SetBytes(
			string resourceName,
			AssemblyName assemblyName, byte[] input, LibZEntry.EntryFlags flags, AppendOptions options)
		{
			var codecName = options.CodecName;

			lock (_stream)
			{
				// prepare entry
				var entry = new LibZEntry {
					Id = Hash.Get(resourceName),
					Hash = Hash.Get(input),
					AssemblyName = assemblyName,
					Offset = _magicOffset,
					Flags = flags,
					OriginalLength = input.Length,
				};

				// add it to dictionary
				if (options.Overwrite)
				{
					_entries[entry.Id] = entry;
				}
				else
				{
					_entries.Add(entry.Id, entry);
				}

				// encode it
				var encoded = Encode(codecName, input);
				if (encoded != null)
				{
					entry.CodecName = codecName;
					input = encoded;
				}

				// write it
				_magicOffset += entry.StorageLength = WriteBytes(_stream, _magicOffset, input);
				_stream.SetLength(_stream.Position);

				_containerId = Guid.NewGuid();

				_dirty = true;
			}
		}
Beispiel #5
0
		/// <summary>Writes the entry to.</summary>
		/// <param name="writer">The writer.</param>
		/// <param name="entry">The entry.</param>
		private static void WriteEntryTo(BinaryWriter writer, LibZEntry entry)
		{
			writer.Write(entry.Id.ToByteArray());
			writer.Write(entry.AssemblyName.FullName);
			writer.Write(entry.Hash.ToByteArray());
			writer.Write((int)entry.Flags);
			writer.Write(entry.Offset);
			writer.Write(entry.OriginalLength);
			writer.Write(entry.StorageLength);
			writer.Write(entry.CodecName ?? string.Empty);
		}
Beispiel #6
0
		/// <summary>Saves container to new file.</summary>
		/// <param name="fileName">Name of the file.</param>
		public void SaveAs(string fileName)
		{
			using (var stream = new FileStream(fileName, FileMode.Create))
			using (var writer = new BinaryWriter(stream))
			{
				WriteHeadTo(writer);
				var newEntries = new List<LibZEntry>();
				foreach (var oldEntry in _entries.Values.OrderBy(e => e.Offset))
				{
					byte[] buffer;
					lock (_stream)
					{
						_stream.Position = oldEntry.Offset;
						buffer = _reader.ReadBytes(oldEntry.StorageLength);
					}
					var newEntry = new LibZEntry(oldEntry) { Offset = stream.Position };
					writer.Write(buffer);
					newEntries.Add(newEntry);
				}
				WriteTailTo(writer, _containerId, newEntries);
			}
		}
		/// <summary>Gets the flags text.</summary>
		/// <param name="entryFlags">The entry flags.</param>
		/// <returns>Text representing assembly flags.</returns>
		private static IEnumerable<string> GetFlagsText(LibZEntry.EntryFlags entryFlags)
		{
			if ((entryFlags & LibZEntry.EntryFlags.Unmanaged) != 0)
				yield return "Unmanaged";

			if ((entryFlags & LibZEntry.EntryFlags.AnyCPU) != 0)
				yield return "AnyCPU";
			else if ((entryFlags & LibZEntry.EntryFlags.X64) != 0)
				yield return "x64";
			else
				yield return "x86";

			if ((entryFlags & LibZEntry.EntryFlags.Portable) != 0)
				yield return "Portable";
			if ((entryFlags & LibZEntry.EntryFlags.SafeLoad) != 0)
				yield return "SafeLoad";
		}