Net-Curl
view release on metacpan or search on metacpan
Curl_Easy.xsh view on Meta::CPAN
{
if ( mg->mg_ptr ) {
/* prevent recursive destruction */
SvREFCNT( sv ) = 1 << 30;
perl_curl_easy_delete( aTHX_ (void *)mg->mg_ptr );
SvREFCNT( sv ) = 0;
}
return 0;
}
static MGVTBL perl_curl_easy_vtbl = {
NULL, NULL, NULL, NULL
,perl_curl_easy_magic_free
,NULL
,perl_curl_any_magic_nodup
#ifdef MGf_LOCAL
,NULL
#endif
};
static void
perl_curl_easy_preset( perl_curl_easy_t *easy )
{
/* configure curl to always callback to the XS interface layer */
curl_easy_setopt( easy->handle, CURLOPT_WRITEFUNCTION, cb_easy_write );
curl_easy_setopt( easy->handle, CURLOPT_READFUNCTION, cb_easy_read );
/* set our own object as the context for all curl callbacks */
curl_easy_setopt( easy->handle, CURLOPT_FILE, easy );
curl_easy_setopt( easy->handle, CURLOPT_INFILE, easy );
/* we always collect this, in case it's wanted */
curl_easy_setopt( easy->handle, CURLOPT_ERRORBUFFER, easy->errbuf );
curl_easy_setopt( easy->handle, CURLOPT_PRIVATE, (void *) easy );
}
#define EASY_DIE( ret ) \
STMT_START { \
CURLcode code = (ret); \
if ( code != CURLE_OK ) \
die_code( "Easy", code ); \
} STMT_END
MODULE = Net::Curl PACKAGE = Net::Curl::Easy
INCLUDE: const-easy-xs.inc
PROTOTYPES: ENABLE
void
new( sclass="Net::Curl::Easy", base=HASHREF_BY_DEFAULT )
const char *sclass
SV *base
PREINIT:
perl_curl_easy_t *easy;
HV *stash;
PPCODE:
if ( ! SvOK( base ) || ! SvROK( base ) )
croak( "object base must be a valid reference\n" );
easy = perl_curl_easy_new();
perl_curl_easy_preset( easy );
perl_curl_setptr( aTHX_ base, &perl_curl_easy_vtbl, easy );
stash = gv_stashpv( sclass, 0 );
ST(0) = sv_bless( base, stash );
easy->perl_self = SvRV( ST(0) );
XSRETURN(1);
void
duphandle( easy, base=HASHREF_BY_DEFAULT )
Net::Curl::Easy easy
SV *base
PREINIT:
perl_curl_easy_t *clone;
const char *sclass;
perl_curl_easy_callback_code_t i;
HV *stash;
PPCODE:
if ( ! SvOK( base ) || ! SvROK( base ) )
croak( "object base must be a valid reference\n" );
sclass = sv_reftype( SvRV( ST(0) ), TRUE );
clone = perl_curl_easy_duphandle( easy );
perl_curl_easy_preset( clone );
if ( easy->cb[ CB_EASY_HEADER ].func
|| easy->cb[ CB_EASY_HEADER ].data ) {
curl_easy_setopt( clone->handle, CURLOPT_HEADERFUNCTION, cb_easy_header );
curl_easy_setopt( clone->handle, CURLOPT_WRITEHEADER, clone );
}
if ( easy->cb[ CB_EASY_PROGRESS ].func ) {
curl_easy_setopt( clone->handle, CURLOPT_PROGRESSFUNCTION, cb_easy_progress );
curl_easy_setopt( clone->handle, CURLOPT_PROGRESSDATA, clone );
}
//
#ifdef CURLOPT_XFERINFOFUNCTION
# ifdef CURLOPT_XFERINFODATA
if ( easy->cb[ CB_EASY_XFERINFO ].func ) {
curl_easy_setopt( clone->handle, CURLOPT_XFERINFOFUNCTION, cb_easy_xferinfo );
curl_easy_setopt( clone->handle, CURLOPT_XFERINFODATA, clone );
}
# endif
#endif
if ( easy->cb[ CB_EASY_DEBUG ].func ) {
curl_easy_setopt( clone->handle, CURLOPT_DEBUGFUNCTION, cb_easy_debug );
curl_easy_setopt( clone->handle, CURLOPT_DEBUGDATA, clone );
}
for( i = 0; i < CB_EASY_LAST; i++ ) {
SvREPLACE( clone->cb[i].func, easy->cb[i].func );
SvREPLACE( clone->cb[i].data, easy->cb[i].data );
};
/* clone strings and set */
if ( easy->strings ) {
simplell_t *in, **out;
in = easy->strings;
out = &clone->strings;
do {
Newx( *out, 1, simplell_t );
(*out)->next = NULL;
(*out)->key = in->key;
(*out)->value = savepv( in->value );
curl_easy_setopt( clone->handle, in->key, (*out)->value );
out = &(*out)->next;
in = in->next;
} while ( in != NULL );
}
/* clone slists and set */
if ( easy->slists ) {
simplell_t *in, **out;
struct curl_slist *sin, *sout;
in = easy->slists;
( run in 0.452 second using v1.01-cache-2.11-cpan-5511b514fd6 )