private void SetVolumeDescriptor( byte[] systemId, byte[] volumeId, UInt64 volumeSpaceSize, UInt64 pathTableSize,
										  UInt32 typeLPathTable, UInt32 typeMPathTable, DirectoryRecord rootDirRecord,
										  byte[] volumeSetId, byte[] publisherId, byte[] preparerId, byte[] applicationId,
										  byte[] copyrightFileId, byte[] abstractFileId, byte[] bibliographicFieldId,
										  AsciiDateRecord creationDate, AsciiDateRecord modificationDate,
										  AsciiDateRecord expirationDate, AsciiDateRecord effectiveDate ) {

			if ( m_volumeDescriptor == null ) {
				m_volumeDescriptor = new VolumeDescriptor();
			}

			volumeSetId.CopyTo( m_volumeDescriptor.VolumeSetId, 0 );
			publisherId.CopyTo( m_volumeDescriptor.PublisherId, 0 );
			preparerId.CopyTo( m_volumeDescriptor.PreparerId, 0 );
			applicationId.CopyTo( m_volumeDescriptor.ApplicationId, 0 );
			copyrightFileId.CopyTo( m_volumeDescriptor.CopyrightFileId, 0 );
			abstractFileId.CopyTo( m_volumeDescriptor.AbstractFileId, 0 );
			bibliographicFieldId.CopyTo( m_volumeDescriptor.BibliographicFileId, 0 );

			this.SetVolumeDescriptor( systemId, volumeId, volumeSpaceSize, pathTableSize, typeLPathTable, typeMPathTable,
									  rootDirRecord, creationDate, modificationDate, expirationDate, effectiveDate );
		}
		private void SetVolumeDescriptor( string systemId, string volumeId, UInt32 volumeSpaceSize, UInt32 pathTableSize,
										  UInt32 typeLPathTable, UInt32 typeMPathTable, DirectoryRecordWrapper rootDir, DateTime creationDate, DateTime modificationDate, sbyte timeZone ) {

			byte[] lSystemId;
			byte[] lVolumeId;

			if ( VolumeDescriptorType == VolumeType.Primary ) {

				lSystemId = IsoAlgorithm.StringToByteArray( systemId, IsoAlgorithm.SystemIdLength );
				lVolumeId = IsoAlgorithm.StringToByteArray( volumeId, IsoAlgorithm.VolumeIdLength );

			} else if ( VolumeDescriptorType == VolumeType.Suplementary ) {

				lSystemId = IsoAlgorithm.AsciiToUnicode( systemId, IsoAlgorithm.SystemIdLength );
				lVolumeId = IsoAlgorithm.AsciiToUnicode( volumeId, IsoAlgorithm.VolumeIdLength );

			} else {
				if ( m_volumeDescriptor == null ) {
					m_volumeDescriptor = new VolumeDescriptor();
				}
				m_volumeDescriptor.VolumeDescType = (byte)m_volumeDescriptorType;
				return;
			}

			UInt64 lVolumeSpaceSize = IsoAlgorithm.BothEndian( volumeSpaceSize );
			UInt64 lPathTableSize = IsoAlgorithm.BothEndian( pathTableSize );

			// typeLPathTable remains unchanged, but typeMPathTable has to change byte order.
			UInt32 lTypeMPathTable = IsoAlgorithm.ChangeEndian( typeMPathTable );
			DateWrapper lCreationDate = new DateWrapper( creationDate, timeZone );

			DateWrapper lModificationDate = new DateWrapper( modificationDate, timeZone );

			DateWrapper bufferDate = new DateWrapper( IsoAlgorithm.NoDate );

			this.SetVolumeDescriptor( lSystemId, lVolumeId, lVolumeSpaceSize, lPathTableSize, typeLPathTable, lTypeMPathTable,
									  rootDir.Record, lCreationDate.AsciiDateRecord, lModificationDate.AsciiDateRecord,
									  bufferDate.AsciiDateRecord, bufferDate.AsciiDateRecord );
		}
		private void SetVolumeDescriptor( byte[] systemId, byte[] volumeId, UInt64 volumeSpaceSize, UInt64 pathTableSize,
										  UInt32 typeLPathTable, UInt32 typeMPathTable, DirectoryRecord rootDirRecord,
										  AsciiDateRecord creationDate, AsciiDateRecord modificationDate,
										  AsciiDateRecord expirationDate, AsciiDateRecord effectiveDate ) {

			if ( m_volumeDescriptor == null ) {
				m_volumeDescriptor = new VolumeDescriptor();
			}

			m_volumeDescriptor.VolumeDescType = (byte)m_volumeDescriptorType;

			systemId.CopyTo( m_volumeDescriptor.SystemId, 0 );
			volumeId.CopyTo( m_volumeDescriptor.VolumeId, 0 );
			m_volumeDescriptor.VolumeSpaceSize = volumeSpaceSize;
			m_volumeDescriptor.PathTableSize = pathTableSize;
			m_volumeDescriptor.TypeLPathTable = typeLPathTable;
			m_volumeDescriptor.TypeMPathTable = typeMPathTable;

			m_volumeDescriptor.RootDirRecord = rootDirRecord;
			m_rootDirRecord = new DirectoryRecordWrapper( rootDirRecord );

			m_volumeDescriptor.CreationDate = creationDate;
			m_creationDate = new DateWrapper( creationDate );

			m_volumeDescriptor.ModificationDate = modificationDate;
			m_modificationDate = new DateWrapper( modificationDate );

			m_volumeDescriptor.ExpirationDate = expirationDate;
			m_expirationDate = new DateWrapper( expirationDate );

			m_volumeDescriptor.EffectiveDate = effectiveDate;
			m_effectiveDate = new DateWrapper( effectiveDate );
		}