mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-04-10 19:15:13 +00:00
1034 lines
31 KiB
Plaintext
1034 lines
31 KiB
Plaintext
/* poppler-form-field.cc: glib interface to poppler
|
|
*
|
|
* Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
|
|
* Copyright (C) 2006 Julien Rebetez
|
|
* Copyright (C) 2020 Oliver Sander <oliver.sander@tu-dresden.de>
|
|
* Copyright (C) 2021 André Guerreiro <aguerreiro1985@gmail.com>
|
|
* Copyright (C) 2021 Marek Kasik <mkasik@redhat.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include <memory>
|
|
|
|
#include "poppler.h"
|
|
#include "poppler-private.h"
|
|
|
|
/**
|
|
* SECTION:poppler-form-field
|
|
* @short_description: Form Field
|
|
* @title: PopplerFormField
|
|
*/
|
|
|
|
typedef struct _PopplerFormFieldClass PopplerFormFieldClass;
|
|
struct _PopplerFormFieldClass
|
|
{
|
|
GObjectClass parent_class;
|
|
};
|
|
|
|
G_DEFINE_TYPE(PopplerFormField, poppler_form_field, G_TYPE_OBJECT)
|
|
|
|
static void poppler_form_field_finalize(GObject *object)
|
|
{
|
|
PopplerFormField *field = POPPLER_FORM_FIELD(object);
|
|
|
|
if (field->document) {
|
|
g_object_unref(field->document);
|
|
field->document = nullptr;
|
|
}
|
|
if (field->action) {
|
|
poppler_action_free(field->action);
|
|
field->action = nullptr;
|
|
}
|
|
field->widget = nullptr;
|
|
|
|
G_OBJECT_CLASS(poppler_form_field_parent_class)->finalize(object);
|
|
}
|
|
|
|
static void poppler_form_field_init(PopplerFormField *field) { }
|
|
|
|
static void poppler_form_field_class_init(PopplerFormFieldClass *klass)
|
|
{
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
|
|
|
|
gobject_class->finalize = poppler_form_field_finalize;
|
|
}
|
|
|
|
PopplerFormField *_poppler_form_field_new(PopplerDocument *document, FormWidget *field)
|
|
{
|
|
PopplerFormField *poppler_field;
|
|
|
|
g_return_val_if_fail(POPPLER_IS_DOCUMENT(document), NULL);
|
|
g_return_val_if_fail(field != nullptr, NULL);
|
|
|
|
poppler_field = POPPLER_FORM_FIELD(g_object_new(POPPLER_TYPE_FORM_FIELD, nullptr));
|
|
|
|
poppler_field->document = (PopplerDocument *)g_object_ref(document);
|
|
poppler_field->widget = field;
|
|
|
|
return poppler_field;
|
|
}
|
|
|
|
/* Public methods */
|
|
/**
|
|
* poppler_form_field_get_field_type:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the type of @field
|
|
*
|
|
* Return value: #PopplerFormFieldType of @field
|
|
**/
|
|
PopplerFormFieldType poppler_form_field_get_field_type(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), POPPLER_FORM_FIELD_UNKNOWN);
|
|
|
|
switch (field->widget->getType()) {
|
|
case formButton:
|
|
return POPPLER_FORM_FIELD_BUTTON;
|
|
case formText:
|
|
return POPPLER_FORM_FIELD_TEXT;
|
|
case formChoice:
|
|
return POPPLER_FORM_FIELD_CHOICE;
|
|
case formSignature:
|
|
return POPPLER_FORM_FIELD_SIGNATURE;
|
|
default:
|
|
g_warning("Unsupported Form Field Type");
|
|
}
|
|
|
|
return POPPLER_FORM_FIELD_UNKNOWN;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_id:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the id of @field
|
|
*
|
|
* Return value: the id of @field
|
|
**/
|
|
gint poppler_form_field_get_id(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), -1);
|
|
|
|
return field->widget->getID();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_font_size:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the font size of @field
|
|
*
|
|
* WARNING: This function always returns 0. Contact the poppler
|
|
* mailing list if you're interested in implementing it properly
|
|
*
|
|
* Return value: the font size of @field
|
|
**/
|
|
gdouble poppler_form_field_get_font_size(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), 0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_is_read_only:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Checks whether @field is read only
|
|
*
|
|
* Return value: %TRUE if @field is read only
|
|
**/
|
|
gboolean poppler_form_field_is_read_only(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), FALSE);
|
|
|
|
return field->widget->isReadOnly();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_action:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Retrieves the action (#PopplerAction) that shall be
|
|
* performed when @field is activated, or %NULL
|
|
*
|
|
* Return value: (transfer none): the action to perform. The returned
|
|
* object is owned by @field and should not be freed
|
|
*
|
|
* Since: 0.18
|
|
*/
|
|
PopplerAction *poppler_form_field_get_action(PopplerFormField *field)
|
|
{
|
|
LinkAction *action;
|
|
|
|
if (field->action) {
|
|
return field->action;
|
|
}
|
|
|
|
action = field->widget->getActivationAction();
|
|
if (!action) {
|
|
return nullptr;
|
|
}
|
|
|
|
field->action = _poppler_action_new(field->document, action, nullptr);
|
|
|
|
return field->action;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_additional_action:
|
|
* @field: a #PopplerFormField
|
|
* @type: the type of additional action
|
|
*
|
|
* Retrieves the action (#PopplerAction) that shall be performed when
|
|
* an additional action is triggered on @field, or %NULL.
|
|
*
|
|
* Return value: (transfer none): the action to perform. The returned
|
|
* object is owned by @field and should not be freed.
|
|
*
|
|
*
|
|
* Since: 0.72
|
|
*/
|
|
PopplerAction *poppler_form_field_get_additional_action(PopplerFormField *field, PopplerAdditionalActionType type)
|
|
{
|
|
Annot::FormAdditionalActionsType form_action;
|
|
PopplerAction **action;
|
|
|
|
switch (type) {
|
|
case POPPLER_ADDITIONAL_ACTION_FIELD_MODIFIED:
|
|
form_action = Annot::actionFieldModified;
|
|
action = &field->field_modified_action;
|
|
break;
|
|
case POPPLER_ADDITIONAL_ACTION_FORMAT_FIELD:
|
|
form_action = Annot::actionFormatField;
|
|
action = &field->format_field_action;
|
|
break;
|
|
case POPPLER_ADDITIONAL_ACTION_VALIDATE_FIELD:
|
|
form_action = Annot::actionValidateField;
|
|
action = &field->validate_field_action;
|
|
break;
|
|
case POPPLER_ADDITIONAL_ACTION_CALCULATE_FIELD:
|
|
form_action = Annot::actionCalculateField;
|
|
action = &field->calculate_field_action;
|
|
break;
|
|
default:
|
|
g_return_val_if_reached(nullptr);
|
|
return nullptr;
|
|
}
|
|
|
|
if (*action) {
|
|
return *action;
|
|
}
|
|
|
|
std::unique_ptr<LinkAction> link_action = field->widget->getAdditionalAction(form_action);
|
|
if (!link_action) {
|
|
return nullptr;
|
|
}
|
|
|
|
*action = _poppler_action_new(nullptr, link_action.get(), nullptr);
|
|
|
|
return *action;
|
|
}
|
|
|
|
/* Button Field */
|
|
/**
|
|
* poppler_form_field_button_get_button_type:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the button type of @field
|
|
*
|
|
* Return value: #PopplerFormButtonType of @field
|
|
**/
|
|
PopplerFormButtonType poppler_form_field_button_get_button_type(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formButton, POPPLER_FORM_BUTTON_PUSH);
|
|
|
|
switch (static_cast<FormWidgetButton *>(field->widget)->getButtonType()) {
|
|
case formButtonPush:
|
|
return POPPLER_FORM_BUTTON_PUSH;
|
|
case formButtonCheck:
|
|
return POPPLER_FORM_BUTTON_CHECK;
|
|
case formButtonRadio:
|
|
return POPPLER_FORM_BUTTON_RADIO;
|
|
default:
|
|
g_assert_not_reached();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_button_get_state:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Queries a #PopplerFormField and returns its current state. Returns %TRUE if
|
|
* @field is pressed in and %FALSE if it is raised.
|
|
*
|
|
* Return value: current state of @field
|
|
**/
|
|
gboolean poppler_form_field_button_get_state(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formButton, FALSE);
|
|
|
|
return static_cast<FormWidgetButton *>(field->widget)->getState();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_button_set_state:
|
|
* @field: a #PopplerFormField
|
|
* @state: %TRUE or %FALSE
|
|
*
|
|
* Sets the status of @field. Set to %TRUE if you want the #PopplerFormField
|
|
* to be 'pressed in', and %FALSE to raise it.
|
|
**/
|
|
void poppler_form_field_button_set_state(PopplerFormField *field, gboolean state)
|
|
{
|
|
g_return_if_fail(field->widget->getType() == formButton);
|
|
|
|
static_cast<FormWidgetButton *>(field->widget)->setState((bool)state);
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_partial_name:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the partial name of @field.
|
|
*
|
|
* Return value: a new allocated string. It must be freed with g_free() when done.
|
|
*
|
|
* Since: 0.16
|
|
**/
|
|
gchar *poppler_form_field_get_partial_name(PopplerFormField *field)
|
|
{
|
|
const GooString *tmp;
|
|
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), NULL);
|
|
|
|
tmp = field->widget->getPartialName();
|
|
|
|
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_mapping_name:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the mapping name of @field that is used when
|
|
* exporting interactive form field data from the document
|
|
*
|
|
* Return value: a new allocated string. It must be freed with g_free() when done.
|
|
*
|
|
* Since: 0.16
|
|
**/
|
|
gchar *poppler_form_field_get_mapping_name(PopplerFormField *field)
|
|
{
|
|
const GooString *tmp;
|
|
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), NULL);
|
|
|
|
tmp = field->widget->getMappingName();
|
|
|
|
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_name:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the fully qualified name of @field. It's constructed by concatenating
|
|
* the partial field names of the field and all of its ancestors.
|
|
*
|
|
* Return value: a new allocated string. It must be freed with g_free() when done.
|
|
*
|
|
* Since: 0.16
|
|
**/
|
|
gchar *poppler_form_field_get_name(PopplerFormField *field)
|
|
{
|
|
GooString *tmp;
|
|
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), NULL);
|
|
|
|
tmp = field->widget->getFullyQualifiedName();
|
|
|
|
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_get_alternate_ui_name:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the alternate ui name of @field. This name is also commonly
|
|
* used by pdf producers/readers to show it as a tooltip when @field area
|
|
* is hovered by a pointing device (eg. mouse).
|
|
*
|
|
* Return value: a new allocated string. It must be freed with g_free() when done.
|
|
*
|
|
* Since: 0.88
|
|
**/
|
|
gchar *poppler_form_field_get_alternate_ui_name(PopplerFormField *field)
|
|
{
|
|
const GooString *tmp;
|
|
|
|
g_return_val_if_fail(POPPLER_IS_FORM_FIELD(field), NULL);
|
|
|
|
tmp = field->widget->getAlternateUiName();
|
|
|
|
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
|
|
}
|
|
|
|
/**
|
|
* PopplerSignatureInfo:
|
|
*
|
|
* PopplerSignatureInfo contains detailed info about a signature
|
|
* contained in a form field.
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
struct _PopplerSignatureInfo
|
|
{
|
|
PopplerSignatureStatus sig_status;
|
|
PopplerCertificateStatus cert_status;
|
|
char *signer_name;
|
|
GDateTime *local_signing_time;
|
|
};
|
|
|
|
static PopplerSignatureInfo *_poppler_form_field_signature_validate(PopplerFormField *field, PopplerSignatureValidationFlags flags, gboolean force_revalidation, GError **error)
|
|
{
|
|
FormFieldSignature *sig_field;
|
|
SignatureInfo *sig_info;
|
|
PopplerSignatureInfo *poppler_sig_info;
|
|
|
|
if (poppler_form_field_get_field_type(field) != POPPLER_FORM_FIELD_SIGNATURE) {
|
|
g_set_error(error, POPPLER_ERROR, POPPLER_ERROR_INVALID, "Wrong FormField type");
|
|
return nullptr;
|
|
}
|
|
|
|
sig_field = static_cast<FormFieldSignature *>(field->widget->getField());
|
|
|
|
sig_info = sig_field->validateSignature(flags & POPPLER_SIGNATURE_VALIDATION_FLAG_VALIDATE_CERTIFICATE, force_revalidation, -1, flags & POPPLER_SIGNATURE_VALIDATION_FLAG_WITHOUT_OCSP_REVOCATION_CHECK,
|
|
flags & POPPLER_SIGNATURE_VALIDATION_FLAG_USE_AIA_CERTIFICATE_FETCH);
|
|
|
|
poppler_sig_info = g_new0(PopplerSignatureInfo, 1);
|
|
switch (sig_info->getSignatureValStatus()) {
|
|
case SIGNATURE_VALID:
|
|
poppler_sig_info->sig_status = POPPLER_SIGNATURE_VALID;
|
|
break;
|
|
case SIGNATURE_INVALID:
|
|
poppler_sig_info->sig_status = POPPLER_SIGNATURE_INVALID;
|
|
break;
|
|
case SIGNATURE_DIGEST_MISMATCH:
|
|
poppler_sig_info->sig_status = POPPLER_SIGNATURE_DIGEST_MISMATCH;
|
|
break;
|
|
case SIGNATURE_DECODING_ERROR:
|
|
poppler_sig_info->sig_status = POPPLER_SIGNATURE_DECODING_ERROR;
|
|
break;
|
|
case SIGNATURE_GENERIC_ERROR:
|
|
poppler_sig_info->sig_status = POPPLER_SIGNATURE_GENERIC_ERROR;
|
|
break;
|
|
case SIGNATURE_NOT_FOUND:
|
|
poppler_sig_info->sig_status = POPPLER_SIGNATURE_NOT_FOUND;
|
|
break;
|
|
case SIGNATURE_NOT_VERIFIED:
|
|
poppler_sig_info->sig_status = POPPLER_SIGNATURE_NOT_VERIFIED;
|
|
break;
|
|
}
|
|
|
|
switch (sig_info->getCertificateValStatus()) {
|
|
case CERTIFICATE_TRUSTED:
|
|
poppler_sig_info->cert_status = POPPLER_CERTIFICATE_TRUSTED;
|
|
break;
|
|
case CERTIFICATE_UNTRUSTED_ISSUER:
|
|
poppler_sig_info->cert_status = POPPLER_CERTIFICATE_UNTRUSTED_ISSUER;
|
|
break;
|
|
case CERTIFICATE_UNKNOWN_ISSUER:
|
|
poppler_sig_info->cert_status = POPPLER_CERTIFICATE_UNKNOWN_ISSUER;
|
|
break;
|
|
case CERTIFICATE_REVOKED:
|
|
poppler_sig_info->cert_status = POPPLER_CERTIFICATE_REVOKED;
|
|
break;
|
|
case CERTIFICATE_EXPIRED:
|
|
poppler_sig_info->cert_status = POPPLER_CERTIFICATE_EXPIRED;
|
|
break;
|
|
case CERTIFICATE_GENERIC_ERROR:
|
|
poppler_sig_info->cert_status = POPPLER_CERTIFICATE_GENERIC_ERROR;
|
|
break;
|
|
case CERTIFICATE_NOT_VERIFIED:
|
|
poppler_sig_info->cert_status = POPPLER_CERTIFICATE_NOT_VERIFIED;
|
|
break;
|
|
}
|
|
|
|
poppler_sig_info->signer_name = g_strdup(sig_info->getSignerName());
|
|
poppler_sig_info->local_signing_time = g_date_time_new_from_unix_local(sig_info->getSigningTime());
|
|
|
|
return poppler_sig_info;
|
|
}
|
|
|
|
static void signature_validate_thread(GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable)
|
|
{
|
|
PopplerSignatureValidationFlags flags = (PopplerSignatureValidationFlags)GPOINTER_TO_INT(task_data);
|
|
PopplerSignatureInfo *signature_info;
|
|
PopplerFormField *field = (PopplerFormField *)source_object;
|
|
GError *error = nullptr;
|
|
|
|
signature_info = _poppler_form_field_signature_validate(field, flags, FALSE, &error);
|
|
if (signature_info == nullptr && error != nullptr) {
|
|
g_task_return_error(task, error);
|
|
return;
|
|
}
|
|
|
|
if (g_task_set_return_on_cancel(task, FALSE)) {
|
|
g_task_return_pointer(task, signature_info, (GDestroyNotify)poppler_signature_info_free);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_signature_validate_sync:
|
|
* @field: a #PopplerFormField that represents a signature annotation
|
|
* @flags: #PopplerSignatureValidationFlags flags influencing process of validation of the field signature
|
|
* @cancellable: (nullable): optional #GCancellable object
|
|
* @error: a #GError
|
|
*
|
|
* Synchronously validates the cryptographic signature contained in @signature_field.
|
|
*
|
|
* Return value: (transfer full): a #PopplerSignatureInfo structure containing signature metadata and validation status
|
|
* Free the returned structure with poppler_signature_info_free().
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
PopplerSignatureInfo *poppler_form_field_signature_validate_sync(PopplerFormField *field, PopplerSignatureValidationFlags flags, GCancellable *cancellable, GError **error)
|
|
{
|
|
PopplerSignatureInfo *signature_info;
|
|
GTask *task;
|
|
|
|
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
|
|
|
|
task = g_task_new(field, cancellable, nullptr, nullptr);
|
|
g_task_set_task_data(task, GINT_TO_POINTER(flags), nullptr);
|
|
g_task_set_return_on_cancel(task, TRUE);
|
|
|
|
g_task_run_in_thread_sync(task, signature_validate_thread);
|
|
|
|
signature_info = (PopplerSignatureInfo *)g_task_propagate_pointer(task, error);
|
|
g_object_unref(task);
|
|
|
|
return signature_info;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_signature_validate_async:
|
|
* @field: a #PopplerFormField that represents a signature annotation
|
|
* @flags: #PopplerSignatureValidationFlags flags influencing process of validation of the field signature
|
|
* @cancellable: (nullable): optional #GCancellable object
|
|
* @callback: (scope async): a #GAsyncReadyCallback to call when the signature is validated
|
|
* @user_data: (closure): the data to pass to callback function
|
|
*
|
|
* Asynchronously validates the cryptographic signature contained in @signature_field.
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
void poppler_form_field_signature_validate_async(PopplerFormField *field, PopplerSignatureValidationFlags flags, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
|
|
{
|
|
GTask *task;
|
|
|
|
task = g_task_new(field, cancellable, callback, user_data);
|
|
g_task_set_task_data(task, GINT_TO_POINTER(flags), nullptr);
|
|
g_task_set_return_on_cancel(task, TRUE);
|
|
|
|
g_task_run_in_thread(task, signature_validate_thread);
|
|
|
|
g_object_unref(task);
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_signature_validate_finish:
|
|
* @field: a #PopplerFormField that represents a signature annotation
|
|
* @result: a #GAsyncResult
|
|
* @error: a #GError
|
|
*
|
|
* Finishes validation of the cryptographic signature contained in @signature_field.
|
|
* See poppler_form_field_signature_validate_async().
|
|
*
|
|
* Return value: (transfer full): a #PopplerSignatureInfo structure containing signature metadata and validation status
|
|
* Free the returned structure with poppler_signature_info_free().
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
PopplerSignatureInfo *poppler_form_field_signature_validate_finish(PopplerFormField *field, GAsyncResult *result, GError **error)
|
|
{
|
|
g_return_val_if_fail(g_task_is_valid(result, field), NULL);
|
|
|
|
return (PopplerSignatureInfo *)g_task_propagate_pointer(G_TASK(result), error);
|
|
}
|
|
|
|
G_DEFINE_BOXED_TYPE(PopplerSignatureInfo, poppler_signature_info, poppler_signature_info_copy, poppler_signature_info_free)
|
|
|
|
/**
|
|
* poppler_signature_info_copy:
|
|
* @siginfo: a #PopplerSignatureInfo structure containing signature metadata and validation status
|
|
*
|
|
* Copies @siginfo, creating an identical #PopplerSignatureInfo.
|
|
*
|
|
* Return value: (transfer full): a new #PopplerSignatureInfo structure identical to @siginfo
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
PopplerSignatureInfo *poppler_signature_info_copy(const PopplerSignatureInfo *siginfo)
|
|
{
|
|
PopplerSignatureInfo *new_info;
|
|
|
|
g_return_val_if_fail(siginfo != NULL, NULL);
|
|
|
|
new_info = g_new(PopplerSignatureInfo, 1);
|
|
new_info->sig_status = siginfo->sig_status;
|
|
new_info->cert_status = siginfo->cert_status;
|
|
new_info->signer_name = g_strdup(siginfo->signer_name);
|
|
new_info->local_signing_time = g_date_time_ref(siginfo->local_signing_time);
|
|
|
|
return new_info;
|
|
}
|
|
|
|
/**
|
|
* poppler_signature_info_free:
|
|
* @siginfo: a #PopplerSignatureInfo structure containing signature metadata and validation status
|
|
*
|
|
* Frees @siginfo
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
void poppler_signature_info_free(PopplerSignatureInfo *siginfo)
|
|
{
|
|
if (siginfo == nullptr) {
|
|
return;
|
|
}
|
|
|
|
g_date_time_unref(siginfo->local_signing_time);
|
|
g_free(siginfo->signer_name);
|
|
g_free(siginfo);
|
|
}
|
|
|
|
/**
|
|
* poppler_signature_info_get_signature_status:
|
|
* @siginfo: a #PopplerSignatureInfo
|
|
*
|
|
* Returns status of the signature for given PopplerSignatureInfo.
|
|
*
|
|
* Return value: signature status of the signature
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
PopplerSignatureStatus poppler_signature_info_get_signature_status(const PopplerSignatureInfo *siginfo)
|
|
{
|
|
g_return_val_if_fail(siginfo != NULL, POPPLER_SIGNATURE_GENERIC_ERROR);
|
|
|
|
return siginfo->sig_status;
|
|
}
|
|
|
|
/**
|
|
* poppler_signature_info_get_certificate_status:
|
|
* @siginfo: a #PopplerSignatureInfo
|
|
*
|
|
* Returns status of the certificate for given PopplerSignatureInfo.
|
|
*
|
|
* Return value: certificate status of the signature
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
PopplerCertificateStatus poppler_signature_info_get_certificate_status(const PopplerSignatureInfo *siginfo)
|
|
{
|
|
g_return_val_if_fail(siginfo != NULL, POPPLER_CERTIFICATE_GENERIC_ERROR);
|
|
|
|
return siginfo->cert_status;
|
|
}
|
|
|
|
/**
|
|
* poppler_signature_info_get_signer_name:
|
|
* @siginfo: a #PopplerSignatureInfo
|
|
*
|
|
* Returns name of signer for given PopplerSignatureInfo.
|
|
*
|
|
* Return value: (transfer none): A string.
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
const gchar *poppler_signature_info_get_signer_name(const PopplerSignatureInfo *siginfo)
|
|
{
|
|
g_return_val_if_fail(siginfo != NULL, NULL);
|
|
|
|
return siginfo->signer_name;
|
|
}
|
|
|
|
/**
|
|
* poppler_signature_info_get_local_signing_time:
|
|
* @siginfo: a #PopplerSignatureInfo
|
|
*
|
|
* Returns local time of signing as GDateTime. This does not
|
|
* contain information about time zone since it has not been
|
|
* preserved during conversion.
|
|
* Do not modify returned value since it is internal to
|
|
* PopplerSignatureInfo.
|
|
*
|
|
* Return value: (transfer none): GDateTime
|
|
*
|
|
* Since: 21.12.0
|
|
**/
|
|
GDateTime *poppler_signature_info_get_local_signing_time(const PopplerSignatureInfo *siginfo)
|
|
{
|
|
g_return_val_if_fail(siginfo != NULL, NULL);
|
|
|
|
return siginfo->local_signing_time;
|
|
}
|
|
|
|
/* Text Field */
|
|
/**
|
|
* poppler_form_field_text_get_text_type:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the text type of @field.
|
|
*
|
|
* Return value: #PopplerFormTextType of @field
|
|
**/
|
|
PopplerFormTextType poppler_form_field_text_get_text_type(PopplerFormField *field)
|
|
{
|
|
FormWidgetText *text_field;
|
|
|
|
g_return_val_if_fail(field->widget->getType() == formText, POPPLER_FORM_TEXT_NORMAL);
|
|
|
|
text_field = static_cast<FormWidgetText *>(field->widget);
|
|
|
|
if (text_field->isMultiline()) {
|
|
return POPPLER_FORM_TEXT_MULTILINE;
|
|
} else if (text_field->isFileSelect()) {
|
|
return POPPLER_FORM_TEXT_FILE_SELECT;
|
|
}
|
|
|
|
return POPPLER_FORM_TEXT_NORMAL;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_text_get_text:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Retrieves the contents of @field.
|
|
*
|
|
* Return value: a new allocated string. It must be freed with g_free() when done.
|
|
**/
|
|
gchar *poppler_form_field_text_get_text(PopplerFormField *field)
|
|
{
|
|
FormWidgetText *text_field;
|
|
const GooString *tmp;
|
|
|
|
g_return_val_if_fail(field->widget->getType() == formText, NULL);
|
|
|
|
text_field = static_cast<FormWidgetText *>(field->widget);
|
|
tmp = text_field->getContent();
|
|
|
|
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_text_set_text:
|
|
* @field: a #PopplerFormField
|
|
* @text: the new text
|
|
*
|
|
* Sets the text in @field to the given value, replacing the current contents.
|
|
**/
|
|
void poppler_form_field_text_set_text(PopplerFormField *field, const gchar *text)
|
|
{
|
|
GooString *goo_tmp;
|
|
gchar *tmp;
|
|
gsize length = 0;
|
|
|
|
g_return_if_fail(field->widget->getType() == formText);
|
|
|
|
tmp = text ? g_convert(text, -1, "UTF-16BE", "UTF-8", nullptr, &length, nullptr) : nullptr;
|
|
goo_tmp = new GooString(tmp, length);
|
|
g_free(tmp);
|
|
static_cast<FormWidgetText *>(field->widget)->setContent(goo_tmp);
|
|
delete goo_tmp;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_text_get_max_len:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Retrieves the maximum allowed length of the text in @field
|
|
*
|
|
* Return value: the maximum allowed number of characters in @field, or -1 if there is no maximum.
|
|
**/
|
|
gint poppler_form_field_text_get_max_len(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formText, 0);
|
|
|
|
return static_cast<FormWidgetText *>(field->widget)->getMaxLen();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_text_do_spell_check:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Checks whether spell checking should be done for the contents of @field
|
|
*
|
|
* Return value: %TRUE if spell checking should be done for @field
|
|
**/
|
|
gboolean poppler_form_field_text_do_spell_check(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formText, FALSE);
|
|
|
|
return !static_cast<FormWidgetText *>(field->widget)->noSpellCheck();
|
|
}
|
|
|
|
gboolean poppler_form_field_text_do_scroll(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formText, FALSE);
|
|
|
|
return !static_cast<FormWidgetText *>(field->widget)->noScroll();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_text_is_rich_text:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Checks whether the contents of @field are rich text
|
|
*
|
|
* Return value: %TRUE if the contents of @field are rich text
|
|
**/
|
|
gboolean poppler_form_field_text_is_rich_text(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formText, FALSE);
|
|
|
|
return static_cast<FormWidgetText *>(field->widget)->isRichText();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_text_is_password:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Checks whether content of @field is a password and it must be hidden
|
|
*
|
|
* Return value: %TRUE if the content of @field is a password
|
|
**/
|
|
gboolean poppler_form_field_text_is_password(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formText, FALSE);
|
|
|
|
return static_cast<FormWidgetText *>(field->widget)->isPassword();
|
|
}
|
|
|
|
/* Choice Field */
|
|
/**
|
|
* poppler_form_field_choice_get_choice_type:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Gets the choice type of @field
|
|
*
|
|
* Return value: #PopplerFormChoiceType of @field
|
|
**/
|
|
PopplerFormChoiceType poppler_form_field_choice_get_choice_type(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, POPPLER_FORM_CHOICE_COMBO);
|
|
|
|
if (static_cast<FormWidgetChoice *>(field->widget)->isCombo()) {
|
|
return POPPLER_FORM_CHOICE_COMBO;
|
|
} else {
|
|
return POPPLER_FORM_CHOICE_LIST;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_is_editable:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Checks whether @field is editable
|
|
*
|
|
* Return value: %TRUE if @field is editable
|
|
**/
|
|
gboolean poppler_form_field_choice_is_editable(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, FALSE);
|
|
|
|
return static_cast<FormWidgetChoice *>(field->widget)->hasEdit();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_can_select_multiple:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Checks whether @field allows multiple choices to be selected
|
|
*
|
|
* Return value: %TRUE if @field allows multiple choices to be selected
|
|
**/
|
|
gboolean poppler_form_field_choice_can_select_multiple(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, FALSE);
|
|
|
|
return static_cast<FormWidgetChoice *>(field->widget)->isMultiSelect();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_do_spell_check:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Checks whether spell checking should be done for the contents of @field
|
|
*
|
|
* Return value: %TRUE if spell checking should be done for @field
|
|
**/
|
|
gboolean poppler_form_field_choice_do_spell_check(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, FALSE);
|
|
|
|
return !static_cast<FormWidgetChoice *>(field->widget)->noSpellCheck();
|
|
}
|
|
|
|
gboolean poppler_form_field_choice_commit_on_change(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, FALSE);
|
|
|
|
return static_cast<FormWidgetChoice *>(field->widget)->commitOnSelChange();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_get_n_items:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Returns the number of items on @field
|
|
*
|
|
* Return value: the number of items on @field
|
|
**/
|
|
gint poppler_form_field_choice_get_n_items(PopplerFormField *field)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, -1);
|
|
|
|
return static_cast<FormWidgetChoice *>(field->widget)->getNumChoices();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_get_item:
|
|
* @field: a #PopplerFormField
|
|
* @index: the index of the item
|
|
*
|
|
* Returns the contents of the item on @field at the given index
|
|
*
|
|
* Return value: a new allocated string. It must be freed with g_free() when done.
|
|
**/
|
|
gchar *poppler_form_field_choice_get_item(PopplerFormField *field, gint index)
|
|
{
|
|
const GooString *tmp;
|
|
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, NULL);
|
|
g_return_val_if_fail(index >= 0 && index < poppler_form_field_choice_get_n_items(field), NULL);
|
|
|
|
tmp = static_cast<FormWidgetChoice *>(field->widget)->getChoice(index);
|
|
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_is_item_selected:
|
|
* @field: a #PopplerFormField
|
|
* @index: the index of the item
|
|
*
|
|
* Checks whether the item at the given index on @field is currently selected
|
|
*
|
|
* Return value: %TRUE if item at @index is currently selected
|
|
**/
|
|
gboolean poppler_form_field_choice_is_item_selected(PopplerFormField *field, gint index)
|
|
{
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, FALSE);
|
|
g_return_val_if_fail(index >= 0 && index < poppler_form_field_choice_get_n_items(field), FALSE);
|
|
|
|
return static_cast<FormWidgetChoice *>(field->widget)->isSelected(index);
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_select_item:
|
|
* @field: a #PopplerFormField
|
|
* @index: the index of the item
|
|
*
|
|
* Selects the item at the given index on @field
|
|
**/
|
|
void poppler_form_field_choice_select_item(PopplerFormField *field, gint index)
|
|
{
|
|
g_return_if_fail(field->widget->getType() == formChoice);
|
|
g_return_if_fail(index >= 0 && index < poppler_form_field_choice_get_n_items(field));
|
|
|
|
static_cast<FormWidgetChoice *>(field->widget)->select(index);
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_unselect_all:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Unselects all the items on @field
|
|
**/
|
|
void poppler_form_field_choice_unselect_all(PopplerFormField *field)
|
|
{
|
|
g_return_if_fail(field->widget->getType() == formChoice);
|
|
|
|
static_cast<FormWidgetChoice *>(field->widget)->deselectAll();
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_toggle_item:
|
|
* @field: a #PopplerFormField
|
|
* @index: the index of the item
|
|
*
|
|
* Changes the state of the item at the given index
|
|
**/
|
|
void poppler_form_field_choice_toggle_item(PopplerFormField *field, gint index)
|
|
{
|
|
g_return_if_fail(field->widget->getType() == formChoice);
|
|
g_return_if_fail(index >= 0 && index < poppler_form_field_choice_get_n_items(field));
|
|
|
|
static_cast<FormWidgetChoice *>(field->widget)->toggle(index);
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_set_text:
|
|
* @field: a #PopplerFormField
|
|
* @text: the new text
|
|
*
|
|
* Sets the text in @field to the given value, replacing the current contents
|
|
**/
|
|
void poppler_form_field_choice_set_text(PopplerFormField *field, const gchar *text)
|
|
{
|
|
GooString *goo_tmp;
|
|
gchar *tmp;
|
|
gsize length = 0;
|
|
|
|
g_return_if_fail(field->widget->getType() == formChoice);
|
|
|
|
tmp = text ? g_convert(text, -1, "UTF-16BE", "UTF-8", nullptr, &length, nullptr) : nullptr;
|
|
goo_tmp = new GooString(tmp, length);
|
|
g_free(tmp);
|
|
static_cast<FormWidgetChoice *>(field->widget)->setEditChoice(goo_tmp);
|
|
delete goo_tmp;
|
|
}
|
|
|
|
/**
|
|
* poppler_form_field_choice_get_text:
|
|
* @field: a #PopplerFormField
|
|
*
|
|
* Retrieves the contents of @field.
|
|
*
|
|
* Return value: a new allocated string. It must be freed with g_free() when done.
|
|
**/
|
|
gchar *poppler_form_field_choice_get_text(PopplerFormField *field)
|
|
{
|
|
const GooString *tmp;
|
|
|
|
g_return_val_if_fail(field->widget->getType() == formChoice, NULL);
|
|
|
|
tmp = static_cast<FormWidgetChoice *>(field->widget)->getEditChoice();
|
|
return tmp ? _poppler_goo_string_to_utf8(tmp) : nullptr;
|
|
}
|