bool GenericNPObject::RemoveProperty(NPIdentifier name) { if (invalid) return false; try { if (NPNFuncs.identifierisstring(name)) { char *key = NPNFuncs.utf8fromidentifier(name); if (alpha_mapper.count(key) > 0) { NPNFuncs.releasevariantvalue(&(alpha_mapper[key])); alpha_mapper.erase(key); } } else { // assume int... unsigned long key = (unsigned long)NPNFuncs.intfromidentifier(name); if (numeric_mapper.size() > key) { NPNFuncs.releasevariantvalue(&(numeric_mapper[key])); numeric_mapper.erase(numeric_mapper.begin() + key); } NPVARIANT_TO_INT32(immutables["length"])--; } } catch (...) { } return true; }
v8::Handle<v8::Value> convertNPVariantToV8Object(const NPVariant* variant, NPObject* owner, v8::Isolate* isolate) { NPVariantType type = variant->type; switch (type) { case NPVariantType_Int32: return v8::Integer::New(NPVARIANT_TO_INT32(*variant), isolate); case NPVariantType_Double: return v8::Number::New(isolate, NPVARIANT_TO_DOUBLE(*variant)); case NPVariantType_Bool: return v8Boolean(NPVARIANT_TO_BOOLEAN(*variant), isolate); case NPVariantType_Null: return v8::Null(isolate); case NPVariantType_Void: return v8::Undefined(isolate); case NPVariantType_String: { NPString src = NPVARIANT_TO_STRING(*variant); return v8::String::NewFromUtf8(isolate, src.UTF8Characters, v8::String::kNormalString, src.UTF8Length); } case NPVariantType_Object: { NPObject* object = NPVARIANT_TO_OBJECT(*variant); if (V8NPObject* v8Object = npObjectToV8NPObject(object)) return v8::Local<v8::Object>::New(isolate, v8Object->v8Object); return createV8ObjectForNPObject(object, owner, isolate); } default: return v8::Undefined(isolate); } }
bool convert_js_to_mrb_array(NPP npp, const NPVariant &variant, mrb_state *mrb, mrb_value *result) { NPVariant length; NPN_GetProperty(npp, NPVARIANT_TO_OBJECT(variant), NPN_GetStringIdentifier("length"), &length); int len; if (NPVARIANT_IS_INT32(length)){ len = NPVARIANT_TO_INT32(length); }else if (NPVARIANT_IS_DOUBLE(length)){ len = static_cast< int >(NPVARIANT_TO_DOUBLE(length)); // Why double?? }else{ NPN_ReleaseVariantValue(&length); return false; } NPN_ReleaseVariantValue(&length); mrb_value ret_array = mrb_ary_new_capa(mrb, len); for (int32_t i=0; i<len; i++){ NPVariant item; std::ostringstream oss; oss << i; NPN_GetProperty(npp, NPVARIANT_TO_OBJECT(variant), NPN_GetStringIdentifier(oss.str().c_str()), &item); mrb_value mrb_item; if (!convert_js_to_mrb(npp, item, mrb, &mrb_item)){ NPN_ReleaseVariantValue(&item); return false; } NPN_ReleaseVariantValue(&item); mrb_ary_push(mrb, ret_array, mrb_item); } *result = ret_array; return true; }
bool convert_js_to_mrb(NPP npp, const NPVariant &variant, mrb_state *mrb, mrb_value *result) { switch(variant.type){ case NPVariantType_Void: case NPVariantType_Null: *result = mrb_nil_value(); return true; case NPVariantType_Bool: if (NPVARIANT_TO_BOOLEAN(variant)){ *result = mrb_true_value(); }else{ *result = mrb_false_value(); } return true; case NPVariantType_Int32: *result = mrb_fixnum_value(NPVARIANT_TO_INT32(variant)); return true; case NPVariantType_Double: *result = mrb_float_value(NPVARIANT_TO_DOUBLE(variant)); return true; case NPVariantType_String: *result = mrb_str_new(mrb, NPVARIANT_TO_STRING(variant).UTF8Characters, NPVARIANT_TO_STRING(variant).UTF8Length); return true; case NPVariantType_Object: return convert_js_to_mrb_object(npp, variant, mrb, result); default: break; } return false; }
bool ScriptablePluginObject::SetProperty(NPIdentifier name, const NPVariant *value) { if (!m_plugin) return false; std::string str; std::stringstream ss; bool boolean = false; unsigned short val = -1; if (NPVARIANT_IS_STRING(*value)) { str.assign(NPVARIANT_TO_STRING(*value).UTF8Characters, NPVARIANT_TO_STRING(*value).UTF8Length); } else if (NPVARIANT_IS_BOOLEAN(*value)) { boolean = NPVARIANT_TO_BOOLEAN(*value); } else if (NPVARIANT_IS_INT32(*value)) { val = NPVARIANT_TO_INT32(*value); ss << val; ss >> str; }
NPIdentifier int32VariantToIdentifier(NPVariant variant) { assert(NPVARIANT_IS_INT32(variant)); int32_t integer = NPVARIANT_TO_INT32(variant); return NPN_GetIntIdentifier(integer); }
double CPlugin::GetZoomLevel() { double level = 1; NPVariant vLevel; VOID_TO_NPVARIANT(vLevel); try { NPObject* pContainer = GetContainer(); if (!NPN_Invoke(m_pNPInstance, pContainer, GetIdentifier("getZoomLevel"), NULL, 0, &vLevel)) { throw CString(_T("Cannot invoke window.Container.getZoomLevel()")); } if (NPVARIANT_IS_DOUBLE(vLevel)) level = NPVARIANT_TO_DOUBLE(vLevel); else if ( NPVARIANT_IS_INT32(vLevel) ) level = NPVARIANT_TO_INT32(vLevel); } catch (const CString& strMessage) { level = 1; UNUSED(strMessage); TRACE(_T("[CPlugin::GetZoomLevel Exception] %s\n"), strMessage); } if (!NPVARIANT_IS_VOID(vLevel)) NPN_ReleaseVariantValue(&vLevel); return level; }
v8::Handle<v8::Value> convertNPVariantToV8Object(const NPVariant* variant, NPObject* npobject) { NPVariantType type = variant->type; switch (type) { case NPVariantType_Int32: return v8Integer(NPVARIANT_TO_INT32(*variant)); case NPVariantType_Double: return v8::Number::New(NPVARIANT_TO_DOUBLE(*variant)); case NPVariantType_Bool: return v8Boolean(NPVARIANT_TO_BOOLEAN(*variant)); case NPVariantType_Null: return v8::Null(); case NPVariantType_Void: return v8::Undefined(); case NPVariantType_String: { NPString src = NPVARIANT_TO_STRING(*variant); return v8::String::New(src.UTF8Characters, src.UTF8Length); } case NPVariantType_Object: { NPObject* obj = NPVARIANT_TO_OBJECT(*variant); if (obj->_class == npScriptObjectClass) return reinterpret_cast<V8NPObject*>(obj)->v8Object; return createV8ObjectForNPObject(obj, npobject); } default: return v8::Undefined(); } }
JSValue convertNPVariantToValue(ExecState* exec, const NPVariant* variant, RootObject* rootObject) { JSLockHolder lock(exec); NPVariantType type = variant->type; if (type == NPVariantType_Bool) return jsBoolean(NPVARIANT_TO_BOOLEAN(*variant)); if (type == NPVariantType_Null) return jsNull(); if (type == NPVariantType_Void) return jsUndefined(); if (type == NPVariantType_Int32) return jsNumber(NPVARIANT_TO_INT32(*variant)); if (type == NPVariantType_Double) return jsNumber(NPVARIANT_TO_DOUBLE(*variant)); if (type == NPVariantType_String) return WebCore::jsString(exec, convertNPStringToUTF16(&variant->value.stringValue)); if (type == NPVariantType_Object) { NPObject* obj = variant->value.objectValue; if (obj->_class == NPScriptObjectClass) // Get JSObject from NP_JavaScriptObject. return ((JavaScriptObject*)obj)->imp; // Wrap NPObject in a CInstance. return CInstance::create(obj, rootObject)->createRuntimeObject(exec); } return jsUndefined(); }
bool NPSafeArray::GetItem(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { NPSafeArray *safe = static_cast<NPSafeArray*>(npobj); if (safe->arr_.m_psa == NULL) return false; LONG dim = safe->arr_.GetDimensions(); if (argCount < safe->arr_.GetDimensions()) { return false; } CAutoVectorPtr<LONG>pos(new LONG[dim]); for (int i = 0; i < dim; ++i) { if (NPVARIANT_IS_DOUBLE(args[i])) { pos[i] = (LONG)NPVARIANT_TO_DOUBLE(args[i]); } else if (NPVARIANT_IS_INT32(args[i])) { pos[i] = NPVARIANT_TO_INT32(args[i]); } else { return false; } } VARIANT var; if (!SUCCEEDED(safe->arr_.MultiDimGetAt(pos, var))) { return false; } Variant2NPVar(&var, result, safe->instance); return true; }
v8::Handle<v8::Value> ConvertNPVariantToV8Object(const NPVariant* variant, NPObject* npobject) { NPVariantType type = variant->type; if (type == NPVariantType_Int32) { return v8::Integer::New(NPVARIANT_TO_INT32(*variant)); } if (type == NPVariantType_Double) { return v8::Number::New(NPVARIANT_TO_DOUBLE(*variant)); } if (type == NPVariantType_Bool) { return NPVARIANT_TO_BOOLEAN(*variant) ? v8::True() : v8::False(); } if (type == NPVariantType_Null) { return v8::Null(); } if (type == NPVariantType_Void) { return v8::Undefined(); } if (type == NPVariantType_String) { NPString src = NPVARIANT_TO_STRING(*variant); return v8::String::New(src.UTF8Characters, src.UTF8Length); } if (type == NPVariantType_Object) { NPObject* obj = NPVARIANT_TO_OBJECT(*variant); if (obj->_class == NPScriptObjectClass) { return reinterpret_cast<V8NPObject*>(obj)->v8_object; } return CreateV8ObjectForNPObject(obj, npobject); } return v8::Undefined(); }
bool JsAgent::onLoad(const NPVariant* args, unsigned argCount) { Debug::println("JsAgent::onLoad"); if(argCount != 4) { Debug::println("JsAgent::onLoad> argCount != 4"); return false; } if( !NPVARIANT_IS_OBJECT(args[0]) || !NPVARIANT_IS_STRING(args[1]) || !NPVARIANT_IS_INT32(args[2]) || !NPVARIANT_IS_STRING(args[3]) ) { Debug::println("JsAgent::onLoad> arg types wrong"); return false; } NPObject* pObject = NPVARIANT_TO_OBJECT(args[0]); m_helper = NPN_RetainObject(pObject); NPObject* pDebug = NPN_CreateObject(getNPP(), GetNPClass<JsDebug>()); NPN_RetainObject(pDebug); Variant var; var.set(pDebug); if(!NPN_SetProperty(getNPP(), m_window, methods.debug, var.ptr())) { Debug::println("JsAgent::onLoad> set property failed"); return false; } NPString npstr = NPVARIANT_TO_STRING(args[1]); std::string host(npstr.UTF8Characters, npstr.UTF8Length); int port = NPVARIANT_TO_INT32(args[2]); npstr = NPVARIANT_TO_STRING(args[3]); std::string typeName(npstr.UTF8Characters, npstr.UTF8Length); if(!m_channel->connect(host.c_str(), port)) { Debug::println("JsAgent::onLoad> could not connect"); return false; } LoadMessage msg; msg.typeName = typeName; ArchiveWriter<Channel> ar(*m_channel); if(!Message::send(msg, ar)) { Debug::println("JsAgent::onLoad> send failed"); return false; } JsValue ret; return dispatchAndReturn(ret); }
void Any::Set(ptr<Script::Any> index, ptr<Script::Any> value) { NPVariant indexVariant = fast_cast<Any*>(&*index)->variant; if(NPVARIANT_IS_STRING(indexVariant)) InternalSet( Platform::NpapiPlugin::browserFuncs.getstringidentifier( NPVARIANT_TO_STRING(indexVariant).UTF8Characters), value); else if(NPVARIANT_IS_INT32(indexVariant)) Set(NPVARIANT_TO_INT32(indexVariant), value); }
bool GenericNPObject::SetProperty(NPIdentifier name, const NPVariant *value) { if (invalid) return false; try { if (NPNFuncs.identifierisstring(name)) { char *key = NPNFuncs.utf8fromidentifier(name); if (immutables.count(key) > 0) { // the key is already defined as immutable, check the new value type if (value->type != immutables[key].type) { return false; } // Seems ok, copy the new value if (!CopyNPVariant(&(immutables[key]), value)) { return false; } } else if (!CopyNPVariant(&(alpha_mapper[key]), value)) { return false; } } else { // assume int... NPVariant var; if (!CopyNPVariant(&var, value)) { return false; } unsigned long key = (unsigned long)NPNFuncs.intfromidentifier(name); if (key >= numeric_mapper.size()) { // there's a gap we need to fill NPVariant pad; VOID_TO_NPVARIANT(pad); numeric_mapper.insert(numeric_mapper.end(), key - numeric_mapper.size() + 1, pad); } numeric_mapper.at(key) = var; NPVARIANT_TO_INT32(immutables["length"])++; } } catch (...) { } return true; }
Any convertToAny(NPP npp, const NPVariant* variant) { switch (variant->type) { case NPVariantType_Void: case NPVariantType_Null: return Any(); break; case NPVariantType_Bool: return NPVARIANT_TO_BOOLEAN(*variant); break; case NPVariantType_Int32: return NPVARIANT_TO_INT32(*variant); break; case NPVariantType_Double: return NPVARIANT_TO_DOUBLE(*variant); break; case NPVariantType_String: return std::string(NPVARIANT_TO_STRING(*variant).utf8characters, NPVARIANT_TO_STRING(*variant).utf8length); break; case NPVariantType_Object: { NPObject* object = NPVARIANT_TO_OBJECT(*variant); if (!object) { break; } if (StubObject::isStub(object)) { StubObject* stub = static_cast<StubObject*>(object); return stub->getObject(); } PluginInstance* instance = static_cast<PluginInstance*>(npp->pdata); if (instance) { ProxyControl* proxyControl = instance->getProxyControl(); if (proxyControl) { return proxyControl->createProxy(object); } } break; } default: break; } return Any(); }
ptr<Script::Any> Any::Get(ptr<Script::Any> index) const { NPVariant indexVariant = fast_cast<Any*>(&*index)->variant; if(NPVARIANT_IS_STRING(indexVariant)) return InternalGet( Platform::NpapiPlugin::browserFuncs.getstringidentifier( NPVARIANT_TO_STRING(indexVariant).UTF8Characters)); if(NPVARIANT_IS_INT32(indexVariant)) return Get(NPVARIANT_TO_INT32(indexVariant)); NPVariant result; VOID_TO_NPVARIANT(result); return state->CreateAny(result); }
vector<string> CppVariant::toStringVector() const { WEBKIT_ASSERT(isObject()); vector<string> stringVector; NPObject* npValue = value.objectValue; NPIdentifier lengthId = WebBindings::getStringIdentifier("length"); if (!WebBindings::hasProperty(0, npValue, lengthId)) return stringVector; NPVariant lengthValue; if (!WebBindings::getProperty(0, npValue, lengthId, &lengthValue)) return stringVector; int length = 0; // The length is a double in some cases. if (NPVARIANT_IS_DOUBLE(lengthValue)) length = static_cast<int>(NPVARIANT_TO_DOUBLE(lengthValue)); else if (NPVARIANT_IS_INT32(lengthValue)) length = NPVARIANT_TO_INT32(lengthValue); WebBindings::releaseVariantValue(&lengthValue); // For sanity, only allow 100 items. length = min(100, length); for (int i = 0; i < length; ++i) { // Get each of the items. char indexInChar[20]; // Enough size to store 32-bit integer snprintf(indexInChar, 20, "%d", i); string index(indexInChar); NPIdentifier indexId = WebBindings::getStringIdentifier(index.c_str()); if (!WebBindings::hasProperty(0, npValue, indexId)) continue; NPVariant indexValue; if (!WebBindings::getProperty(0, npValue, indexId, &indexValue)) continue; if (NPVARIANT_IS_STRING(indexValue)) { string item(NPVARIANT_TO_STRING(indexValue).UTF8Characters, NPVARIANT_TO_STRING(indexValue).UTF8Length); stringVector.push_back(item); } WebBindings::releaseVariantValue(&indexValue); } return stringVector; }
bool xplayerNPObject::GetDoubleFromArguments (const NPVariant* argv, uint32_t argc, uint32_t argNum, double& _result) { if (!CheckArg (argv, argc, argNum, NPVariantType_Double)) return false; NPVariant arg = argv[argNum]; if (NPVARIANT_IS_DOUBLE (arg)) { _result = NPVARIANT_TO_DOUBLE (arg); } else if (NPVARIANT_IS_INT32 (arg)) { _result = double (NPVARIANT_TO_INT32 (arg)); } return true; }
bool xplayerNPObject::GetInt32FromArguments (const NPVariant* argv, uint32_t argc, uint32_t argNum, int32_t& _result) { if (!CheckArg (argv, argc, argNum, NPVariantType_Int32)) return false; NPVariant arg = argv[argNum]; if (NPVARIANT_IS_INT32 (arg)) { _result = NPVARIANT_TO_INT32 (arg); } else if (NPVARIANT_IS_DOUBLE (arg)) { _result = int32_t (NPVARIANT_TO_DOUBLE (arg)); /* FIXMEchpe: overflow? */ } return true; }
bool JsObjectWrapper::invokeDefault(const NPVariant* args, unsigned argCount, NPVariant* result) { if(argCount < 1) { Debug::println("JsObjectWrapper::invokeDefault> argCount < 1: %d", argCount); return false; } if(!NPVARIANT_IS_OBJECT(args[0])) { Debug::println("JsObjectWrapper::invokeDefault> args[0] not an object"); return false; } NPObject* pArray = NPVARIANT_TO_OBJECT(args[0]); Variant varRet; if(!NPN_GetProperty(getNPP(), pArray, m_agent->methods.length, varRet.ptr())) { Debug::println("JsObjectWrapper::invokeDefault> get length failed"); return false; } if(!NPVARIANT_IS_INT32(varRet.get())) { Debug::println("JsObjectWrapper::invokeDefault> length did not return an int"); return false; } int len = NPVARIANT_TO_INT32(varRet.get()); VariantArray varArgs(len); for(int i = 0; i < len; i++) { NPIdentifier id = NPN_GetIntIdentifier(i); Variant varItem; if(!NPN_GetProperty(getNPP(), pArray, id, varArgs[i].ptr())) { Debug::println("JsObjectWrapper::invokeDefault> get [%d] failed", i); return false; } } Debug::println("JsObjectWrapper::invokeDefault"); if(!m_agent->invokeRemoteDelegate(m_targetId, varArgs.get(), len, result)) { Debug::println("JsObjectWrapper::invokeDefault> invokeRemoteDelegate() failed"); return false; } return true; }
double CPlugin::GetZoomLevel() { double level = 1; NPObject* pWindow = NULL; NPVariant vCOBA; VOID_TO_NPVARIANT(vCOBA); NPVariant vLevel; VOID_TO_NPVARIANT(vLevel); try { if ((NPN_GetValue( m_pNPInstance, NPNVWindowNPObject, &pWindow) != NPERR_NO_ERROR ) || !pWindow ) { throw(CString(_T("Cannot get window"))); } if ((!NPN_GetProperty( m_pNPInstance, pWindow, NPN_GetStringIdentifier ("COBA"), &vCOBA)) || !NPVARIANT_IS_OBJECT (vCOBA)) { throw(CString(_T("Cannot get window.COBA"))); } if (!NPN_Invoke(m_pNPInstance, NPVARIANT_TO_OBJECT(vCOBA), NPN_GetStringIdentifier("getZoomLevel"), NULL, 0, &vLevel)) { throw(CString(_T("Cannot execute window.COBA.getZoomLevel()"))); } if (NPVARIANT_IS_DOUBLE(vLevel)) level = NPVARIANT_TO_DOUBLE(vLevel); else if ( NPVARIANT_IS_INT32(vLevel) ) level = NPVARIANT_TO_INT32(vLevel); } catch (CString strMessage) { level = 1; TRACE(_T("[CPlugin::FireEvent Exception] %s"), strMessage); } if (!NPVARIANT_IS_VOID(vLevel)) NPN_ReleaseVariantValue(&vLevel); if (!NPVARIANT_IS_VOID(vCOBA)) NPN_ReleaseVariantValue(&vCOBA); if (pWindow != NULL) NPN_ReleaseObject(pWindow); return level; }
// PercentLoaded() // // Sends this: // <invoke name="PercentLoaded" returntype="xml"> // <arguments></arguments> // </invoke> // // Receives something like this: // <number>33</number> bool PercentLoaded (NPObject *npobj, NPIdentifier /* name */, const NPVariant */*args */, uint32_t argCount, NPVariant *result) { // log_debug(__PRETTY_FUNCTION__); GnashPluginScriptObject *gpso = (GnashPluginScriptObject *)npobj; if (argCount == 0) { std::vector<std::string> iargs; std::string str = plugin::ExternalInterface::makeInvoke("PercentLoaded", iargs); // Write the message to the Control FD. size_t ret = gpso->writePlayer(str); // Unless we wrote the same amount of data as the message contained, // something went wrong. if (ret != str.size()) { log_error("Couldn't check percent loaded, network problems."); BOOLEAN_TO_NPVARIANT(false, *result); return false; } std::string data = gpso->readPlayer(); if (data.empty()) { BOOLEAN_TO_NPVARIANT(false, *result); return false; } GnashNPVariant value = plugin::ExternalInterface::parseXML(data); if (NPVARIANT_IS_INT32(value.get())) { INT32_TO_NPVARIANT(NPVARIANT_TO_INT32(value.get()), *result); } else { INT32_TO_NPVARIANT(0, *result); } return true; } BOOLEAN_TO_NPVARIANT(false, *result); return false; }
static Eina_Bool ewk_js_npvariant_to_variant(Ewk_JS_Variant* data, const NPVariant* result) { EINA_SAFETY_ON_NULL_RETURN_VAL(data, false); EINA_SAFETY_ON_NULL_RETURN_VAL(result, false); switch (result->type) { case NPVariantType_Void: data->type = EWK_JS_VARIANT_VOID; data->value.o = 0; break; case NPVariantType_Null: data->type = EWK_JS_VARIANT_NULL; data->value.o = 0; break; case NPVariantType_Int32: data->type = EWK_JS_VARIANT_INT32; data->value.i = NPVARIANT_TO_INT32(*result); break; case NPVariantType_Double: data->type = EWK_JS_VARIANT_DOUBLE; data->value.d = NPVARIANT_TO_DOUBLE(*result); break; case NPVariantType_String: data->value.s = eina_stringshare_add_length(NPVARIANT_TO_STRING(*result).UTF8Characters, NPVARIANT_TO_STRING(*result).UTF8Length); data->type = EWK_JS_VARIANT_STRING; break; case NPVariantType_Bool: data->type = EWK_JS_VARIANT_BOOL; data->value.b = NPVARIANT_TO_BOOLEAN(*result); break; case NPVariantType_Object: data->type = EWK_JS_VARIANT_OBJECT; data->value.o = ewk_js_npobject_to_object(NPVARIANT_TO_OBJECT(*result)); break; default: return false; } return true; }
bool NPSafeArray::LBound(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { NPSafeArray *safe = static_cast<NPSafeArray*>(npobj); if (safe->arr_.m_psa == NULL) return false; int dim = 1; if (argCount >= 1) { if (NPVARIANT_IS_INT32(*args)) { dim = NPVARIANT_TO_INT32(*args); } else if (NPVARIANT_IS_DOUBLE(*args)) { dim = (LONG)NPVARIANT_TO_DOUBLE(*args); } else { return false; } } try{ INT32_TO_NPVARIANT(safe->arr_.GetLowerBound(dim - 1), *result); } catch (...) { return false; } return true; }
bool xplayerNPObject::GetBoolFromArguments (const NPVariant* argv, uint32_t argc, uint32_t argNum, bool& _result) { if (!CheckArg (argv, argc, argNum, NPVariantType_Bool)) return false; NPVariant arg = argv[argNum]; if (NPVARIANT_IS_BOOLEAN (arg)) { _result = NPVARIANT_TO_BOOLEAN (arg); } else if (NPVARIANT_IS_INT32 (arg)) { _result = NPVARIANT_TO_INT32 (arg) != 0; } else if (NPVARIANT_IS_DOUBLE (arg)) { _result = NPVARIANT_TO_DOUBLE (arg) != 0.0; } else { /* void/null */ _result = false; } return true; }
void printNPVariant(const NPVariant *value) { if (NPVARIANT_IS_DOUBLE(*value)) { double num = NPVARIANT_TO_DOUBLE(*value); log_debug("is double, value %g", num); } else if (NPVARIANT_IS_STRING(*value)) { std::string str = NPStringToString(NPVARIANT_TO_STRING(*value)); log_debug("is string, value %s", str); } else if (NPVARIANT_IS_BOOLEAN(*value)) { bool flag = NPVARIANT_TO_BOOLEAN(*value); log_debug("is boolean, value %d", flag); } else if (NPVARIANT_IS_INT32(*value)) { int num = NPVARIANT_TO_INT32(*value); log_debug("is int, value %d", num); } else if (NPVARIANT_IS_NULL(*value)) { log_debug("value is null"); } else if (NPVARIANT_IS_VOID(*value)) { log_debug("value is void"); } else if (NPVARIANT_IS_OBJECT(*value)) { log_debug("value is object"); } }
JSValue *convertNPVariantToValue(ExecState*, const NPVariant* variant, RootObject* rootObject) { JSLock lock; NPVariantType type = variant->type; if (type == NPVariantType_Bool) return jsBoolean(NPVARIANT_TO_BOOLEAN(*variant)); if (type == NPVariantType_Null) return jsNull(); if (type == NPVariantType_Void) return jsUndefined(); if (type == NPVariantType_Int32) return jsNumber(NPVARIANT_TO_INT32(*variant)); if (type == NPVariantType_Double) return jsNumber(NPVARIANT_TO_DOUBLE(*variant)); if (type == NPVariantType_String) { NPUTF16 *stringValue; unsigned int UTF16Length; convertNPStringToUTF16(&variant->value.stringValue, &stringValue, &UTF16Length); // requires free() of returned memory UString resultString((const UChar *)stringValue,UTF16Length); free(stringValue); return jsString(resultString); } if (type == NPVariantType_Object) { NPObject *obj = variant->value.objectValue; if (obj->_class == NPScriptObjectClass) // Get JSObject from NP_JavaScriptObject. return ((JavaScriptObject *)obj)->imp; // Wrap NPObject in a CInstance. return Instance::createRuntimeObject(Instance::CLanguage, obj, rootObject); } return jsUndefined(); }
NPError StatementObject::AddParam(const NPVariant *value) { nsODBCParam* pRec = NULL; if (NPVARIANT_IS_VOID(*value) || NPVARIANT_IS_NULL(*value)) { pRec = new nsODBCParam(); } else if (NPVARIANT_IS_BOOLEAN(*value)) { pRec = new nsODBCParam(NPVARIANT_TO_BOOLEAN(*value)); } else if (NPVARIANT_IS_INT32(*value)) { pRec = new nsODBCParam(NPVARIANT_TO_INT32(*value)); } else if (NPVARIANT_IS_DOUBLE(*value)) { double data = NPVARIANT_TO_DOUBLE(*value); double delta = ceil(data); if (data-0.000000001 <delta && data+0.000000001 > delta) pRec = new nsODBCParam((int)data); else pRec = new nsODBCParam(data); //--pRec = new nsODBCParam(NPVARIANT_TO_DOUBLE(*value)); } else if (NPVARIANT_IS_STRING(*value)) { pRec = new nsODBCParam((NPString*)&NPVARIANT_TO_STRING(*value)); } else { NPN_SetException(this, "Unsupported parameter type"); return NPERR_GENERIC_ERROR; } if (pRec) m_params.push_back(pRec); return NPERR_NO_ERROR; }
bool StatementObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { //sprintf(tmp, "stmt Invoke [%s]\n", NPN_UTF8FromIdentifier(name)); log(tmp); NPError rc; VOID_TO_NPVARIANT(*result); int index = 0; if (name == mc_Init_id) { if (argCount < 2) { NPN_SetException(this, "Too few parameters count"); return true; } #if 0 if (!(NPVARIANT_IS_INT32(args[0]) && NPVARIANT_IS_OBJECT(args[1]))) { NPN_SetException(this, "Wrong argument type"); return true; } SQLHANDLE hdbc = (SQLHANDLE)(long)NPVARIANT_TO_INT32(args[0]); #else if (!(NPVARIANT_IS_OBJECT(args[0]) && NPVARIANT_IS_OBJECT(args[1]))) { NPN_SetException(this, "Wrong argument type"); return true; } SQLHANDLE hdbc = (SQLHANDLE)NPVARIANT_TO_OBJECT(args[0]); #endif Init(hdbc, NPVARIANT_TO_OBJECT(args[1])); return true; } else if (name == mc_AddParameter_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } AddParam(args); return true; } else if (name == mc_Execute_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (!NPVARIANT_IS_STRING(args[0])) { NPN_SetException(this, "Wrong argument type"); return true; } Execute((NPString*)&NPVARIANT_TO_STRING(args[0])); return true; } else if (name == mc_Close_id) { Close(); return true; } else if (name == mc_Fetch_id) { bool ret; rc = Fetch(&ret); if (rc != NPERR_NO_ERROR) return true; BOOLEAN_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_MoreResults_id) { bool ret; rc = MoreResults(&ret); if (rc != NPERR_NO_ERROR) return true; BOOLEAN_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_GetColumnName_id) { const char *ret; if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } rc = GetColumnName(index, &ret); if (rc != NPERR_NO_ERROR) return true; STRING_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_GetVariant_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } GetVariant(index, result); return true; } else if (name == mc_GetColumnType_id) { int ret; if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } rc = GetColumnType(index, &ret); if (rc != NPERR_NO_ERROR) return true; INT32_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_IsColumnNullable_id) { bool ret; if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } rc = IsColumnNullable(index, &ret); if (rc != NPERR_NO_ERROR) return true; BOOLEAN_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_GetTables_id) { if (argCount < 4) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } GetTables(&args[0], &args[1], &args[2], &args[3]); return true; } else if (name == mc_GetColumns_id) { if (argCount < 4) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } GetColumns(&args[0], &args[1], &args[2], &args[3]); return true; } else if (name == mc_GetTypeInfo_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } GetTypeInfo(index); return true; } else if (name == mc_GetPrimaryKeys_id) { if (argCount < 3) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } GetPrimaryKeys(&args[0], &args[1], &args[2]); return true; } else if (name == mc_GetForeignKeys_id) { if (argCount < 6) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[4]) || NPVARIANT_IS_STRING(args[4]))) { NPN_SetException(this, "Wrong 5 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[5]) || NPVARIANT_IS_STRING(args[5]))) { NPN_SetException(this, "Wrong 6 argument type"); return true; } GetForeignKeys(&args[0], &args[1], &args[2], &args[3], &args[4], &args[5]); return true; } else if (name == mc_GetProcedures_id) { if (argCount < 3) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } GetProcedures(&args[0], &args[1], &args[2]); return true; } else if (name == mc_GetProcedureColumns_id) { if (argCount < 4) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } GetProcedureColumns(&args[0], &args[1], &args[2], &args[3]); return true; } return false; }
bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { if (m_pMainWindow == NULL) return false; // void Navigate({string} URL, {string} post, {string} headers) if (name == m_NavigateID) { TRACE ("Navigate called!\n"); if (argCount < 3) return false; NPVariant vURL = args[0]; if (vURL.type != NPVariantType_String) return false; CString URL = NPStringToCString(vURL.value.stringValue); NPVariant vHeaders = args[1]; if (vHeaders.type != NPVariantType_String) return false; CString headers = NPStringToCString(vHeaders.value.stringValue); NPVariant vPost = args[2]; if (vPost.type != NPVariantType_String) return false; CString post = NPStringToCString(vPost.value.stringValue); m_pMainWindow->Navigate(URL, post, headers); VOID_TO_NPVARIANT(*result); return true; } // void Refresh() else if (name == m_RefreshID) { TRACE ("Refresh called!\n"); m_pMainWindow->Refresh(); return true; } // void Stop() else if (name == m_StopID) { TRACE ("Stop called!\n"); m_pMainWindow->Stop(); return true; } // void Back() else if (name == m_BackID) { TRACE ("Back called!\n"); m_pMainWindow->Back(); return true; } // void Forward() else if (name == m_ForwardID) { TRACE ("Forward called!\n"); m_pMainWindow->Forward(); return true; } // void Focus() else if (name == m_FocusID) { TRACE ("Focus called!\n"); m_pMainWindow->Focus(); return true; } // void Copy() else if (name == m_CopyID) { TRACE ("Copy called!\n"); m_pMainWindow->Copy(); return true; } // void Cut() else if (name == m_CutID) { TRACE ("Cut called!\n"); m_pMainWindow->Cut(); return true; } // void Paste() else if (name == m_PasteID) { TRACE ("Paste called!\n"); m_pMainWindow->Paste(); return true; } // void SelectAll() else if (name == m_SelectAllID) { TRACE ("SelectAll called!\n"); m_pMainWindow->SelectAll(); return true; } // void Find() else if (name == m_FindID) { TRACE ("Find called!\n"); m_pMainWindow->Find(); return true; } // void HandOverFocus() else if (name == m_HandOverFocusID) { TRACE ("HandOverFocus called!\n"); m_pMainWindow->HandOverFocus(); return true; } // void Zoom({number} level) else if (name == m_ZoomID) { TRACE ("Zoom called!\n"); if (argCount < 1) return false; double level = 1; if (NPVARIANT_IS_DOUBLE(args[0])) level = NPVARIANT_TO_DOUBLE(args[0]); else if ( NPVARIANT_IS_INT32(args[0]) ) level = NPVARIANT_TO_INT32(args[0]); m_pMainWindow->Zoom(level); return true; } // void DisplaySecurityInfo() else if (name == m_DisplaySecurityInfoID) { TRACE ("DisplaySecurityInfo called!\n"); m_pMainWindow->DisplaySecurityInfo(); return true; } // void SaveAs() else if (name == m_SaveAsID) { TRACE ("SaveAs called!\n"); m_pMainWindow->SaveAs(); return true; } // void Print() else if (name == m_PrintID) { TRACE ("Print called!\n"); m_pMainWindow->Print(); return true; } // void PrintPreview() else if (name == m_PrintPreviewID) { TRACE ("PrintPreview called!\n"); m_pMainWindow->PrintPreview(); return true; } // void PrintSetup() else if (name == m_PrintSetupID) { TRACE ("PrintSetup called!\n"); m_pMainWindow->PrintSetup(); return true; } return false; }