The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "oggpage.h"

MODULE = Audio::TagLib			PACKAGE = Audio::TagLib::Ogg::Page
PROTOTYPES: ENABLE

################################################################
# 
# PUBLIC MEMBER FUNCTIONS
# 
################################################################

TagLib::Ogg::Page * 
TagLib::Ogg::Page::new(file, pageOffset)
	TagLib::Ogg::File * file
	long pageOffset
CODE:
	RETVAL = new TagLib::Ogg::Page(file, pageOffset);
OUTPUT:
	RETVAL

void 
TagLib::Ogg::Page::DESTROY()
CODE:
	if(!SvREADONLY(SvRV(ST(0))))
		delete THIS;

long 
TagLib::Ogg::Page::fileOffset()
CODE:
	RETVAL = THIS->fileOffset();
OUTPUT:
	RETVAL

void 
TagLib::Ogg::Page::header()
INIT:
	const TagLib::Ogg::PageHeader * h = THIS->header();
PPCODE:
	ST(0) = sv_newmortal();
	sv_setref_pv(ST(0), "Audio::TagLib::Ogg::PageHeader", (void *)h);
	SvREADONLY_on(SvRV(ST(0)));
	XSRETURN(1);

int 
TagLib::Ogg::Page::firstPacketIndex()
CODE:
	RETVAL = THIS->firstPacketIndex();
OUTPUT:
	RETVAL

void 
TagLib::Ogg::Page::setFirstPacketIndex(index)
	int index
CODE:
	THIS->setFirstPacketIndex(index);

TagLib::Ogg::Page::ContainsPacketFlags 
TagLib::Ogg::Page::containsPacket(index)
	int index
CODE:
	RETVAL = THIS->containsPacket(index);
OUTPUT:
	RETVAL

unsigned int 
TagLib::Ogg::Page::packetCount()
CODE:
	RETVAL = THIS->packetCount();
OUTPUT:
	RETVAL

TagLib::ByteVectorList * 
TagLib::Ogg::Page::packets()
CODE:
	RETVAL = new TagLib::ByteVectorList(THIS->packets());
OUTPUT:
	RETVAL

int 
TagLib::Ogg::Page::size()
CODE:
	RETVAL = THIS->size();
OUTPUT:
	RETVAL

TagLib::ByteVector * 
TagLib::Ogg::Page::render()
CODE:
	RETVAL = new TagLib::ByteVector(THIS->render());
OUTPUT:
	RETVAL

################################################################
# 
# STATIC PUBLIC MEMBER FUNCTIONS
# 
################################################################

static void 
TagLib::Ogg::Page::paginate(packets, strategy, streamSerialNumber, firstPage, firstPacketContinued=false, lastPacketCompleted=true, containsLastPacket=false)
	TagLib::ByteVectorList * packets
	TagLib::Ogg::Page::PaginationStrategy strategy
	unsigned int streamSerialNumber
	int firstPage
	bool firstPacketContinued
	bool lastPacketCompleted
	bool containsLastPacket
PREINIT:
	SV * sv;
INIT:
	TagLib::List<TagLib::Ogg::Page *> l = TagLib::Ogg::Page::paginate(
		*packets, strategy, streamSerialNumber, firstPage, 
		firstPacketContinued, lastPacketCompleted, 
		containsLastPacket);
PPCODE:
	switch(GIMME_V) {
	case G_SCALAR:
		ST(0) = sv_2mortal(newSVuv(l.size()));
		XSRETURN(1);
	case G_ARRAY:
		if(0 < l.size()) {
			EXTEND(SP, l.size());
			for(int i = 0; i < l.size(); i++) {
				sv = sv_newmortal();
				sv_setref_pv(sv, "Audio::TagLib::Ogg::Page", 
					(void *)l[i]);
				/* READONLY_off here */
				PUSHs(sv);
				sv = NULL;
			}
			//XSRETURN(l.size());
		} else
			XSRETURN_EMPTY;
	default:
		/* G_VOID */
		XSRETURN_UNDEF;
	}

################################################################
# 
# PROTECTED MEMBER FUNCTIONS
# 
# Page(const ByteVectorList &packets, 
# 	uint streamSerialNumber, int pageNumber, 
# 	bool firstPacketContinued=false, 
# 	bool lastPacketCompleted=true, 
# 	bool containsLastPacket=false)
# not exported
# 
################################################################