summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2012-08-30 15:29:50 +0100
committerPaul Gardiner <paulg.artifex@glidos.net>2012-08-31 17:06:11 +0100
commit48f3bc177ff70e855bd7d602e38351d873bae999 (patch)
tree96a9b5a67a1abf2b650ce740f09bd08a5b859753
parenta99ce016e03d94498a914ed8a060b1355c693592 (diff)
downloadmupdf-48f3bc177ff70e855bd7d602e38351d873bae999.tar.xz
Forms: provide js engine method for determining object type
-rw-r--r--pdf/mupdf-internal.h11
-rw-r--r--pdf/pdf_jsimp_cpp.c10
-rw-r--r--pdf/pdf_jsimp_cpp.h1
-rw-r--r--pdf/pdf_jsimp_v8.cpp20
4 files changed, 42 insertions, 0 deletions
diff --git a/pdf/mupdf-internal.h b/pdf/mupdf-internal.h
index 9229bf2d..d3326fb4 100644
--- a/pdf/mupdf-internal.h
+++ b/pdf/mupdf-internal.h
@@ -653,6 +653,15 @@ typedef pdf_jsimp_obj *(pdf_jsimp_method)(void *jsctx, void *obj, int argc, pdf_
typedef pdf_jsimp_obj *(pdf_jsimp_getter)(void *jsctx, void *obj);
typedef void (pdf_jsimp_setter)(void *jsctx, void *obj, pdf_jsimp_obj *val);
+enum
+{
+ JS_TYPE_UNKNOWN,
+ JS_TYPE_NULL,
+ JS_TYPE_STRING,
+ JS_TYPE_NUMBER,
+ JS_TYPE_ARRAY
+};
+
pdf_jsimp *pdf_new_jsimp(fz_context *ctx, void *jsctx);
void pdf_drop_jsimp(pdf_jsimp *imp);
@@ -665,6 +674,8 @@ void pdf_jsimp_set_global_type(pdf_jsimp *imp, pdf_jsimp_type *type);
pdf_jsimp_obj *pdf_jsimp_new_obj(pdf_jsimp *imp, pdf_jsimp_type *type, void *obj);
void pdf_jsimp_drop_obj(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+int pdf_jsimp_toType(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+
pdf_jsimp_obj *pdf_jsimp_fromString(pdf_jsimp *imp, char *str);
char *pdf_jsimp_toString(pdf_jsimp *imp, pdf_jsimp_obj *obj);
diff --git a/pdf/pdf_jsimp_cpp.c b/pdf/pdf_jsimp_cpp.c
index b1767700..649d42c4 100644
--- a/pdf/pdf_jsimp_cpp.c
+++ b/pdf/pdf_jsimp_cpp.c
@@ -83,6 +83,16 @@ void pdf_jsimp_drop_obj(pdf_jsimp *imp, pdf_jsimp_obj *obj)
fz_warn(pdf_jsimp_ctx_cpp(imp), "%s", err);
}
+int pdf_jsimp_toType(pdf_jsimp *imp, pdf_jsimp_obj *obj)
+{
+ int type = 0;
+ const char *err = pdf_jsimp_toType_cpp(imp, obj, &type);
+ if (err != NULL)
+ fz_throw(pdf_jsimp_ctx_cpp(imp), "%s", err);
+
+ return type;
+}
+
pdf_jsimp_obj *pdf_jsimp_fromString(pdf_jsimp *imp, char *str)
{
pdf_jsimp_obj *obj = NULL;
diff --git a/pdf/pdf_jsimp_cpp.h b/pdf/pdf_jsimp_cpp.h
index 09e78a9d..a777791d 100644
--- a/pdf/pdf_jsimp_cpp.h
+++ b/pdf/pdf_jsimp_cpp.h
@@ -12,6 +12,7 @@ const char *pdf_jsimp_addproperty_cpp(pdf_jsimp *imp, pdf_jsimp_type *type, char
const char *pdf_jsimp_set_global_type_cpp(pdf_jsimp *imp, pdf_jsimp_type *type);
const char *pdf_jsimp_new_obj_cpp(pdf_jsimp *imp, pdf_jsimp_type *type, void *natobj, pdf_jsimp_obj **obj);
const char *pdf_jsimp_drop_obj_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+const char *pdf_jsimp_toType_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, int *type);
const char *pdf_jsimp_fromString_cpp(pdf_jsimp *imp, char *str, pdf_jsimp_obj **obj);
const char *pdf_jsimp_toString_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, char **str);
const char *pdf_jsimp_fromNumber_cpp(pdf_jsimp *imp, double num, pdf_jsimp_obj **obj);
diff --git a/pdf/pdf_jsimp_v8.cpp b/pdf/pdf_jsimp_v8.cpp
index 522a747a..2db77bef 100644
--- a/pdf/pdf_jsimp_v8.cpp
+++ b/pdf/pdf_jsimp_v8.cpp
@@ -154,6 +154,20 @@ public:
pobj.Dispose();
}
+ int type()
+ {
+ if (pobj->IsNull())
+ return JS_TYPE_NULL;
+ else if (pobj->IsString() || pobj->IsStringObject())
+ return JS_TYPE_STRING;
+ else if (pobj->IsNumber() || pobj->IsNumberObject())
+ return JS_TYPE_NUMBER;
+ else if (pobj->IsArray())
+ return JS_TYPE_ARRAY;
+ else
+ return JS_TYPE_UNKNOWN;
+ }
+
char *toString()
{
delete utf8;
@@ -365,6 +379,12 @@ extern "C" const char *pdf_jsimp_drop_obj_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj
return NULL;
}
+extern "C" const char *pdf_jsimp_toType_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, int *type)
+{
+ *type = reinterpret_cast<PDFJSImpObject *>(obj)->type();
+ return NULL;
+}
+
extern "C" const char *pdf_jsimp_fromString_cpp(pdf_jsimp *imp, char *str, pdf_jsimp_obj **obj)
{
*obj = reinterpret_cast<pdf_jsimp_obj *>(new PDFJSImpObject(str));