示例#1
0
文件: arvzip.c 项目: Will-W/aravis
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;
}
示例#2
0
文件: arvzip.c 项目: lu-zero/aravis
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;
}