summaryrefslogtreecommitdiff
path: root/pdf/pdf_js.c
diff options
context:
space:
mode:
Diffstat (limited to 'pdf/pdf_js.c')
-rw-r--r--pdf/pdf_js.c919
1 files changed, 0 insertions, 919 deletions
diff --git a/pdf/pdf_js.c b/pdf/pdf_js.c
deleted file mode 100644
index 4a2313f1..00000000
--- a/pdf/pdf_js.c
+++ /dev/null
@@ -1,919 +0,0 @@
-#include "mupdf/pdf.h"
-
-struct pdf_js_s
-{
- pdf_document *doc;
- pdf_obj *form;
- pdf_js_event event;
- pdf_jsimp *imp;
- pdf_jsimp_type *doctype;
- pdf_jsimp_type *eventtype;
- pdf_jsimp_type *fieldtype;
- pdf_jsimp_type *apptype;
-};
-
-static pdf_jsimp_obj *app_alert(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_jsimp_obj *cMsg_obj = NULL;
- pdf_jsimp_obj *nIcon_obj = NULL;
- pdf_jsimp_obj *nType_obj = NULL;
- pdf_jsimp_obj *cTitle_obj = NULL;
- pdf_jsimp_obj *nButton_obj = NULL;
- pdf_alert_event event;
- int arg_is_obj = 0;
-
- if (argc < 1 || argc > 6)
- return NULL;
-
- event.message = "";
- event.icon_type = PDF_ALERT_ICON_ERROR;
- event.button_group_type = PDF_ALERT_BUTTON_GROUP_OK;
- event.title = "MuPDF";
- event.check_box_message = NULL;
- event.button_pressed = 0;
-
- fz_var(cMsg_obj);
- fz_var(nIcon_obj);
- fz_var(nType_obj);
- fz_var(cTitle_obj);
- fz_try(ctx)
- {
- arg_is_obj = (argc == 1 && pdf_jsimp_to_type(js->imp, args[0]) != JS_TYPE_STRING);
- if (arg_is_obj)
- {
- cMsg_obj = pdf_jsimp_property(js->imp, args[0], "cMsg");
- nIcon_obj = pdf_jsimp_property(js->imp, args[0], "nIcon");
- nType_obj = pdf_jsimp_property(js->imp, args[0], "nType");
- cTitle_obj = pdf_jsimp_property(js->imp, args[0], "cTitle");
- }
- else
- {
- switch (argc)
- {
- case 6:
- case 5:
- case 4:
- cTitle_obj = args[3];
- case 3:
- nType_obj = args[2];
- case 2:
- nIcon_obj = args[1];
- case 1:
- cMsg_obj = args[0];
- }
- }
-
- if (cMsg_obj)
- event.message = pdf_jsimp_to_string(js->imp, cMsg_obj);
-
- if (nIcon_obj)
- event.icon_type = (int)pdf_jsimp_to_number(js->imp, nIcon_obj);
-
- if (nType_obj)
- event.button_group_type = (int)pdf_jsimp_to_number(js->imp, nType_obj);
-
- if (cTitle_obj)
- event.title = pdf_jsimp_to_string(js->imp, cTitle_obj);
-
- pdf_event_issue_alert(js->doc, &event);
- nButton_obj = pdf_jsimp_from_number(js->imp, (double)event.button_pressed);
- }
- fz_always(ctx)
- {
- if (arg_is_obj)
- {
- pdf_jsimp_drop_obj(js->imp, cMsg_obj);
- pdf_jsimp_drop_obj(js->imp, nIcon_obj);
- pdf_jsimp_drop_obj(js->imp, nType_obj);
- pdf_jsimp_drop_obj(js->imp, cTitle_obj);
- }
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-
- return nButton_obj;
-}
-
-static pdf_jsimp_obj *app_execDialog(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- pdf_event_issue_exec_dialog(js->doc);
-
- return NULL;
-}
-
-static pdf_jsimp_obj *app_execMenuItem(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- if (argc == 1)
- pdf_event_issue_exec_menu_item(js->doc, pdf_jsimp_to_string(js->imp, args[0]));
-
- return NULL;
-}
-
-static pdf_jsimp_obj *app_launchURL(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
- char *cUrl;
- int bNewFrame = 0;
-
- switch (argc)
- {
- default:
- return NULL;
- case 2:
- bNewFrame = (int)pdf_jsimp_to_number(js->imp, args[1]);
- case 1:
- cUrl = pdf_jsimp_to_string(js->imp, args[0]);
- }
-
- pdf_event_issue_launch_url(js->doc, cUrl, bNewFrame);
-
- return NULL;
-}
-
-static pdf_obj *load_color(fz_context *ctx, pdf_jsimp *imp, pdf_jsimp_obj *val)
-{
- pdf_obj *col = NULL;
- pdf_obj *comp = NULL;
- pdf_jsimp_obj *jscomp = NULL;
- int i;
- int n;
-
- n = pdf_jsimp_array_len(imp, val);
-
- /* The only legitimate color expressed as an array of length 1
- * is [T], meaning transparent. Return a NULL object to represent
- * transparent */
- if (n <= 1)
- return NULL;
-
- col = pdf_new_array(ctx, n-1);
-
- fz_var(comp);
- fz_var(jscomp);
- fz_try(ctx)
- {
- for (i = 0; i < n-1; i++)
- {
- jscomp = pdf_jsimp_array_item(imp, val, i+1);
- comp = pdf_new_real(ctx, pdf_jsimp_to_number(imp, jscomp));
- pdf_array_push(col, comp);
- pdf_jsimp_drop_obj(imp, jscomp);
- jscomp = NULL;
- pdf_drop_obj(comp);
- comp = NULL;
- }
- }
- fz_catch(ctx)
- {
- pdf_jsimp_drop_obj(imp, jscomp);
- pdf_drop_obj(comp);
- pdf_drop_obj(col);
- fz_rethrow(ctx);
- }
-
- return col;
-}
-
-static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
- pdf_obj *field = (pdf_obj *)obj;
- char *name;
-
- if (argc != 1)
- return NULL;
-
- name = pdf_jsimp_to_string(js->imp, args[0]);
- pdf_field_set_button_caption(js->doc, field, name);
-
- return NULL;
-}
-
-static pdf_jsimp_obj *field_getName(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_obj *field = (pdf_obj *)obj;
- char *name;
- pdf_jsimp_obj *oname = NULL;
-
- if (field == NULL)
- return NULL;
-
- name = pdf_field_name(js->doc, field);
- fz_try(ctx)
- {
- oname = pdf_jsimp_from_string(js->imp, name);
- }
- fz_always(ctx)
- {
- fz_free(ctx, name);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-
- return oname;
-}
-
-static void field_setName(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to field_setName");
-}
-
-static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
- pdf_obj *field = (pdf_obj *)obj;
-
- return field ? pdf_jsimp_from_number(js->imp, (double)pdf_field_display(js->doc, field)) : NULL;
-}
-
-static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_obj *field = (pdf_obj *)obj;
-
- if (field)
- pdf_field_set_display(js->doc, field, (int)pdf_jsimp_to_number(js->imp, val));
-}
-
-static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj)
-{
- return NULL;
-}
-
-static void field_setFillColor(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_obj *field = (pdf_obj *)obj;
- pdf_obj *col;
-
- if (!field)
- return;
-
- col = load_color(js->doc->ctx, js->imp, val);
- fz_try(ctx)
- {
- pdf_field_set_fill_color(js->doc, field, col);
- }
- fz_always(ctx)
- {
- pdf_drop_obj(col);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-}
-
-static pdf_jsimp_obj *field_getTextColor(void *jsctx, void *obj)
-{
- return NULL;
-}
-
-static void field_setTextColor(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_obj *field = (pdf_obj *)obj;
- pdf_obj *col;
-
- if (!field)
- return;
-
- col = load_color(js->doc->ctx, js->imp, val);
- fz_try(ctx)
- {
- pdf_field_set_text_color(js->doc, field, col);
- }
- fz_always(ctx)
- {
- pdf_drop_obj(col);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-}
-
-static pdf_jsimp_obj *field_getBorderStyle(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
- pdf_obj *field = (pdf_obj *)obj;
-
- return field ? pdf_jsimp_from_string(js->imp, pdf_field_border_style(js->doc, field)) : NULL;
-}
-
-static void field_setBorderStyle(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- pdf_obj *field = (pdf_obj *)obj;
-
- if (field)
- pdf_field_set_border_style(js->doc, field, pdf_jsimp_to_string(js->imp, val));
-}
-
-static pdf_jsimp_obj *field_getValue(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
- pdf_obj *field = (pdf_obj *)obj;
- char *fval;
-
- if (!field)
- return NULL;
-
- fval = pdf_field_value(js->doc, field);
- return pdf_jsimp_from_string(js->imp, fval?fval:"");
-}
-
-static void field_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- pdf_obj *field = (pdf_obj *)obj;
-
- if (field)
- (void)pdf_field_set_value(js->doc, field, pdf_jsimp_to_string(js->imp, val));
-}
-
-static pdf_jsimp_obj *event_getTarget(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- return pdf_jsimp_new_obj(js->imp, js->fieldtype, js->event.target);
-}
-
-static void event_setTarget(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to event_setTarget");
-}
-
-static pdf_jsimp_obj *event_getValue(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
- char *v = js->event.value;
-
- return pdf_jsimp_from_string(js->imp, v?v:"");
-}
-
-static void event_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- fz_free(ctx, js->event.value);
- js->event.value = NULL;
- js->event.value = fz_strdup(ctx, pdf_jsimp_to_string(js->imp, val));
-}
-
-static pdf_jsimp_obj *event_getWillCommit(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- return pdf_jsimp_from_number(js->imp, 1.0);
-}
-
-static void event_setWillCommit(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to event_setWillCommit");
-}
-
-static pdf_jsimp_obj *event_getRC(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- return pdf_jsimp_from_number(js->imp, (double)js->event.rc);
-}
-
-static void event_setRC(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- js->event.rc = (int)pdf_jsimp_to_number(js->imp, val);
-}
-
-static pdf_jsimp_obj *doc_getEvent(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- return pdf_jsimp_new_obj(js->imp, js->eventtype, &js->event);
-}
-
-static void doc_setEvent(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to doc_setEvent");
-}
-
-static pdf_jsimp_obj *doc_getApp(void *jsctx, void *obj)
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- return pdf_jsimp_new_obj(js->imp, js->apptype, NULL);
-}
-
-static void doc_setApp(void *jsctx, void *obj, pdf_jsimp_obj *val)
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to doc_setApp");
-}
-
-static char *utf8_to_pdf(fz_context *ctx, char *utf8)
-{
- char *pdf = fz_malloc(ctx, strlen(utf8)+1);
- int i = 0;
- unsigned char c;
-
- while ((c = *utf8) != 0)
- {
- if ((c & 0x80) == 0 && pdf_doc_encoding[c] == c)
- {
- pdf[i++] = c;
- utf8++ ;
- }
- else
- {
- int rune;
- int j;
-
- utf8 += fz_chartorune(&rune, utf8);
-
- for (j = 0; j < sizeof(pdf_doc_encoding) && pdf_doc_encoding[j] != rune; j++)
- ;
-
- if (j < sizeof(pdf_doc_encoding))
- pdf[i++] = j;
- }
- }
-
- pdf[i] = 0;
-
- return pdf;
-}
-
-static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_obj *dict = NULL;
- char *utf8;
- char *name = NULL;
-
- if (argc != 1)
- return NULL;
-
- fz_var(dict);
- fz_var(name);
- fz_try(ctx)
- {
- utf8 = pdf_jsimp_to_string(js->imp, args[0]);
-
- if (utf8)
- {
- name = utf8_to_pdf(ctx, utf8);
- dict = pdf_lookup_field(js->form, name);
- }
- }
- fz_always(ctx)
- {
- fz_free(ctx, name);
- }
- fz_catch(ctx)
- {
- /* FIXME: TryLater ? */
- fz_warn(ctx, "doc_getField failed: %s", fz_caught_message(ctx));
- dict = NULL;
- }
-
- return dict ? pdf_jsimp_new_obj(js->imp, js->fieldtype, dict) : NULL;
-}
-
-static void reset_field(pdf_js *js, pdf_jsimp_obj *item)
-{
- fz_context *ctx = js->doc->ctx;
- char *name = NULL;
- char *utf8 = pdf_jsimp_to_string(js->imp, item);
-
- if (utf8)
- {
- pdf_obj *field;
-
- fz_var(name);
- fz_try(ctx)
- {
- name = utf8_to_pdf(ctx, utf8);
- field = pdf_lookup_field(js->form, name);
- if (field)
- pdf_field_reset(js->doc, field);
- }
- fz_always(ctx)
- {
- fz_free(ctx, name);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
- }
-}
-
-static pdf_jsimp_obj *doc_resetForm(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_jsimp_obj *arr = NULL;
- pdf_jsimp_obj *elem = NULL;
-
- switch (argc)
- {
- case 0:
- break;
- case 1:
- switch (pdf_jsimp_to_type(js->imp, args[0]))
- {
- case JS_TYPE_NULL:
- break;
- case JS_TYPE_ARRAY:
- arr = args[0];
- break;
- case JS_TYPE_STRING:
- elem = args[0];
- break;
- default:
- return NULL;
- }
- break;
- default:
- return NULL;
- }
-
- fz_try(ctx)
- {
- if(arr)
- {
- /* An array of fields has been passed in. Call
- * pdf_reset_field on each */
- int i, n = pdf_jsimp_array_len(js->imp, arr);
-
- for (i = 0; i < n; i++)
- {
- pdf_jsimp_obj *item = pdf_jsimp_array_item(js->imp, arr, i);
-
- if (item)
- reset_field(js, item);
-
- }
- }
- else if (elem)
- {
- reset_field(js, elem);
- }
- else
- {
- /* No argument or null passed in means reset all. */
- int i, n = pdf_array_len(js->form);
-
- for (i = 0; i < n; i++)
- pdf_field_reset(js->doc, pdf_array_get(js->form, i));
- }
- }
- fz_catch(ctx)
- {
- fz_warn(ctx, "doc_resetForm failed: %s", fz_caught_message(ctx));
- }
-
- return NULL;
-}
-
-static pdf_jsimp_obj *doc_print(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
-
- pdf_event_issue_print(js->doc);
-
- return NULL;
-}
-
-static pdf_jsimp_obj *doc_mailDoc(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
-{
- pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
- pdf_jsimp_obj *bUI_obj = NULL;
- pdf_jsimp_obj *cTo_obj = NULL;
- pdf_jsimp_obj *cCc_obj = NULL;
- pdf_jsimp_obj *cBcc_obj = NULL;
- pdf_jsimp_obj *cSubject_obj = NULL;
- pdf_jsimp_obj *cMessage_obj = NULL;
- pdf_mail_doc_event event;
- int arg_is_obj = 0;
-
- if (argc < 1 || argc > 6)
- return NULL;
-
- event.ask_user = 1;
- event.to = "";
- event.cc = "";
- event.bcc = "";
- event.subject = "";
- event.message = "";
-
- fz_var(bUI_obj);
- fz_var(cTo_obj);
- fz_var(cCc_obj);
- fz_var(cBcc_obj);
- fz_var(cSubject_obj);
- fz_var(cMessage_obj);
- fz_try(ctx)
- {
- arg_is_obj = (argc == 1 && pdf_jsimp_to_type(js->imp, args[0]) != JS_TYPE_BOOLEAN);
- if (arg_is_obj)
- {
- bUI_obj = pdf_jsimp_property(js->imp, args[0], "bUI");
- cTo_obj = pdf_jsimp_property(js->imp, args[0], "cTo");
- cCc_obj = pdf_jsimp_property(js->imp, args[0], "cCc");
- cBcc_obj = pdf_jsimp_property(js->imp, args[0], "cBcc");
- cSubject_obj = pdf_jsimp_property(js->imp, args[0], "cSubject");
- cMessage_obj = pdf_jsimp_property(js->imp, args[0], "cMessage");
- }
- else
- {
- switch (argc)
- {
- case 6:
- cMessage_obj = args[5];
- case 5:
- cSubject_obj = args[4];
- case 4:
- cBcc_obj = args[3];
- case 3:
- cCc_obj = args[2];
- case 2:
- cTo_obj = args[1];
- case 1:
- bUI_obj = args[0];
- }
- }
-
- if (bUI_obj)
- event.ask_user = (int)pdf_jsimp_to_number(js->imp, bUI_obj);
-
- if (cTo_obj)
- event.to = pdf_jsimp_to_string(js->imp, cTo_obj);
-
- if (cCc_obj)
- event.cc = pdf_jsimp_to_string(js->imp, cCc_obj);
-
- if (cBcc_obj)
- event.bcc = pdf_jsimp_to_string(js->imp, cBcc_obj);
-
- if (cSubject_obj)
- event.subject = pdf_jsimp_to_string(js->imp, cSubject_obj);
-
- if (cMessage_obj)
- event.message = pdf_jsimp_to_string(js->imp, cMessage_obj);
-
- pdf_event_issue_mail_doc(js->doc, &event);
- }
- fz_always(ctx)
- {
- if (arg_is_obj)
- {
- pdf_jsimp_drop_obj(js->imp, bUI_obj);
- pdf_jsimp_drop_obj(js->imp, cTo_obj);
- pdf_jsimp_drop_obj(js->imp, cCc_obj);
- pdf_jsimp_drop_obj(js->imp, cBcc_obj);
- pdf_jsimp_drop_obj(js->imp, cSubject_obj);
- pdf_jsimp_drop_obj(js->imp, cMessage_obj);
- }
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-
- return NULL;
-}
-
-static void declare_dom(pdf_js *js)
-{
- pdf_jsimp *imp = js->imp;
-
- /* Create the document type */
- js->doctype = pdf_jsimp_new_type(imp, NULL);
- pdf_jsimp_addmethod(imp, js->doctype, "getField", doc_getField);
- pdf_jsimp_addmethod(imp, js->doctype, "resetForm", doc_resetForm);
- pdf_jsimp_addmethod(imp, js->doctype, "print", doc_print);
- pdf_jsimp_addmethod(imp, js->doctype, "mailDoc", doc_mailDoc);
- pdf_jsimp_addproperty(imp, js->doctype, "event", doc_getEvent, doc_setEvent);
- pdf_jsimp_addproperty(imp, js->doctype, "app", doc_getApp, doc_setApp);
-
- /* Create the event type */
- js->eventtype = pdf_jsimp_new_type(imp, NULL);
- pdf_jsimp_addproperty(imp, js->eventtype, "target", event_getTarget, event_setTarget);
- pdf_jsimp_addproperty(imp, js->eventtype, "value", event_getValue, event_setValue);
- pdf_jsimp_addproperty(imp, js->eventtype, "willCommit", event_getWillCommit, event_setWillCommit);
- pdf_jsimp_addproperty(imp, js->eventtype, "rc", event_getRC, event_setRC);
-
- /* Create the field type */
- js->fieldtype = pdf_jsimp_new_type(imp, NULL);
- pdf_jsimp_addproperty(imp, js->fieldtype, "value", field_getValue, field_setValue);
- pdf_jsimp_addproperty(imp, js->fieldtype, "borderStyle", field_getBorderStyle, field_setBorderStyle);
- pdf_jsimp_addproperty(imp, js->fieldtype, "textColor", field_getTextColor, field_setTextColor);
- pdf_jsimp_addproperty(imp, js->fieldtype, "fillColor", field_getFillColor, field_setFillColor);
- pdf_jsimp_addproperty(imp, js->fieldtype, "display", field_getDisplay, field_setDisplay);
- pdf_jsimp_addproperty(imp, js->fieldtype, "name", field_getName, field_setName);
- pdf_jsimp_addmethod(imp, js->fieldtype, "buttonSetCaption", field_buttonSetCaption);
-
- /* Create the app type */
- js->apptype = pdf_jsimp_new_type(imp, NULL);
- pdf_jsimp_addmethod(imp, js->apptype, "alert", app_alert);
- pdf_jsimp_addmethod(imp, js->apptype, "execDialog", app_execDialog);
- pdf_jsimp_addmethod(imp, js->apptype, "execMenuItem", app_execMenuItem);
- pdf_jsimp_addmethod(imp, js->apptype, "launchURL", app_launchURL);
-
- /* Create the document object and tell the engine to use */
- pdf_jsimp_set_global_type(js->imp, js->doctype);
-}
-
-static void preload_helpers(pdf_js *js)
-{
- /* When testing on the cluster, redefine the Date object
- * to use a fixed date */
-#ifdef CLUSTER
- pdf_jsimp_execute(js->imp,
-"var MuPDFOldDate = Date\n"
-"Date = function() { return new MuPDFOldDate(1979,5,15); }\n"
- );
-#endif
-
- pdf_jsimp_execute(js->imp,
-#include "gen_js_util.h"
- );
-}
-
-pdf_js *pdf_new_js(pdf_document *doc)
-{
- fz_context *ctx = doc->ctx;
- pdf_js *js = NULL;
-
- fz_var(js);
- fz_try(ctx)
- {
- pdf_obj *root, *acroform;
-
- js = fz_malloc_struct(ctx, pdf_js);
- js->doc = doc;
-
- /* Find the form array */
- root = pdf_dict_gets(pdf_trailer(doc), "Root");
- acroform = pdf_dict_gets(root, "AcroForm");
- js->form = pdf_dict_gets(acroform, "Fields");
-
- /* Initialise the javascript engine, passing the main context
- * for use in memory allocation and exception handling. Also
- * pass our js context, for it to pass back to us. */
- js->imp = pdf_new_jsimp(ctx, js);
- declare_dom(js);
-
- preload_helpers(js);
- }
- fz_catch(ctx)
- {
- pdf_drop_js(js);
- js = NULL;
- }
-
- return js;
-}
-
-void pdf_js_load_document_level(pdf_js *js)
-{
- pdf_document *doc = js->doc;
- fz_context *ctx = doc->ctx;
- pdf_obj *javascript = NULL;
- char *codebuf = NULL;
-
- fz_var(javascript);
- fz_var(codebuf);
- fz_try(ctx)
- {
- int len, i;
-
- javascript = pdf_load_name_tree(doc, "JavaScript");
- len = pdf_dict_len(javascript);
-
- for (i = 0; i < len; i++)
- {
- pdf_obj *fragment = pdf_dict_get_val(javascript, i);
- pdf_obj *code = pdf_dict_gets(fragment, "JS");
-
- fz_var(codebuf);
- fz_try(ctx)
- {
- codebuf = pdf_to_utf8(doc, code);
- pdf_jsimp_execute(js->imp, codebuf);
- }
- fz_always(ctx)
- {
- fz_free(ctx, codebuf);
- codebuf = NULL;
- }
- fz_catch(ctx)
- {
- /* FIXME: TryLater ? */
- fz_warn(ctx, "Warning: %s", fz_caught_message(ctx));
- }
- }
- }
- fz_always(ctx)
- {
- pdf_drop_obj(javascript);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-}
-
-void pdf_drop_js(pdf_js *js)
-{
- if (js)
- {
- fz_context *ctx = js->doc->ctx;
- fz_free(ctx, js->event.value);
- pdf_jsimp_drop_type(js->imp, js->apptype);
- pdf_jsimp_drop_type(js->imp, js->fieldtype);
- pdf_jsimp_drop_type(js->imp, js->doctype);
- pdf_drop_jsimp(js->imp);
- fz_free(ctx, js);
- }
-}
-
-void pdf_js_setup_event(pdf_js *js, pdf_js_event *e)
-{
- if (js)
- {
- fz_context *ctx = js->doc->ctx;
- char *ev = e->value ? e->value : "";
- char *v = fz_strdup(ctx, ev);
-
- fz_free(ctx, js->event.value);
- js->event.value = v;
-
- js->event.target = e->target;
- js->event.rc = 1;
- }
-}
-
-pdf_js_event *pdf_js_get_event(pdf_js *js)
-{
- return js ? &js->event : NULL;
-}
-
-void pdf_js_execute(pdf_js *js, char *code)
-{
- if (js)
- {
- fz_context *ctx = js->doc->ctx;
- fz_try(ctx)
- {
- pdf_jsimp_execute(js->imp, code);
- }
- fz_catch(ctx)
- {
- }
- }
-}
-
-void pdf_js_execute_count(pdf_js *js, char *code, int count)
-{
- if (js)
- {
- fz_context *ctx = js->doc->ctx;
- fz_try(ctx)
- {
- pdf_jsimp_execute_count(js->imp, code, count);
- }
- fz_catch(ctx)
- {
- }
- }
-}
-
-int pdf_js_supported(void)
-{
- return 1;
-}