summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Kasik <mkasik@redhat.com>2020-06-08 17:27:28 +0200
committerMarek Kasik <mkasik@redhat.com>2020-06-08 18:56:05 +0200
commit9c9c3df8f22a12569d5f7a8d8add7abf92e30446 (patch)
treedd5cf761a0a857a9873cebca3302b9798e2dbb32
parent4e0546d0d9dfc5b97c3abc58a8b1fe672fcd695c (diff)
glib: Add ability to reset forms
Add new PopplerActionType POPPLER_ACTION_RESET_FORM and its handling to PopplerAction. Add poppler_document_reset_form() to PopplerDocument.
-rw-r--r--glib/demo/utils.c3
-rw-r--r--glib/poppler-action.cc34
-rw-r--r--glib/poppler-action.h15
-rw-r--r--glib/poppler-document.cc38
-rw-r--r--glib/poppler-document.h5
-rw-r--r--glib/reference/poppler-sections.txt1
6 files changed, 95 insertions, 1 deletions
diff --git a/glib/demo/utils.c b/glib/demo/utils.c
index 2d754b09..24e5ebaf 100644
--- a/glib/demo/utils.c
+++ b/glib/demo/utils.c
@@ -475,6 +475,9 @@ pgd_action_view_set_action (GtkWidget *action_view,
gtk_widget_show (swindow);
}
break;
+ case POPPLER_ACTION_RESET_FORM:
+ pgd_table_add_property (GTK_GRID (table), "<b>Type:</b>", "ResetForm", &row);
+ break;
default:
g_assert_not_reached ();
}
diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index f9228897..442b05b7 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -143,6 +143,10 @@ poppler_action_free (PopplerAction *action)
if (action->javascript.script)
g_free (action->javascript.script);
break;
+ case POPPLER_ACTION_RESET_FORM:
+ if (action->reset_form.fields)
+ g_list_free_full (action->reset_form.fields, g_free);
+ break;
default:
break;
}
@@ -221,6 +225,16 @@ poppler_action_copy (PopplerAction *action)
if (action->javascript.script)
new_action->javascript.script = g_strdup (action->javascript.script);
break;
+ case POPPLER_ACTION_RESET_FORM:
+ if (action->reset_form.fields) {
+ GList *iter;
+
+ new_action->reset_form.fields = nullptr;
+ for (iter = action->reset_form.fields; iter != nullptr; iter = iter->next)
+ new_action->reset_form.fields = g_list_append (new_action->reset_form.fields,
+ g_strdup ((char *) iter->data));
+ }
+ break;
default:
break;
}
@@ -520,7 +534,23 @@ build_javascript (PopplerAction *action,
const GooString script(link->getScript());
action->javascript.script = _poppler_goo_string_to_utf8 (&script);
}
+}
+
+static void
+build_reset_form (PopplerAction *action,
+ const LinkResetForm *link)
+{
+ const std::vector<std::string>& fields = link->getFields ();
+
+ if (action->reset_form.fields != nullptr)
+ g_list_free_full (action->reset_form.fields, g_free);
+ action->reset_form.fields = nullptr;
+ for (const auto & field : fields) {
+ action->reset_form.fields = g_list_append (action->reset_form.fields, g_strdup (field.c_str ()));
+ }
+
+ action->reset_form.exclude = link->getExclude ();
}
static void
@@ -661,6 +691,10 @@ _poppler_action_new (PopplerDocument *document,
action->type = POPPLER_ACTION_JAVASCRIPT;
build_javascript (action, static_cast<const LinkJavaScript*> (link));
break;
+ case actionResetForm:
+ action->type = POPPLER_ACTION_RESET_FORM;
+ build_reset_form (action, dynamic_cast<const LinkResetForm*> (link));
+ break;
case actionUnknown:
default:
action->type = POPPLER_ACTION_UNKNOWN;
diff --git a/glib/poppler-action.h b/glib/poppler-action.h
index 93a026be..7e60e0b4 100644
--- a/glib/poppler-action.h
+++ b/glib/poppler-action.h
@@ -37,6 +37,7 @@ G_BEGIN_DECLS
* @POPPLER_ACTION_RENDITION: play multimedia content. Since 0.14
* @POPPLER_ACTION_OCG_STATE: state of layer. Since 0.14
* @POPPLER_ACTION_JAVASCRIPT: Javascript. Since 0.18
+ * @POPPLER_ACTION_RESET_FORM: resets form. Since 0.90
*
* Action types
*/
@@ -52,7 +53,8 @@ typedef enum
POPPLER_ACTION_MOVIE, /* movie action */
POPPLER_ACTION_RENDITION, /* rendition action */
POPPLER_ACTION_OCG_STATE, /* Set-OCG-State action */
- POPPLER_ACTION_JAVASCRIPT /* Javascript action */
+ POPPLER_ACTION_JAVASCRIPT, /* Javascript action */
+ POPPLER_ACTION_RESET_FORM /* ResetForm action */
} PopplerActionType;
/**
@@ -148,6 +150,7 @@ typedef struct _PopplerActionMovie PopplerActionMovie;
typedef struct _PopplerActionRendition PopplerActionRendition;
typedef struct _PopplerActionOCGState PopplerActionOCGState;
typedef struct _PopplerActionJavascript PopplerActionJavascript;
+typedef struct _PopplerActionResetForm PopplerActionResetForm;
/**
* PopplerDest:
@@ -284,6 +287,15 @@ struct _PopplerActionJavascript
gchar *script;
};
+struct _PopplerActionResetForm
+{
+ PopplerActionType type;
+ gchar *title;
+
+ GList *fields;
+ gboolean exclude;
+};
+
/**
* PopplerAction:
*
@@ -302,6 +314,7 @@ union _PopplerAction
PopplerActionRendition rendition;
PopplerActionOCGState ocg_state;
PopplerActionJavascript javascript;
+ PopplerActionResetForm reset_form;
};
#define POPPLER_TYPE_ACTION (poppler_action_get_type ())
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index 9a767df1..95400d89 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -2002,6 +2002,44 @@ poppler_document_get_metadata (PopplerDocument *document)
return retval;
}
+/**
+ * poppler_document_reset_form:
+ * @document: A #PopplerDocument
+ * @fields: list of fields to reset
+ * @exclude_fields: whether to reset all fields except those in @fields
+ *
+ * Resets the form fields specified by fields if exclude_fields is FALSE.
+ * Resets all others if exclude_fields is TRUE.
+ * All form fields are reset regardless of the exclude_fields flag
+ * if fields is empty.
+ *
+ * Since: 0.90
+ **/
+void
+poppler_document_reset_form (PopplerDocument *document,
+ GList *fields,
+ gboolean exclude_fields)
+{
+ std::vector<std::string> list;
+ Catalog *catalog;
+ GList *iter;
+ Form *form;
+
+ g_return_if_fail (POPPLER_IS_DOCUMENT (document));
+
+ catalog = document->doc->getCatalog ();
+ if (catalog && catalog->isOk ()) {
+ form = catalog->getForm ();
+
+ if (form) {
+ for (iter = fields; iter != nullptr; iter = iter->next)
+ list.emplace_back (std::string ((char *) iter->data));
+
+ form->reset (list, exclude_fields);
+ }
+ }
+}
+
static void
poppler_document_get_property (GObject *object,
guint prop_id,
diff --git a/glib/poppler-document.h b/glib/poppler-document.h
index 98dae9a3..570504f2 100644
--- a/glib/poppler-document.h
+++ b/glib/poppler-document.h
@@ -426,6 +426,11 @@ POPPLER_PUBLIC
PopplerFormField *poppler_document_get_form_field (PopplerDocument *document,
gint id);
+POPPLER_PUBLIC
+void poppler_document_reset_form (PopplerDocument *document,
+ GList *fields,
+ gboolean exclude_fields);
+
/* Interface for getting the Index of a poppler_document */
#define POPPLER_TYPE_INDEX_ITER (poppler_index_iter_get_type ())
POPPLER_PUBLIC
diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt
index 65e4ad99..f04a2c62 100644
--- a/glib/reference/poppler-sections.txt
+++ b/glib/reference/poppler-sections.txt
@@ -190,6 +190,7 @@ poppler_document_new_from_data
poppler_document_new_from_file
poppler_document_new_from_gfile
poppler_document_new_from_stream
+poppler_document_reset_form
poppler_document_save
poppler_document_save_a_copy
poppler_document_set_author