The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
TYPEMAP
gpgme_ctx_t	GPGME_CTX_T
perl_gpgme_ctx_or_null_t	PERL_GPGME_CTX_OR_NULL_T
gpgme_protocol_t	GPGME_PROTOCOL_T
gpgme_keylist_mode_t	GPGME_KEYLIST_MODE_T
gpgme_data_t	GPGME_DATA_T
gpgme_sig_mode_t	GPGME_SIG_MODE_T
gpgme_key_t	GPGME_KEY_T
const gpgme_key_t	GPGME_KEY_T
gpgme_validity_t	GPGME_VALIDITY_T
gpgme_sig_notation_flags_t	GPGME_SIG_NOTATION_FLAGS_T

OUTPUT

GPGME_CTX_T
	$arg = perl_gpgme_new_sv_from_ptr ($var, \"Crypt::GpgME\");

GPGME_PROTOCOL_T
	$arg = perl_gpgme_protocol_to_string ($var);

GPGME_KEYLIST_MODE_T
	{
		AV *av = newAV ();

		if ($var & GPGME_KEYLIST_MODE_LOCAL) {
			av_push (av, newSVpvn (\"local\", 5));
		}
		if ($var & GPGME_KEYLIST_MODE_EXTERN) {
			av_push (av, newSVpvn (\"extern\", 6));
		}
		if ($var & GPGME_KEYLIST_MODE_SIGS) {
			av_push (av, newSVpvn (\"sigs\", 4));
		}
		if ($var & GPGME_KEYLIST_MODE_SIG_NOTATIONS) {
			av_push (av, newSVpvn (\"sig-notations\", 13));
		}
		if ($var & GPGME_KEYLIST_MODE_VALIDATE) {
			av_push (av, newSVpvn (\"validate\", 8));
		}

		$arg = newRV_noinc ((SV *)av);
	}

GPGME_DATA_T
	$arg = perl_gpgme_data_to_sv ($var);

GPGME_VALIDITY_T
	$arg = perl_gpgme_validity_to_string ($var);

GPGME_KEY_T
	$arg = perl_gpgme_new_sv_from_ptr ($var, \"Crypt::GpgME::Key\");

INPUT

GPGME_CTX_T
	$var = ($type)perl_gpgme_get_ptr_from_sv ($arg, \"Crypt::GpgME\");

PERL_GPGME_CTX_OR_NULL_T
	if (!$arg || !SvOK ($arg) || !SvROK ($arg)) {
		$var = NULL;
	}
	else {
		$var = ($type)perl_gpgme_get_ptr_from_sv ($arg, \"Crypt::GpgME\");
	}

GPGME_PROTOCOL_T
	{
		char *protocol = SvPV_nolen ($arg);

		if (strcasecmp (protocol, \"openpgp\") == 0) {
			$var = GPGME_PROTOCOL_OpenPGP;
		}
		else if (strcasecmp (protocol, \"cms\") == 0) {
			$var = GPGME_PROTOCOL_CMS;
		}
		else {
			croak (\"unknown protocol\");
		}
	}

GPGME_KEYLIST_MODE_T
	{
		AV *av;
		int i;

		if (!$arg || !SvOK ($arg) || !SvROK ($arg) || !(SvTYPE (SvRV ($arg)) == SVt_PVAV)) {
			croak (\"not an array reference\");
		}

		av = (AV *)SvRV ($arg);
		$var = 0;

		for (i = 0; i <= av_len (av); i++) {
			char *keylist_mode;
			SV **ae = av_fetch (av, i, 0);

			if (!ae) {
				croak (\"failed to fetch array element\");
			}

			keylist_mode = SvPV_nolen (*ae);

			if (strcasecmp (keylist_mode, \"local\") == 0) {
				$var |= GPGME_KEYLIST_MODE_LOCAL;
			}
			else if (strcasecmp (keylist_mode, \"extern\") == 0) {
				$var |= GPGME_KEYLIST_MODE_EXTERN;
			}
			else if (strcasecmp (keylist_mode, \"sigs\") == 0) {
				$var |= GPGME_KEYLIST_MODE_SIGS;
			}
			else if (strcasecmp (keylist_mode, \"sig-notations\") == 0) {
				$var |= GPGME_KEYLIST_MODE_SIG_NOTATIONS;
			}
			else if (strcasecmp (keylist_mode, \"validate\") == 0) {
				$var |= GPGME_KEYLIST_MODE_VALIDATE;
			}
			else {
				croak (\"unknown keylist mode\");
			}
		}

	}

GPGME_DATA_T
	{
		SV *tmp;

		if (!SvROK ($arg)) {
			tmp = perl_gpgme_data_io_handle_from_scalar ($arg);
		}
		else {
			tmp = $arg;
		}

		if (tmp && SvOK (tmp)  && sv_isobject (tmp) && sv_derived_from (tmp, \"IO::Handle\")) {
			$var = ($type)perl_gpgme_data_from_io_handle (tmp);
		}
		else {
			croak (\"not a valid IO::Handle\");
		}
	}

GPGME_SIG_MODE_T
	{
		char *sig_mode = SvPV_nolen ($arg);

		if (strcasecmp (sig_mode, \"normal\") == 0) {
			$var = GPGME_SIG_MODE_NORMAL;
		}
		else if (strcasecmp (sig_mode, \"detach\") == 0) {
			$var = GPGME_SIG_MODE_DETACH;
		}
		else if (strcasecmp (sig_mode, \"clear\") == 0) {
			$var = GPGME_SIG_MODE_CLEAR;
		}
		else {
			croak (\"unknown sig mode\");
		}
	}

GPGME_KEY_T
	$var = ($type)perl_gpgme_get_ptr_from_sv ($arg, \"Crypt::GpgME::Key\");

GPGME_SIG_NOTATION_FLAGS_T
	if (!$arg || !SvOK ($arg) || !SvROK ($arg) || !(SvTYPE (SvRV ($arg)) != SVt_PVAV)) {
		croak (\"not a valid flags array reference\");
	}

	{
		AV *av;
		SV **sv;
		int i, len;
		char *str;

		av = (AV *)SvRV ($arg);
		len = av_len (av);

		for (i = 0; i <= len; i++) {
			sv = av_fetch (av, i, 0);
			if (!sv) {
				croak (\"failed to fetch array element\");
			}

			str = SvPV_nolen (*sv);
			if (strcasecmp (str, \"human-readable\") == 0) {
				$var |= GPGME_SIG_NOTATION_HUMAN_READABLE;
			}
			else if (strcasecmp (str, \"critical\") == 0) {
				$var |= GPGME_SIG_NOTATION_CRITICAL;
			}
			else {
				croak (\"invalid notation flag\");
			}
		}
	}