summaryrefslogtreecommitdiff
path: root/source/pdf/js/pdf-jsimp-v8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf/js/pdf-jsimp-v8.cpp')
-rw-r--r--source/pdf/js/pdf-jsimp-v8.cpp474
1 files changed, 0 insertions, 474 deletions
diff --git a/source/pdf/js/pdf-jsimp-v8.cpp b/source/pdf/js/pdf-jsimp-v8.cpp
deleted file mode 100644
index 0a6d5928..00000000
--- a/source/pdf/js/pdf-jsimp-v8.cpp
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- This file contains the v8 implementation of the pdf_jsimp API
- */
-
-extern "C" {
-#include "mupdf/fitz.h"
-#include "mupdf/pdf.h"
-#include "pdf-jsimp-cpp.h"
-}
-
-#include <vector>
-#include <set>
-#include <v8.h>
-
-using namespace v8;
-using namespace std;
-
-struct PDFJSImp;
-
-/* Object we pass to FunctionTemplate::New, which v8 passes back to us in
- * callMethod, allowing us to call our client's, passed-in method. */
-struct PDFJSImpMethod
-{
- PDFJSImp *imp;
- pdf_jsimp_method *meth;
-
- PDFJSImpMethod(PDFJSImp *imp, pdf_jsimp_method *meth) : imp(imp), meth(meth) {}
-};
-
-/* Object we pass to ObjectTemplate::SetAccessor, which v8 passes back to us in
- * setProp and getProp, allowing us to call our client's, passed-in set/get methods. */
-struct PDFJSImpProperty
-{
- PDFJSImp *imp;
- pdf_jsimp_getter *get;
- pdf_jsimp_setter *set;
-
- PDFJSImpProperty(PDFJSImp *imp, pdf_jsimp_getter *get, pdf_jsimp_setter *set) : imp(imp), get(get), set(set) {}
-};
-
-/* Internal representation of the pdf_jsimp_type object */
-struct PDFJSImpType
-{
- PDFJSImp *imp;
- Persistent<ObjectTemplate> templ;
- pdf_jsimp_dtr *dtr;
- vector<PDFJSImpMethod *> methods;
- vector<PDFJSImpProperty *> properties;
-
- PDFJSImpType(PDFJSImp *imp, pdf_jsimp_dtr *dtr): imp(imp), dtr(dtr)
- {
- HandleScope scope;
- templ = Persistent<ObjectTemplate>::New(ObjectTemplate::New());
- templ->SetInternalFieldCount(1);
- }
-
- ~PDFJSImpType()
- {
- vector<PDFJSImpMethod *>::iterator mit;
- for (mit = methods.begin(); mit < methods.end(); mit++)
- delete *mit;
-
- vector<PDFJSImpProperty *>::iterator pit;
- for (pit = properties.begin(); pit < properties.end(); pit++)
- delete *pit;
-
- templ.Dispose();
- }
-};
-
-/* Info via which we destroy the client side part of objects that
- * v8 garbage collects */
-struct PDFJSImpGCObj
-{
- Persistent<Object> pobj;
- PDFJSImpType *type;
-
- PDFJSImpGCObj(Handle<Object> obj, PDFJSImpType *type): type(type)
- {
- pobj = Persistent<Object>::New(obj);
- }
-
- ~PDFJSImpGCObj()
- {
- pobj.Dispose();
- }
-};
-
-/* Internal representation of the pdf_jsimp object */
-struct PDFJSImp
-{
- fz_context *ctx;
- void *jsctx;
- Persistent<Context> context;
- vector<PDFJSImpType *> types;
- set<PDFJSImpGCObj *> gclist;
-
- PDFJSImp(fz_context *ctx, void *jsctx) : ctx(ctx), jsctx(jsctx)
- {
- HandleScope scope;
- context = Persistent<Context>::New(Context::New());
- }
-
- ~PDFJSImp()
- {
- HandleScope scope;
- /* Tell v8 our context will not be used again */
- context.Dispose();
-
- /* Unlink and destroy all the objects that v8 has yet to gc */
- set<PDFJSImpGCObj *>::iterator oit;
- for (oit = gclist.begin(); oit != gclist.end(); oit++)
- {
- (*oit)->pobj.ClearWeak(); /* So that gcCallback wont get called */
- PDFJSImpType *vType = (*oit)->type;
- Local<External> owrap = Local<External>::Cast((*oit)->pobj->GetInternalField(0));
- vType->dtr(vType->imp->jsctx, owrap->Value());
- delete *oit;
- }
-
- vector<PDFJSImpType *>::iterator it;
- for (it = types.begin(); it < types.end(); it++)
- delete *it;
- }
-};
-
-/* Internal representation of the pdf_jsimp_obj object */
-class PDFJSImpObject
-{
- Persistent<Value> pobj;
- String::Utf8Value *utf8;
-
-public:
- PDFJSImpObject(Handle<Value> obj): utf8(NULL)
- {
- pobj = Persistent<Value>::New(obj);
- }
-
- PDFJSImpObject(const char *str): utf8(NULL)
- {
- pobj = Persistent<Value>::New(String::New(str));
- }
-
- PDFJSImpObject(double num): utf8(NULL)
- {
- pobj = Persistent<Value>::New(Number::New(num));
- }
-
- ~PDFJSImpObject()
- {
- delete utf8;
- 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 if (pobj->IsBoolean() || pobj->IsBooleanObject())
- return JS_TYPE_BOOLEAN;
- else
- return JS_TYPE_UNKNOWN;
- }
-
- char *toString()
- {
- delete utf8;
- utf8 = new String::Utf8Value(pobj);
- return **utf8;
- }
-
- double toNumber()
- {
- return pobj->NumberValue();
- }
-
- Handle<Value> toValue()
- {
- return pobj;
- }
-};
-
-extern "C" fz_context *pdf_jsimp_ctx_cpp(pdf_jsimp *imp)
-{
- return reinterpret_cast<PDFJSImp *>(imp)->ctx;
-}
-
-extern "C" const char *pdf_new_jsimp_cpp(fz_context *ctx, void *jsctx, pdf_jsimp **imp)
-{
- Locker lock;
- *imp = reinterpret_cast<pdf_jsimp *>(new PDFJSImp(ctx, jsctx));
-
- return NULL;
-}
-
-extern "C" const char *pdf_drop_jsimp_cpp(pdf_jsimp *imp)
-{
- Locker lock;
- delete reinterpret_cast<PDFJSImp *>(imp);
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_new_type_cpp(pdf_jsimp *imp, pdf_jsimp_dtr *dtr, pdf_jsimp_type **type)
-{
- Locker lock;
- PDFJSImp *vImp = reinterpret_cast<PDFJSImp *>(imp);
- PDFJSImpType *vType = new PDFJSImpType(vImp, dtr);
- vImp->types.push_back(vType);
- *type = reinterpret_cast<pdf_jsimp_type *>(vType);
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_drop_type_cpp(pdf_jsimp *imp, pdf_jsimp_type *type)
-{
- /* Types are recorded and destroyed as part of PDFJSImp */
- return NULL;
-}
-
-static Handle<Value> callMethod(const Arguments &args)
-{
- HandleScope scope;
- Local<External> mwrap = Local<External>::Cast(args.Data());
- PDFJSImpMethod *m = (PDFJSImpMethod *)mwrap->Value();
-
- Local<Object> self = args.Holder();
- Local<External> owrap;
- void *nself = NULL;
- if (self->InternalFieldCount() > 0)
- {
- owrap = Local<External>::Cast(self->GetInternalField(0));
- nself = owrap->Value();
- }
-
- int c = args.Length();
- PDFJSImpObject **native_args = new PDFJSImpObject*[c];
- for (int i = 0; i < c; i++)
- native_args[i] = new PDFJSImpObject(args[i]);
-
- PDFJSImpObject *obj = reinterpret_cast<PDFJSImpObject *>(pdf_jsimp_call_method(reinterpret_cast<pdf_jsimp *>(m->imp), m->meth, m->imp->jsctx, nself, c, reinterpret_cast<pdf_jsimp_obj **>(native_args)));
- Handle<Value> val;
- if (obj)
- val = obj->toValue();
- delete obj;
-
- for (int i = 0; i < c; i++)
- delete native_args[i];
-
- delete native_args;
-
- return scope.Close(val);
-}
-
-extern "C" const char *pdf_jsimp_addmethod_cpp(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_method *meth)
-{
- Locker lock;
- PDFJSImpType *vType = reinterpret_cast<PDFJSImpType *>(type);
- HandleScope scope;
-
- PDFJSImpMethod *pmeth = new PDFJSImpMethod(vType->imp, meth);
- vType->templ->Set(String::New(name), FunctionTemplate::New(callMethod, External::New(pmeth)));
- vType->methods.push_back(pmeth);
- return NULL;
-}
-
-static Handle<Value> getProp(Local<String> property, const AccessorInfo &info)
-{
- HandleScope scope;
- Local<External> pwrap = Local<External>::Cast(info.Data());
- PDFJSImpProperty *p = reinterpret_cast<PDFJSImpProperty *>(pwrap->Value());
-
- Local<Object> self = info.Holder();
- Local<External> owrap;
- void *nself = NULL;
- if (self->InternalFieldCount() > 0)
- {
- Local<Value> val = self->GetInternalField(0);
- if (val->IsExternal())
- {
- owrap = Local<External>::Cast(val);
- nself = owrap->Value();
- }
- }
-
- PDFJSImpObject *obj = reinterpret_cast<PDFJSImpObject *>(pdf_jsimp_call_getter(reinterpret_cast<pdf_jsimp *>(p->imp), p->get, p->imp->jsctx, nself));
- Handle<Value> val;
- if (obj)
- val = obj->toValue();
- delete obj;
- return scope.Close(val);
-}
-
-static void setProp(Local<String> property, Local<Value> value, const AccessorInfo &info)
-{
- HandleScope scope;
- Local<External> wrap = Local<External>::Cast(info.Data());
- PDFJSImpProperty *p = reinterpret_cast<PDFJSImpProperty *>(wrap->Value());
-
- Local<Object> self = info.Holder();
- Local<External> owrap;
- void *nself = NULL;
- if (self->InternalFieldCount() > 0)
- {
- owrap = Local<External>::Cast(self->GetInternalField(0));
- nself = owrap->Value();
- }
-
- PDFJSImpObject *obj = new PDFJSImpObject(value);
-
- pdf_jsimp_call_setter(reinterpret_cast<pdf_jsimp *>(p->imp), p->set, p->imp->jsctx, nself, reinterpret_cast<pdf_jsimp_obj *>(obj));
- delete obj;
-}
-
-extern "C" const char *pdf_jsimp_addproperty_cpp(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_getter *get, pdf_jsimp_setter *set)
-{
- Locker lock;
- PDFJSImpType *vType = reinterpret_cast<PDFJSImpType *>(type);
- HandleScope scope;
-
- PDFJSImpProperty *prop = new PDFJSImpProperty(vType->imp, get, set);
- vType->templ->SetAccessor(String::New(name), getProp, setProp, External::New(prop));
- vType->properties.push_back(prop);
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_set_global_type_cpp(pdf_jsimp *imp, pdf_jsimp_type *type)
-{
- Locker lock;
- PDFJSImp *vImp = reinterpret_cast<PDFJSImp *>(imp);
- PDFJSImpType *vType = reinterpret_cast<PDFJSImpType *>(type);
- HandleScope scope;
-
- vImp->context = Persistent<Context>::New(Context::New(NULL, vType->templ));
- return NULL;
-}
-
-static void gcCallback(Persistent<Value> val, void *parm)
-{
- PDFJSImpGCObj *gco = reinterpret_cast<PDFJSImpGCObj *>(parm);
- PDFJSImpType *vType = gco->type;
- HandleScope scope;
- Persistent<Object> obj = Persistent<Object>::Cast(val);
-
- Local<External> owrap = Local<External>::Cast(obj->GetInternalField(0));
- vType->dtr(vType->imp->jsctx, owrap->Value());
- vType->imp->gclist.erase(gco);
- delete gco; /* Disposes of the persistent handle */
-}
-
-extern "C" const char *pdf_jsimp_new_obj_cpp(pdf_jsimp *imp, pdf_jsimp_type *type, void *natobj, pdf_jsimp_obj **robj)
-{
- Locker lock;
- PDFJSImpType *vType = reinterpret_cast<PDFJSImpType *>(type);
- HandleScope scope;
- Local<Object> obj = vType->templ->NewInstance();
- obj->SetInternalField(0, External::New(natobj));
-
- /* Arrange for destructor to be called on the client-side object
- * when the v8 object is garbage collected */
- if (vType->dtr)
- {
- /* Wrap obj in a PDFJSImpGCObj, which takes a persistent handle to
- * obj, and stores its type with it. The persistent handle tells v8
- * it cannot just destroy obj leaving the client-side object hanging */
- PDFJSImpGCObj *gco = new PDFJSImpGCObj(obj, vType);
- /* Keep the wrapped object in a list, so that we can take back control
- * of destroying client-side objects when shutting down this context */
- vType->imp->gclist.insert(gco);
- /* Tell v8 that it can destroy the persistent handle to obj when it has
- * no further need for it, but it must inform us via gcCallback */
- gco->pobj.MakeWeak(gco, gcCallback);
- }
-
- *robj = reinterpret_cast<pdf_jsimp_obj *>(new PDFJSImpObject(obj));
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_drop_obj_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj)
-{
- Locker lock;
- delete reinterpret_cast<PDFJSImpObject *>(obj);
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_to_type_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, int *type)
-{
- Locker lock;
- *type = reinterpret_cast<PDFJSImpObject *>(obj)->type();
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_from_string_cpp(pdf_jsimp *imp, char *str, pdf_jsimp_obj **obj)
-{
- Locker lock;
- *obj = reinterpret_cast<pdf_jsimp_obj *>(new PDFJSImpObject(str));
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_to_string_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, char **str)
-{
- Locker lock;
- *str = reinterpret_cast<PDFJSImpObject *>(obj)->toString();
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_from_number_cpp(pdf_jsimp *imp, double num, pdf_jsimp_obj **obj)
-{
- Locker lock;
- *obj = reinterpret_cast<pdf_jsimp_obj *>(new PDFJSImpObject(num));
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_to_number_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, double *num)
-{
- Locker lock;
- *num = reinterpret_cast<PDFJSImpObject *>(obj)->toNumber();
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_array_len_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, int *len)
-{
- Locker lock;
- Local<Object> jsobj = reinterpret_cast<PDFJSImpObject *>(obj)->toValue()->ToObject();
- Local<Array> arr = Local<Array>::Cast(jsobj);
- *len = arr->Length();
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_array_item_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, int i, pdf_jsimp_obj **item)
-{
- Locker lock;
- Local<Object> jsobj = reinterpret_cast<PDFJSImpObject *>(obj)->toValue()->ToObject();
- *item = reinterpret_cast<pdf_jsimp_obj *>(new PDFJSImpObject(jsobj->Get(Number::New(i))));
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_property_cpp(pdf_jsimp *imp, pdf_jsimp_obj *obj, char *prop, pdf_jsimp_obj **pobj)
-{
- Locker lock;
- Local<Object> jsobj = reinterpret_cast<PDFJSImpObject *>(obj)->toValue()->ToObject();
- *pobj = reinterpret_cast<pdf_jsimp_obj *>(new PDFJSImpObject(jsobj->Get(String::New(prop))));
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_execute_cpp(pdf_jsimp *imp, char *code)
-{
- Locker lock;
- PDFJSImp *vImp = reinterpret_cast<PDFJSImp *>(imp);
- HandleScope scope;
- Context::Scope context_scope(vImp->context);
- Handle<Script> script = Script::Compile(String::New(code));
- if (script.IsEmpty())
- return "compile failed in pdf_jsimp_execute";
- script->Run();
- return NULL;
-}
-
-extern "C" const char *pdf_jsimp_execute_count_cpp(pdf_jsimp *imp, char *code, int count)
-{
- Locker lock;
- PDFJSImp *vImp = reinterpret_cast<PDFJSImp *>(imp);
- HandleScope scope;
- Context::Scope context_scope(vImp->context);
- Handle<Script> script = Script::Compile(String::New(code, count));
- if (script.IsEmpty())
- return "compile failed in pdf_jsimp_execute_count";
- script->Run();
- return NULL;
-}