Archive-Raw

 view release on metacpan or  search on metacpan

xs/Reader.xs  view on Meta::CPAN

MODULE = Archive::Raw               PACKAGE = Archive::Raw::Reader

Reader
new (class)
	SV *class

	PREINIT:
		archive_raw_reader *self;

	CODE:
		Newxz (self, 1, archive_raw_reader);
		self->ar = archive_read_new();
		if (self->ar == NULL)
			croak ("archive_read_new() failed");

		archive_read_support_format_all (self->ar);
		archive_read_support_filter_all (self->ar);

		RETVAL = self;

	OUTPUT: RETVAL

void
open_filename (self, filename)
	Reader self
	const char *filename

	PREINIT:
		int rc;

	CODE:
		if (self->reading)
			croak ("already open");

		rc = archive_read_open_filename (self->ar, filename, 16384);
		archive_check_error (rc, self->ar, archive_read_open_filename);

		self->reading = 1;

Entry
next (self)
	Reader self

	PREINIT:
		int rc;
		archive_raw_entry *entry;
		struct archive_entry *e;

	CODE:
		if (!self->reading)
			croak ("not open");

		rc = archive_read_next_header (self->ar, &e);
		if (rc == ARCHIVE_EOF)
			XSRETURN_UNDEF;
		archive_check_error (rc, self->ar, archive_read_next_header);

		Newxz (entry, 1, archive_raw_entry);
		entry->e = archive_entry_clone (e);
		entry->reader = self; // TODO: This should be reference counted

		RETVAL = entry;

	OUTPUT: RETVAL

int
has_encrypted_entries (self)
	Reader self

	CODE:
#if ARCHIVE_VERSION_NUMBER >= 3002000
		RETVAL = archive_read_has_encrypted_entries (self->ar);
#else
		croak ("this feature requires libarchive 3.2+");
#endif

	OUTPUT: RETVAL

int
format_capabilities (self)
	Reader self

	CODE:
#if ARCHIVE_VERSION_NUMBER >= 3002000
		RETVAL = archive_read_format_capabilities (self->ar);
#else
		croak ("this feature requires libarchive 3.2+");
#endif

	OUTPUT: RETVAL

void
add_passphrase (self, phrase)
	Reader self
	const char *phrase

	PREINIT:
		int rc;

	CODE:
#if ARCHIVE_VERSION_NUMBER >= 3002000
		rc = archive_read_add_passphrase (self->ar, phrase);
		archive_check_error (rc, self->ar, archive_read_add_passphrase);
#else
		croak ("this feature requires libarchive 3.2+");
#endif

int
file_count (self)
	Reader self

	CODE:
		RETVAL = archive_file_count (self->ar);

	OUTPUT: RETVAL

int
format (self)
	Reader self

	CODE:
		RETVAL = archive_format (self->ar);

	OUTPUT: RETVAL

const char *
format_name (self)
	Reader self

	CODE:
		RETVAL = archive_format_name (self->ar);

	OUTPUT: RETVAL

void
close (self)
	Reader self

	PPCODE:
		if (self->reading)
		{
			archive_read_close (self->ar);
			self->reading = 0;
			XSRETURN_YES;
		}

		XSRETURN_NO;

void
DESTROY (self)
	Reader self

	CODE:
		if (self->reading)
			archive_read_close (self->ar);
		archive_read_free (self->ar);
		Safefree (self);



( run in 0.864 second using v1.01-cache-2.11-cpan-5a3173703d6 )