MODULE = MIME::Fast PACKAGE = MIME::Fast::Stream PREFIX=g_mime_stream_
# partial support - TODO: maybe IO:: support
#
# Create Stream for string or FILE
#
MIME::Fast::Stream
g_mime_stream_new(Class, svmixed = 0, start = 0, end = 0)
CASE: items == 1
CODE:
RETVAL = g_mime_stream_mem_new();
plist = g_list_prepend(plist, RETVAL);
OUTPUT:
RETVAL
CASE: items == 2
const char * Class
SV * svmixed
PREINIT:
STRLEN len;
char * data;
GMimeStream *mime_stream = NULL;
svtype svvaltype;
SV * svval;
CODE:
svval = svmixed;
if (SvROK(svmixed)) {
svval = SvRV(svmixed);
}
svvaltype = SvTYPE(svval);
if (mime_stream == NULL) {
if (svvaltype == SVt_PVGV) { // possible FILE * handle
#ifdef USE_PERLIO
PerlIO *pio;
pio = IoIFP(sv_2io(svval));
if (!pio) {
croak("MIME::Fast::Stream::new: the argument you gave is not a FILE pointer");
}
mime_stream = g_mime_stream_perlio_new(pio);
g_mime_stream_perlio_set_owner(GMIME_STREAM_PERLIO(mime_stream), FALSE);
if (!mime_stream) {
XSRETURN_UNDEF;
}
#else
PerlIO *pio;
FILE *fp;
int fd, fd0;
pio = IoIFP(sv_2io(svval));
if (!pio || !(fp = PerlIO_findFILE(pio)) || ((fd0 = PerlIO_fileno(pio)) < 0)) {
croak("MIME::Fast::Stream::new: the argument you gave is not a FILE pointer");
}
fd = dup(fd0);
if (fd == -1)
croak("MIME::Fast::Stream::new: Can not duplicate a FILE pointer");
// mime_stream = g_mime_stream_file_new(fp);
mime_stream = g_mime_stream_fs_new(fd);
if (!mime_stream) {
close(fd);
XSRETURN_UNDEF;
}
#endif
// g_mime_stream_file_set_owner (mime_stream, FALSE);
} else if (svvaltype == SVt_PVMG) { // possible STDIN/STDOUT etc.
int fd0 = (int)SvIV( svval );
int fd;
if (fd0 < 0 || (fd = dup(fd0)) == -1)
croak("MIME::Fast::Stream::new: Can not duplicate a FILE pointer");
mime_stream = g_mime_stream_fs_new(fd);
if (!mime_stream) {
close(fd);
XSRETURN_UNDEF;
}
// g_mime_stream_fs_set_owner (mime_stream, FALSE);
} else if (SvPOK(svval)) {
data = (char *)SvPV(svmixed, len);
mime_stream = g_mime_stream_mem_new_with_buffer(data,len);
} else {
croak("stream_new: Unknown type: %d", (int)svvaltype);
}
}
RETVAL = mime_stream;
plist = g_list_prepend(plist, RETVAL);
OUTPUT:
RETVAL
CASE: items == 4
const char * Class
SV * svmixed
off_t start
off_t end
PREINIT:
GMimeStream *mime_stream = NULL;
svtype svvaltype;
SV * svval;
CODE:
svval = svmixed;
if (SvROK(svmixed)) {
svval = SvRV(svmixed);
}
svvaltype = SvTYPE(svval);
if (mime_stream == NULL) {
if (svvaltype == SVt_PVGV) { // possible FILE * handle
#ifdef USE_PERLIO
PerlIO *pio;
pio = IoIFP(sv_2io(svval));
if (!pio) {
croak("MIME::Fast::Stream::new: the argument you gave is not a FILE pointer");
}
mime_stream = g_mime_stream_perlio_new(pio);
g_mime_stream_perlio_set_owner(GMIME_STREAM_PERLIO(mime_stream), FALSE);
if (!mime_stream) {
XSRETURN_UNDEF;
}
#else
PerlIO *pio;
FILE *fp;
int fd;
pio = IoIFP(sv_2io(svval));
if (!pio || !(fp = PerlIO_findFILE(pio))) {
croak("MIME::Fast::Stream::new: the argument you gave is not a FILE pointer");
}
fd = dup(fileno(fp));
if (fd == -1)
croak("MIME::Fast::Stream::new: Can not duplicate a FILE pointer");
// mime_stream = g_mime_stream_file_new_with_bounds(fp, start, end);
mime_stream = g_mime_stream_fs_new_with_bounds(fd, start, end);
if (!mime_stream) {
close(fd);
XSRETURN_UNDEF;
}
// g_mime_stream_file_set_owner (mime_stream, FALSE);
#endif
} else if (svvaltype == SVt_PVMG) { // possible STDIN/STDOUT etc.
int fd0 = (int)SvIV( svval );
int fd;
if (fd0 < 0 || (fd = dup(fd0)) == -1)
croak("MIME::Fast::Stream::new: Can not duplicate a FILE pointer");
mime_stream = g_mime_stream_fs_new_with_bounds(fd, start, end);
if (!mime_stream) {
close(fd);
XSRETURN_UNDEF;
}
// g_mime_stream_fs_set_owner (mime_stream, FALSE);
} else if (SvPOK(svval)) {
warn ("stream_new: bounds for string are not supported");
} else {
croak("stream_new: Unknown type: %d", (int)svvaltype);
}
}
RETVAL = mime_stream;
plist = g_list_prepend(plist, RETVAL);
OUTPUT:
RETVAL
void
DESTROY(mime_stream)
MIME::Fast::Stream mime_stream
CODE:
if (g_list_find(plist,mime_stream)) {
g_mime_stream_unref(mime_stream);
plist = g_list_remove(plist, mime_stream);
}
long
g_mime_stream_write_string(mime_stream, str)
MIME::Fast::Stream mime_stream
char * str
CODE:
RETVAL = g_mime_stream_write_string(mime_stream, str);
OUTPUT:
RETVAL
ssize_t
g_mime_stream_write_to_stream(mime_stream_src, svstream)
MIME::Fast::Stream mime_stream_src
SV * svstream
PREINIT:
GMimeStream * mime_stream_dst;
CODE:
if (sv_derived_from(svstream, "MIME::Fast::Stream")) {
IV tmp = SvIV((SV*)SvRV(svstream));
mime_stream_dst = INT2PTR(MIME__Fast__Stream,tmp);
}
else
Perl_croak(aTHX_ "mime_stream is not of type MIME::Fast::Stream");
RETVAL = g_mime_stream_write_to_stream(mime_stream_src, mime_stream_dst);
OUTPUT:
RETVAL
# raw stream methods
ssize_t
g_mime_stream_read(mime_stream, buf, len)
MIME::Fast::Stream mime_stream
SV * buf
size_t len
PREINIT:
char *str;
CODE:
if (SvREADONLY(buf) && PL_curcop != &PL_compiling)
croak("MIME::Fast::Stream->read: buffer parameter is read-only");
else
if (!SvUPGRADE(buf, SVt_PV))
croak("MIME::Fast::Stream->read: cannot use buf argument as lvalue");
SvPOK_only(buf);
SvCUR_set(buf, 0);
str = (char *)SvGROW(buf, len + 1);
RETVAL = g_mime_stream_read(mime_stream, str, len);
if (RETVAL > 0)
{
SvCUR_set(buf, RETVAL);
*SvEND(buf) = '\0';
}
OUTPUT:
buf
RETVAL
ssize_t
g_mime_stream_write(mime_stream, buf, len)
MIME::Fast::Stream mime_stream
char *buf
size_t len
int
g_mime_stream_flush(mime_stream)
MIME::Fast::Stream mime_stream
int
g_mime_stream_close(mime_stream)
MIME::Fast::Stream mime_stream
gboolean
g_mime_stream_eos(mime_stream)
MIME::Fast::Stream mime_stream
int
g_mime_stream_reset(mime_stream)
MIME::Fast::Stream mime_stream
off_t
g_mime_stream_seek(mime_stream, offset, whence)
MIME::Fast::Stream mime_stream
off_t offset
MIME::Fast::SeekWhence whence
off_t
g_mime_stream_tell(mime_stream)
MIME::Fast::Stream mime_stream
ssize_t
g_mime_stream_length(mime_stream)
MIME::Fast::Stream mime_stream
MIME::Fast::Stream
g_mime_stream_substream(mime_stream, start, end)
MIME::Fast::Stream mime_stream
off_t start
off_t end
CODE:
RETVAL = g_mime_stream_substream(mime_stream, start, end);
plist = g_list_prepend(plist, RETVAL);
OUTPUT:
RETVAL
void
g_mime_stream_set_bounds(mime_stream, start, end)
MIME::Fast::Stream mime_stream
off_t start
off_t end