Class: Zip::ZipCentralDirectory

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/zip/zip.rb

Direct Known Subclasses

ZipFile

Constant Summary

END_OF_CENTRAL_DIRECTORY_SIGNATURE =
0x06054b50
MAX_END_OF_CENTRAL_DIRECTORY_STRUCTURE_SIZE =
65536 + 18
STATIC_EOCD_SIZE =
22

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Methods included from Enumerable

#inject, #select_map

Constructor Details

- (ZipCentralDirectory) initialize(entries = ZipEntrySet.new, comment = ""))

:nodoc:



1197
1198
1199
1200
1201
# File 'lib/zip/zip.rb', line 1197

def initialize(entries = ZipEntrySet.new, comment = "")  #:nodoc:
  super()
  @entrySet = entries.kind_of?(ZipEntrySet) ? entries : ZipEntrySet.new(entries)
  @comment = comment
end

Instance Attribute Details

- (Object) comment (readonly)

Returns the value of attribute comment



1190
1191
1192
# File 'lib/zip/zip.rb', line 1190

def comment
  @comment
end

Class Method Details

+ (Object) read_from_stream(io)

:nodoc:



1301
1302
1303
1304
1305
1306
1307
# File 'lib/zip/zip.rb', line 1301

def ZipCentralDirectory.read_from_stream(io)  #:nodoc:
  cdir  = new
  cdir.read_from_stream(io)
  return cdir
rescue ZipError
  return nil
end

Instance Method Details

- (Object) ==(other)

:nodoc:



1309
1310
1311
1312
# File 'lib/zip/zip.rb', line 1309

def == (other) #:nodoc:
  return false unless other.kind_of?(ZipCentralDirectory)
  @entrySet.entries.sort == other.entries.sort && comment == other.comment
end

- (Object) each(&proc)

For iterating over the entries.



1291
1292
1293
# File 'lib/zip/zip.rb', line 1291

def each(&proc)
  @entrySet.each(&proc)
end

- (Object) entries

Returns an Enumerable containing the entries.



1193
1194
1195
# File 'lib/zip/zip.rb', line 1193

def entries
  @entrySet.entries
end

- (Object) get_e_o_c_d(io)

:nodoc:

Raises:



1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
# File 'lib/zip/zip.rb', line 1259

def get_e_o_c_d(io)  #:nodoc:
  begin
	io.seek(-MAX_END_OF_CENTRAL_DIRECTORY_STRUCTURE_SIZE, IO::SEEK_END)
  rescue Errno::EINVAL
	io.seek(0, IO::SEEK_SET)
  rescue Errno::EFBIG # FreeBSD 4.9 raise Errno::EFBIG instead of Errno::EINVAL
	io.seek(0, IO::SEEK_SET)
  end
  
  # 'buf = io.read' substituted with lump of code to work around FreeBSD 4.5 issue
  retried = false
  buf = nil
  begin
    buf = io.read
  rescue Errno::EFBIG # FreeBSD 4.5 may raise Errno::EFBIG
    raise if (retried)
    retried = true
	
    io.seek(0, IO::SEEK_SET)
    retry
  end

  sigIndex = buf.rindex([END_OF_CENTRAL_DIRECTORY_SIGNATURE].pack('V'))
  raise ZipError, "Zip end of central directory signature not found" unless sigIndex
  buf=buf.slice!((sigIndex+4)...(buf.size))
  def buf.read(count)
	slice!(0, count)
  end
  return buf
end

- (Object) read_central_directory_entries(io)

:nodoc:



1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
# File 'lib/zip/zip.rb', line 1242

def read_central_directory_entries(io)  #:nodoc:
  begin
	io.seek(@cdirOffset, IO::SEEK_SET)
  rescue Errno::EINVAL
	raise ZipError, "Zip consistency problem while reading central directory entry"
  end
  @entrySet = ZipEntrySet.new
  @size.times {
	@entrySet << ZipEntry.read_c_dir_entry(io)
  }
end

- (Object) read_e_o_c_d(io)

:nodoc:

Raises:



1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
# File 'lib/zip/zip.rb', line 1229

def read_e_o_c_d(io) #:nodoc:
  buf = get_e_o_c_d(io)
  @numberOfThisDisk                     = ZipEntry::read_zip_short(buf)
  @numberOfDiskWithStartOfCDir          = ZipEntry::read_zip_short(buf)
  @totalNumberOfEntriesInCDirOnThisDisk = ZipEntry::read_zip_short(buf)
  @size                                 = ZipEntry::read_zip_short(buf)
  @sizeInBytes                          = ZipEntry::read_zip_long(buf)
  @cdirOffset                           = ZipEntry::read_zip_long(buf)
  commentLength                         = ZipEntry::read_zip_short(buf)
  @comment                              = buf.read(commentLength)
  raise ZipError, "Zip consistency problem while reading eocd structure" unless buf.size == 0
end

- (Object) read_from_stream(io)

:nodoc:



1254
1255
1256
1257
# File 'lib/zip/zip.rb', line 1254

def read_from_stream(io)  #:nodoc:
  read_e_o_c_d(io)
  read_central_directory_entries(io)
end

- (Object) size

Returns the number of entries in the central directory (and consequently in the zip archive).



1297
1298
1299
# File 'lib/zip/zip.rb', line 1297

def size
  @entrySet.size
end

- (Object) write_to_stream(io)

:nodoc:



1203
1204
1205
1206
1207
# File 'lib/zip/zip.rb', line 1203

def write_to_stream(io)  #:nodoc:
  offset = io.tell
  @entrySet.each { |entry| entry.write_c_dir_entry(io) }
  write_e_o_c_d(io, offset)
end