#include "types.h"
#include "stream_pe.h"
#include "stream_file.h"

///////////////////////////////////////////////////////////////////////////////
void parse_pe_stream(void *stream, R_STREAM_FILE *stream_file)
{
	int data_size = 0;
	char *data = 0, *ptmp = 0;
	int read_bytes = 0;
	SIMAGE_SECTION_HEADER *sctn_header = 0;
	SPEStream *pe_stream = (SPEStream *) stream;
	int sctn_header_size =0;

	stream_file_get_size(stream_file, &data_size);
	data = (char *) malloc(data_size);
	if (!data) return;
	stream_file_get_data(stream_file, data);

	sctn_header_size = sizeof(SIMAGE_SECTION_HEADER);
	ptmp = data;
	pe_stream->sections_hdrs = r_list_new();
	while (read_bytes < data_size) {
		sctn_header = (SIMAGE_SECTION_HEADER *) malloc (sctn_header_size);
		if (!sctn_header) break;
		memcpy(sctn_header, ptmp, sctn_header_size);
		ptmp += sctn_header_size;
		r_list_append(pe_stream->sections_hdrs, sctn_header);
		read_bytes += sctn_header_size;
	}

	free(data);
}

///////////////////////////////////////////////////////////////////////////////
void free_pe_stream(void *stream)
{
	SPEStream *pe_stream = (SPEStream *) stream;
	SIMAGE_SECTION_HEADER *sctn_header = 0;
	RListIter *it = 0;

	it = r_list_iterator(pe_stream->sections_hdrs);
	while (r_list_iter_next(it)) {
		sctn_header = (SIMAGE_SECTION_HEADER *) r_list_iter_get(it);
		free(sctn_header);
	}
	r_list_free(pe_stream->sections_hdrs);
}
