Пример #1
0
		public static void FetchAllFromFile(string fileName, string password, EBlubbZipHelperLoadType loadType, out Dictionary<int, Stream> streamList, out Dictionary<int, string> fileList, out Dictionary<int, BlubbZipEntry> entryList) {
			fileList = new Dictionary<int, string>();
			streamList = new Dictionary<int, Stream>();
			entryList = new Dictionary<int, BlubbZipEntry>();

			if (File.Exists(fileName) == false)
				throw new Exception("File not Found!\n" + fileName);

			using (FileStream fs = File.OpenRead(fileName)) {
				BlubbZipFile blubb = new BlubbZipFile(fs);
				blubb.Password = password;

				for (int cz = 0; cz < blubb.Count; cz++) {
					if (blubb[cz].IsFile == false)
						continue;
					if ((loadType & EBlubbZipHelperLoadType.Streams) > 0)
						streamList.Add(cz, blubb.GetInputStream(cz));
					if ((loadType & EBlubbZipHelperLoadType.FileList) > 0)
						fileList.Add(cz, blubb[cz].Name.ToString(CultureInfo.InvariantCulture).Replace("/", @"\"));
					if ((loadType & EBlubbZipHelperLoadType.Entrys) > 0)
						entryList.Add(cz, blubb[cz].Clone() as BlubbZipEntry);
				}

				blubb.Close();
			}

		}
Пример #2
0
		public static void FetchAllFromFile(string blubbzipFilePath, string blubbzipPassword, EFastBlubbZipLoadType loadType, out Dictionary<int, Stream> StreamList, out Dictionary<int, string> FileList, out Dictionary<int, BlubbZipEntry> EntryList) {
			FileList = new Dictionary<int, string>();
			StreamList = new Dictionary<int, Stream>();
			EntryList = new Dictionary<int, BlubbZipEntry>();

			if (File.Exists(blubbzipFilePath) == false)
				throw new Exception("File not Found!\n" + blubbzipFilePath);

			using (FileStream fs = File.OpenRead(blubbzipFilePath)) {
				BlubbZipFile blubb = new BlubbZipFile(fs);
				blubb.Password = blubbzipPassword;

				for (int cz = 0; cz < blubb.Count; cz++) {
					if (blubb[cz].IsFile == false)
						continue;
					if ((loadType & EFastBlubbZipLoadType.Streams) > 0)
						StreamList.Add(cz, blubb.GetInputStream(cz));
					if ((loadType & EFastBlubbZipLoadType.FileList) > 0)
						FileList.Add(cz, blubb[cz].Name.ToString().Replace("/", @"\"));
					if ((loadType & EFastBlubbZipLoadType.Entrys) > 0)
						EntryList.Add(cz, blubb[cz].Clone() as BlubbZipEntry);
				}

				blubb.Close();
			}

		}
Пример #3
0
		public static MemoryStream FetchFromFile(string blubbzipFilePath, string blubbzipPassword, int entryIndex) {
			using (FileStream fs = File.OpenRead(blubbzipFilePath)) {
				BlubbZipFile blubb = new BlubbZipFile(fs);
				blubb.Password = blubbzipPassword;

				Stream s = blubb.GetInputStream(entryIndex);
				MemoryStream Writer = new MemoryStream();
				byte[] data = new byte[4096];
				int size = s.Read(data, 0, data.Length);

				while (size > 0) {
					Writer.Write(data, 0, size);
					size = s.Read(data, 0, data.Length);
				}

				blubb.Close();
				return Writer;
			}

		}
Пример #4
0
		public static Stream GetFileStream(string fromZip, string password, int index) {
			using (FileStream fs = File.OpenRead(fromZip)) {
				BlubbZipFile blubb = new BlubbZipFile(fs);
				blubb.Password = password;

				Stream s = blubb.GetInputStream(index);
				Stream writer = new MemoryStream();
				byte[] data = new byte[4096];
				int size = s.Read(data, 0, data.Length);

				while (size > 0) {
					writer.Write(data, 0, size);
					size = s.Read(data, 0, data.Length);
				}

				blubb.Close();
				return writer;
			}

		}
Пример #5
0
		public static MemoryStream[] FetchListFromFile(string fromZip, string Password, int[] list) {
			using (FileStream fs = File.OpenRead(fromZip)) {
				BlubbZipFile blubb = new BlubbZipFile(fs);
				blubb.Password = Password;

				MemoryStream[] Streams = new MemoryStream[list.Length];
				int counter = 0;
				foreach (int index in list) {
					Stream s = blubb.GetInputStream(index);
					MemoryStream Writer = new MemoryStream();
					byte[] data = new byte[4096];
					int size = s.Read(data, 0, data.Length);

					while (size > 0) {
						Writer.Write(data, 0, size);
						size = s.Read(data, 0, data.Length);
					}

					Streams[counter++] = Writer;
				}
				blubb.Close();

				return Streams;
			}

		}
Пример #6
0
		/// <summary>
		/// Create a new <see cref="BlubbFile"/> whose data will be stored on a stream.
		/// </summary>
		/// <param name="outStream">The stream providing data storage.</param>
		/// <returns>Returns the newly created <see cref="BlubbFile"/></returns>
		/// <exception cref="ArgumentNullException"><paramref name="outStream"> is null</paramref></exception>
		/// <exception cref="ArgumentException"><paramref name="outStream"> doesnt support writing.</paramref></exception>
		public static BlubbZipFile Create( Stream outStream ) {
			if( outStream == null ) {
				throw new ArgumentNullException( "outStream" );
			}

			if( !outStream.CanWrite ) {
				throw new ArgumentException( "Stream is not writeable", "outStream" );
			}

			if( !outStream.CanSeek ) {
				throw new ArgumentException( "Stream is not seekable", "outStream" );
			}

			BlubbZipFile result = new BlubbZipFile();
			result.baseStream_ = outStream;
			return result;
		}
Пример #7
0
		// Creators
		/// <summary>
		/// Create a new <see cref="BlubbFile"/> whose data will be stored in a file.
		/// </summary>
		/// <param name="fileName">The name of the archive to create.</param>
		/// <returns>Returns the newly created <see cref="BlubbFile"/></returns>
		/// <exception cref="ArgumentNullException"><paramref name="fileName"></paramref> is null</exception>
		public static BlubbZipFile Create( string fileName ) {
			if( fileName == null ) {
				throw new ArgumentNullException( "fileName" );
			}

			FileStream fs = File.Create( fileName );

			BlubbZipFile result = new BlubbZipFile();
			result.name_ = fileName;
			result.baseStream_ = fs;
			result.isStreamOwner = true;
			return result;
		}
Пример #8
0
		/// <summary>
		/// Initializes a new instance of the <see cref="DiskArchiveStorage"/> class.
		/// </summary>
		/// <param name="file">The file.</param>
		public DiskArchiveStorage( BlubbZipFile file )
			: this( file, FileUpdateMode.Safe ) {
		}
Пример #9
0
		// Constructors
		/// <summary>
		/// Initializes a new instance of the <see cref="DiskArchiveStorage"/> class.
		/// </summary>
		/// <param name="file">The file.</param>
		/// <param name="updateMode">The update mode.</param>
		public DiskArchiveStorage( BlubbZipFile file, FileUpdateMode updateMode )
			: base( updateMode ) {
			if( file.Name == null ) {
				throw new BlubbZipException( "Cant handle non file archives" );
			}

			fileName_ = file.Name;
		}
Пример #10
0
			// Constructors
			/// <summary>
			/// Initialise a new instance of the <see cref="PartialInputStream"/> class.
			/// </summary>
			/// <param name="blubbFile">The <see cref="BlubbFile"/> containing the underlying stream to use for IO.</param>
			/// <param name="start">The start of the partial data.</param>
			/// <param name="length">The length of the partial data.</param>
			public PartialInputStream( BlubbZipFile blubbFile, long start, long length ) {
				start_ = start;
				length_ = length;

				// Although this is the only time the blubbfile is used
				// keeping a reference here prevents premature closure of
				// this blubb file and thus the baseStream_.

				// Code like this will cause apparently random failures depending
				// on the size of the files and when garbage is collected.
				//
				// BlubbFile z = new BlubbFile (stream);
				// Stream reader = z.GetInputStream(0);
				// uses reader here....
				blubbFile_ = blubbFile;
				baseStream_ = blubbFile_.baseStream_;
				readPos_ = start;
				end_ = start + length;
			}
Пример #11
0
		void CopyEntry( BlubbZipFile workFile, BlubbUpdate update ) {
			workFile.WriteLocalEntryHeader( update );

			if( update.Entry.CompressedSize > 0 ) {
				const int NameLengthOffset = 26;

				long entryDataOffset = update.Entry.Offset + NameLengthOffset;

				// TODO: This wont work for SFX files!
				baseStream_.Seek( entryDataOffset, SeekOrigin.Begin );

				uint nameLength = ReadLEUshort();
				uint extraLength = ReadLEUshort();

				baseStream_.Seek( nameLength + extraLength, SeekOrigin.Current );

				CopyBytes( update, workFile.baseStream_, baseStream_, update.Entry.CompressedSize, false );
			}
			CopyDescriptorBytes( update, workFile.baseStream_, baseStream_ );
		}
Пример #12
0
		void CopyEntryDirect( BlubbZipFile workFile, BlubbUpdate update, ref long destinationPosition ) {
			bool skipOver = false;
			if( update.Entry.Offset == destinationPosition ) {
				skipOver = true;
			}

			if( !skipOver ) {
				baseStream_.Position = destinationPosition;
				workFile.WriteLocalEntryHeader( update );
				destinationPosition = baseStream_.Position;
			}

			long sourcePosition = 0;

			const int NameLengthOffset = 26;

			// TODO: Add base for SFX friendly handling
			long entryDataOffset = update.Entry.Offset + NameLengthOffset;

			baseStream_.Seek( entryDataOffset, SeekOrigin.Begin );

			// Clumsy way of handling retrieving the original name and extra data length for now.
			// TODO: Stop re-reading name and data length in CopyEntryDirect.
			uint nameLength = ReadLEUshort();
			uint extraLength = ReadLEUshort();

			sourcePosition = baseStream_.Position + nameLength + extraLength;

			if( skipOver ) {
				destinationPosition +=
					( sourcePosition - entryDataOffset ) + NameLengthOffset +	// Header size
					update.Entry.CompressedSize + GetDescriptorSize( update );
			} else {
				if( update.Entry.CompressedSize > 0 ) {
					CopyEntryDataDirect( update, baseStream_, false, ref destinationPosition, ref sourcePosition );
				}
				CopyDescriptorBytesDirect( update, baseStream_, ref destinationPosition, sourcePosition );
			}
		}
Пример #13
0
		void ModifyEntry( BlubbZipFile workFile, BlubbUpdate update ) {
			workFile.WriteLocalEntryHeader( update );
			long dataStart = workFile.baseStream_.Position;

			// TODO: This is slow if the changes don't effect the data!!
			if( update.Entry.IsFile && ( update.Filename != null ) ) {
				using( Stream output = workFile.GetOutputStream( update.OutEntry ) ) {
					using( Stream source = this.GetInputStream( update.Entry ) ) {
						CopyBytes( update, output, source, source.Length, true );
					}
				}
			}

			long dataEnd = workFile.baseStream_.Position;
			update.Entry.CompressedSize = dataEnd - dataStart;
		}
Пример #14
0
		void AddEntry( BlubbZipFile workFile, BlubbUpdate update ) {
			Stream source = null;

			if( update.Entry.IsFile ) {
				source = update.GetSource();

				if( source == null ) {
					source = updateDataSource_.GetSource( update.Entry, update.Filename );
				}
			}

			if( source != null ) {
				using( source ) {
					long sourceStreamLength = source.Length;
					if( update.OutEntry.Size < 0 ) {
						update.OutEntry.Size = sourceStreamLength;
					} else {
						// Check for errant entries.
						if( update.OutEntry.Size != sourceStreamLength ) {
							throw new BlubbZipException( "Entry size/stream size mismatch" );
						}
					}

					workFile.WriteLocalEntryHeader( update );

					long dataStart = workFile.baseStream_.Position;

					using( Stream output = workFile.GetOutputStream( update.OutEntry ) ) {
						CopyBytes( update, output, source, sourceStreamLength, true );
					}

					long dataEnd = workFile.baseStream_.Position;
					update.OutEntry.CompressedSize = dataEnd - dataStart;

					if( ( update.OutEntry.Flags & (int)GeneralBitFlags.Descriptor ) == (int)GeneralBitFlags.Descriptor ) {
						BlubbZipHelperStream helper = new BlubbZipHelperStream( workFile.baseStream_ );
						helper.WriteDataDescriptor( update.OutEntry );
					}
				}
			} else {
				workFile.WriteLocalEntryHeader( update );
				update.OutEntry.CompressedSize = 0;
			}

		}
Пример #15
0
		// Constructors
		/// <summary>
		/// Initialise a new instance of <see cref="TestStatus"/>
		/// </summary>
		/// <param name="file">The <see cref="BlubbFile"/> this status applies to.</param>
		public TestStatus( BlubbZipFile file ) {
			file_ = file;
		}