138: def generate
139: @io = StringIO.new
140:
141: size = 0
142:
143: unix_permissions = 0644
144: external_file_attributes = (FSTYPE_UNIX << 12 | (unix_permissions & 07777)) << 16
145:
146: @entries.each do |entry|
147: data = [
148: CENTRAL_DIRECTORY_ENTRY_SIGNATURE,
149: 0,
150: FSTYPE_UNIX,
151: 0,
152: 0,
153: DEFLATED,
154: binary_dos_time,
155: binary_dos_date,
156: entry.crc,
157: entry.compressed_size,
158: entry.uncompressed_size,
159: entry.name.length,
160: 0,
161: 0,
162: 0,
163: 1,
164: external_file_attributes,
165: entry.local_header_offset,
166: entry.name,
167: '',
168: ''
169: ].pack('VCCvvvvvVVVvvvvvVV') << entry.name << ""
170: size += data.size
171: @io << data
172: end
173:
174: @io << [
175: END_OF_CENTRAL_DIRECTORY_SIGNATURE,
176: 0,
177: 0,
178: @entries.size,
179: @entries.size,
180: @entries.inject(0) { |value, entry| entry.central_directory_header_size + value },
181:
182: @offset,
183: 0
184: ].pack('VvvvvVVv')
185: @io << ""
186: end