#include "globals.h" #include "V8Script.h" #include using namespace v8; V8Script::V8Script() : exceptionCallback(NULL), exceptionCallbackParam(NULL) { } V8Script::~V8Script() { dispose(); } static Handle IsEmptyCallback(const Arguments& args) { if (args.Length() < 1) return Undefined(); HandleScope scope; for(int i = 0; i < args.Length(); i++) { Local arg = args[0]; if (arg.IsEmpty() || arg->IsNull() || arg->IsUndefined()) { return Boolean::New(true); } else if (arg->IsObject()) { Local self = Local::Cast(arg); if (self->InternalFieldCount() < 1) continue; Local wrap = Local::Cast(self->GetInternalField(0)); FieldState *field = (FieldState *) wrap->Value(); if (field == NULL) continue; if (field->isEmpty()) return Boolean::New(true); } else if (arg->IsString()) { Local str = Local::Cast(arg); if (str->Length() <= 0) return Boolean::New(true); } } return Boolean::New(false); } static Handle RGBCallback(const Arguments& args) { if (args.Length() != 3) return Undefined(); COLORREF color = RGB(args[0]->Int32Value(), args[1]->Int32Value(), args[2]->Int32Value()); return Int32::New(color); } static Handle AlertCallback(const Arguments& args) { Local wrap = Local::Cast(args.Data()); if (wrap.IsEmpty()) return Int32::New(-1); Dialog *dialog = (Dialog *) wrap->Value(); if (dialog == NULL) return Int32::New(-1); if (args.Length() < 1) return Int32::New(-1); Local arg = args[0]; if (!arg->IsString()) return Int32::New(-1); Local str = Local::Cast(arg); String::Utf8Value utf8_value(str); std::tstring title; title = CharToTchar(dialog->getName()); title += _T(" - Skin alert"); MessageBox(NULL, Utf8ToTchar(*utf8_value), title.c_str(), MB_OK); return Int32::New(0); } bool V8Script::compile(const TCHAR *source, Dialog *dlg) { dispose(); HandleScope handle_scope; Handle global = ObjectTemplate::New(); global->Set(String::New("IsEmpty"), FunctionTemplate::New(&IsEmptyCallback)); global->Set(String::New("RGB"), FunctionTemplate::New(&RGBCallback)); global->Set(String::New("alert"), FunctionTemplate::New(&AlertCallback, External::New(dlg))); global->Set(String::New("NUMBER"), String::New("NUMBER")); global->Set(String::New("CHECKBOX"), String::New("CHECKBOX")); global->Set(String::New("TEXT"), String::New("TEXT")); global->Set(String::New("LEFT"), String::New("LEFT")); global->Set(String::New("CENTER"), String::New("CENTER")); global->Set(String::New("RIGHT"), String::New("RIGHT")); context = Context::New(NULL, global); Context::Scope context_scope(context); context->Global()->Set(String::New("window"), wrappers.createDialogWrapper(), ReadOnly); context->Global()->Set(String::New("opts"), wrappers.createOptionsWrapper(), ReadOnly); for(unsigned int i = 0; i < dlg->getFieldCount(); i++) { Field *field = dlg->getField(i); context->Global()->Set(String::New(field->getName()), wrappers.createWrapper(field->getType()), ReadOnly); } wrappers.clearTemplates(); TryCatch try_catch; Local