JsAgent::MethodIds::MethodIds() : onLoad(NPN_GetStringIdentifier("onLoad")) , onUnload(NPN_GetStringIdentifier("onUnload")) , toString(NPN_GetStringIdentifier("toString")) , defineFunction(NPN_GetStringIdentifier("defineFunction")) , invokeFunction(NPN_GetStringIdentifier("invokeFunction")) , invokeDelegate(NPN_GetStringIdentifier("invokeDelegate")) , wrapDelegate(NPN_GetStringIdentifier("wrapDelegate")) , length(NPN_GetStringIdentifier("length")) , debug(NPN_GetStringIdentifier("debug")) , createArgs(NPN_GetStringIdentifier("createArgs")) , index0(NPN_GetIntIdentifier(0)) , index1(NPN_GetIntIdentifier(1)) {}
NPIdentifier int32VariantToIdentifier(NPVariant variant) { assert(NPVARIANT_IS_INT32(variant)); int32_t integer = NPVARIANT_TO_INT32(variant); return NPN_GetIntIdentifier(integer); }
NPIdentifier doubleVariantToIdentifier(NPVariant variant) { assert(NPVARIANT_IS_DOUBLE(variant)); double value = NPVARIANT_TO_DOUBLE(variant); // sadly there is no "getdoubleidentifier" int32_t integer = static_cast<int32_t>(value); return NPN_GetIntIdentifier(integer); }
// XXX FIXME See comment at the other parseOptions variant. void LibvlcPlaylistNPObject::parseOptions(NPObject *obj, int *i_options, char*** ppsz_options) { /* WARNING: Safari does not implement NPN_HasProperty/NPN_HasMethod */ NPVariant value; /* we are expecting to have a Javascript Array object */ NPIdentifier propId = NPN_GetStringIdentifier("length"); if( NPN_GetProperty(_instance, obj, propId, &value) ) { int count = numberValue(value); NPN_ReleaseVariantValue(&value); if( count ) { long capacity = 16; char **options = (char **)malloc(capacity*sizeof(char *)); if( options ) { int nOptions = 0; while( nOptions < count ) { propId = NPN_GetIntIdentifier(nOptions); if( ! NPN_GetProperty(_instance, obj, propId, &value) ) /* return what we got so far */ break; if( ! NPVARIANT_IS_STRING(value) ) { /* return what we got so far */ NPN_ReleaseVariantValue(&value); break; } if( nOptions == capacity ) { capacity += 16; char **moreOptions = (char **)realloc(options, capacity*sizeof(char*)); if( ! moreOptions ) { /* failed to allocate more memory */ NPN_ReleaseVariantValue(&value); /* return what we got so far */ *i_options = nOptions; *ppsz_options = options; break; } options = moreOptions; } options[nOptions++] = stringValue(value); } *i_options = nOptions; *ppsz_options = options; } } } }
NPIdentifier integerToIdentifier( size_t integer ) { static IntegerToIdentifierMap integerToIdentifierMap; IntegerToIdentifierMap::const_iterator it = integerToIdentifierMap.find( integer ); if ( it == integerToIdentifierMap.end() ) { NPIdentifier identifier = NPN_GetIntIdentifier( integer ); FABRIC_ASSERT( identifier ); it = integerToIdentifierMap.insert( IntegerToIdentifierMap::value_type( integer, identifier ) ).first; } return it->second; }
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; }