ArvZip * arv_zip_new (const void *buffer, size_t size) { ArvZip *zip; const void *ptr; int i; gboolean directory_found; g_return_val_if_fail (buffer != NULL, NULL); g_return_val_if_fail (size > 0, NULL); zip = g_new0 (ArvZip, 1); zip->buffer = buffer; zip->buffer_size = size; directory_found = FALSE; for (i = zip->buffer_size - 4; i > 0; i--) { if (zip->buffer[i] == 0x50 && zip->buffer[i+1] == 0x4b && zip->buffer[i+2] == 0x05 && zip->buffer[i+3] == 0x06) { zip->directory_position = i; directory_found = TRUE; break; } } if (!directory_found) { arv_debug_misc ("[Zip::new] Magic number for end of central directory not found (0x06054b50)"); return zip; } ptr = zip->buffer + zip->directory_position; zip->n_files = ARV_GUINT16_FROM_LE_PTR (ptr, 10); if (ARV_GUINT16_FROM_LE_PTR (ptr, 8) != zip->n_files) { arv_debug_misc ("[Zip::new] Mismatch in number of files"); zip->n_files = 0; return zip; } zip->directory_size = ARV_GUINT32_FROM_LE_PTR (ptr, 12); zip->directory_offset = ARV_GUINT32_FROM_LE_PTR (ptr, 16); zip->header_size = zip->directory_position - (zip->directory_offset + zip->directory_size); arv_log_misc ("[Zip::new] number of files = %d", zip->n_files); arv_log_misc ("[Zip::new] directory position = 0x%08x", zip->directory_position); arv_log_misc ("[Zip::new] directory size = %d", zip->directory_size); arv_log_misc ("[Zip::new] directory offset = 0x%08x", zip->directory_offset); arv_log_misc ("[Zip::new] header size = %d", zip->header_size); arv_zip_build_file_list (zip); return zip; }
ArvZip * arv_zip_new (const void *buffer, size_t size) { ArvZip *zip; const void *ptr; int i; gboolean directory_found; g_return_val_if_fail (buffer != NULL, NULL); g_return_val_if_fail (size > 0, NULL); zip = g_new0 (ArvZip, 1); zip->buffer = buffer; zip->buffer_size = size; directory_found = FALSE; for (i = zip->buffer_size - 4; i > 0; i--) { if (zip->buffer[i] == 0x50 && zip->buffer[i+1] == 0x4b && zip->buffer[i+2] == 0x05 && zip->buffer[i+3] == 0x06) { zip->directory_position = i; directory_found = TRUE; break; } } if (!directory_found) return zip; ptr = zip->buffer + zip->directory_position; zip->n_files = GUINT16_FROM_LE_PTR (ptr + 10); if (GUINT16_FROM_LE_PTR (ptr + 8) != zip->n_files) { zip->n_files = 0; return zip; } zip->directory_size = GUINT32_FROM_LE_PTR (ptr + 12); zip->directory_offset = GUINT32_FROM_LE_PTR (ptr + 16); zip->header_size = zip->directory_position - (zip->directory_offset + zip->directory_size); arv_zip_build_file_list (zip); return zip; }