JSValue QtInstance::defaultValue(ExecState* exec, PreferredPrimitiveType hint) const { if (hint == PreferString) return stringValue(exec); if (hint == PreferNumber) return numberValue(exec); return valueOf(exec); }
JSValue* BalInstance::defaultValue(ExecState* exec, JSType hint) const { if (hint == (JSType)StringType) return stringValue(exec); if (hint == (JSType)NumberType) return numberValue(exec); if (hint == (JSType)BooleanType) return booleanValue(); return valueOf(exec); }
JSValue* CInstance::defaultValue(JSType hint) const { if (hint == StringType) return stringValue(); if (hint == NumberType) return numberValue(); if (hint == BooleanType) return booleanValue(); return valueOf(); }
RuntimeNPObject::InvokeResult LibvlcPlaylistItemsNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) { /* is plugin still running */ if( isPluginRunning() ) { VlcPlugin* p_plugin = getPrivate<VlcPlugin>(); libvlc_exception_t ex; libvlc_exception_init(&ex); switch( index ) { case ID_playlistitems_clear: if( argCount == 0 ) { p_plugin->playlist_clear(&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlistitems_remove: if( (argCount == 1) && isNumberValue(args[0]) ) { p_plugin->playlist_delete_item(numberValue(args[0]),&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; default: ; } } return INVOKERESULT_GENERIC_ERROR; }
// primaryExpr ::= NUMBER // | STRING // | variable // | function '(' exprList ')' // | '(' expr ')' std::unique_ptr<Expr> FlowParser::primaryExpr() { FNTRACE(); static struct { const char* ident; long long nominator; long long denominator; } units[] = { { "byte", 1, 1 }, { "kbyte", 1024llu, 1 }, { "mbyte", 1024llu * 1024, 1 }, { "gbyte", 1024llu * 1024 * 1024, 1 }, { "tbyte", 1024llu * 1024 * 1024 * 1024, 1 }, { "bit", 1, 8 }, { "kbit", 1024llu, 8 }, { "mbit", 1024llu * 1024, 8 }, { "gbit", 1024llu * 1024 * 1024, 8 }, { "tbit", 1024llu * 1024 * 1024 * 1024, 8 }, { "sec", 1, 1 }, { "min", 60llu, 1 }, { "hour", 60llu * 60, 1 }, { "day", 60llu * 60 * 24, 1 }, { "week", 60llu * 60 * 24 * 7, 1 }, { "month", 60llu * 60 * 24 * 30, 1 }, { "year", 60llu * 60 * 24 * 365, 1 }, { nullptr, 1, 1 } }; FlowLocation loc(location()); switch (token()) { case FlowToken::Ident: { std::string name = stringValue(); nextToken(); Symbol* symbol = scope()->lookup(name, Lookup::All); if (!symbol) { // XXX assume that given symbol is a auto forward-declared handler. Handler* href = (Handler*) globalScope()->appendSymbol(std::make_unique<Handler>(name, loc)); return std::make_unique<HandlerRefExpr>(href, loc); } if (auto variable = dynamic_cast<Variable*>(symbol)) return std::make_unique<VariableExpr>(variable, loc); if (auto handler = dynamic_cast<Handler*>(symbol)) return std::make_unique<HandlerRefExpr>(handler, loc); if (symbol->type() == Symbol::BuiltinFunction) { if (token() != FlowToken::RndOpen) return std::make_unique<FunctionCallExpr>((BuiltinFunction*) symbol, ExprList()/*args*/, loc); nextToken(); ExprList args; bool rv = listExpr(args); consume(FlowToken::RndClose); if (!rv) return nullptr; return std::make_unique<FunctionCallExpr>((BuiltinFunction*) symbol, std::move(args), loc); } reportError("Unsupported symbol type of '%s' in expression.", name.c_str()); return nullptr; } case FlowToken::Boolean: { std::unique_ptr<BoolExpr> e = std::make_unique<BoolExpr>(booleanValue(), loc); nextToken(); return std::move(e); } case FlowToken::RegExp: { std::unique_ptr<RegExpExpr> e = std::make_unique<RegExpExpr>(RegExp(stringValue()), loc); nextToken(); return std::move(e); } case FlowToken::InterpolatedStringFragment: return interpolatedStr(); case FlowToken::String: case FlowToken::RawString: { std::unique_ptr<StringExpr> e = std::make_unique<StringExpr>(stringValue(), loc); nextToken(); return std::move(e); } case FlowToken::Number: { // NUMBER [UNIT] auto number = numberValue(); nextToken(); if (token() == FlowToken::Ident) { std::string sv(stringValue()); for (size_t i = 0; units[i].ident; ++i) { if (sv == units[i].ident || (sv[sv.size() - 1] == 's' && sv.substr(0, sv.size() - 1) == units[i].ident)) { nextToken(); // UNIT number = number * units[i].nominator / units[i].denominator; loc.update(end()); break; } } } return std::make_unique<NumberExpr>(number, loc); } case FlowToken::IP: { std::unique_ptr<IPAddressExpr> e = std::make_unique<IPAddressExpr>(lexer_->ipValue(), loc); nextToken(); return std::move(e); } case FlowToken::Cidr: { std::unique_ptr<CidrExpr> e = std::make_unique<CidrExpr>(lexer_->cidr(), loc); nextToken(); return std::move(e); } case FlowToken::StringType: case FlowToken::NumberType: case FlowToken::BoolType: return castExpr(); case FlowToken::Begin: { // lambda-like inline function ref char name[64]; static unsigned long i = 0; ++i; snprintf(name, sizeof(name), "__lambda_%lu", i); FlowLocation loc = location(); auto st = std::make_unique<SymbolTable>(scope(), name); enter(st.get()); std::unique_ptr<Stmt> body = compoundStmt(); leave(); if (!body) return nullptr; loc.update(body->location().end); Handler* handler = new Handler(name, std::move(st), std::move(body), loc); // TODO (memory leak): add handler to unit's global scope, i.e. via: // - scope()->rootScope()->insert(handler); // - unit_->scope()->insert(handler); // to get free'd return std::make_unique<HandlerRefExpr>(handler, loc); } case FlowToken::RndOpen: { nextToken(); std::unique_ptr<Expr> e = expr(); consume(FlowToken::RndClose); e->setLocation(loc.update(end())); return e; } default: TRACE(1, "Expected primary expression. Got something... else."); reportUnexpectedToken(); return nullptr; } }
RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) { /* is plugin still running */ if( isPluginRunning() ) { VlcPlugin* p_plugin = getPrivate<VlcPlugin>(); libvlc_exception_t ex; libvlc_exception_init(&ex); switch( index ) { // XXX FIXME this needs squashing into something much smaller case ID_playlist_add: { if( (argCount < 1) || (argCount > 3) ) return INVOKERESULT_NO_SUCH_METHOD; if( !NPVARIANT_IS_STRING(args[0]) ) return INVOKERESULT_NO_SUCH_METHOD; // grab URL char *s = stringValue(NPVARIANT_TO_STRING(args[0])); if( !s ) return INVOKERESULT_OUT_OF_MEMORY; char *url = p_plugin->getAbsoluteURL(s); if( url ) free(s); else // problem with combining url, use argument url = s; char *name = NULL; // grab name if available if( argCount > 1 ) { if( NPVARIANT_IS_NULL(args[1]) ) { // do nothing } else if( NPVARIANT_IS_STRING(args[1]) ) { name = stringValue(NPVARIANT_TO_STRING(args[1])); } else { free(url); return INVOKERESULT_INVALID_VALUE; } } int i_options = 0; char** ppsz_options = NULL; // grab options if available if( argCount > 2 ) { if( NPVARIANT_IS_NULL(args[2]) ) { // do nothing } else if( NPVARIANT_IS_STRING(args[2]) ) { parseOptions(NPVARIANT_TO_STRING(args[2]), &i_options, &ppsz_options); } else if( NPVARIANT_IS_OBJECT(args[2]) ) { parseOptions(NPVARIANT_TO_OBJECT(args[2]), &i_options, &ppsz_options); } else { free(url); free(name); return INVOKERESULT_INVALID_VALUE; } } int item = p_plugin->playlist_add_extended_untrusted(url, name, i_options, const_cast<const char **>(ppsz_options), &ex); free(url); free(name); for( int i=0; i< i_options; ++i ) { free(ppsz_options[i]); } free(ppsz_options); RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(item, result); return INVOKERESULT_NO_ERROR; } case ID_playlist_play: if( argCount == 0 ) { p_plugin->playlist_play(&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_playItem: if( (argCount == 1) && isNumberValue(args[0]) ) { p_plugin->playlist_play_item(numberValue(args[0]),&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_togglepause: if( argCount == 0 ) { p_plugin->playlist_pause(&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_stop: if( argCount == 0 ) { p_plugin->playlist_stop(&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_next: if( argCount == 0 ) { p_plugin->playlist_next(&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_prev: if( argCount == 0 ) { p_plugin->playlist_prev(&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_clear: /* deprecated */ if( argCount == 0 ) { p_plugin->playlist_clear(&ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_removeitem: /* deprecated */ if( (argCount == 1) && isNumberValue(args[0]) ) { p_plugin->playlist_delete_item(numberValue(args[0]), &ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; default: ; } } return INVOKERESULT_GENERIC_ERROR; }
RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) { /* is plugin still running */ if( isPluginRunning() ) { VlcPlugin* p_plugin = getPrivate<VlcPlugin>(); libvlc_exception_t ex; libvlc_exception_init(&ex); switch( index ) { case ID_audio_togglemute: if( argCount == 0 ) { libvlc_audio_toggle_mute(p_plugin->getVLC(), &ex); RETURN_ON_EXCEPTION(this,ex); VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_audio_description: { if( argCount == 1) { char *psz_name; int i_trackID, i_limit, i; libvlc_track_description_t *p_trackDesc; libvlc_media_player_t *p_md = p_plugin->getMD(&ex); RETURN_ON_EXCEPTION(this,ex); /* get tracks description */ p_trackDesc = libvlc_audio_get_track_description(p_md, &ex); RETURN_ON_EXCEPTION(this,ex); if( !p_trackDesc ) return INVOKERESULT_GENERIC_ERROR; /* get the number of track available */ i_limit = libvlc_audio_get_track_count(p_md, &ex); RETURN_ON_EXCEPTION(this,ex); /* check if a number is given by the user * and get the track number */ if( isNumberValue(args[0]) ) i_trackID = numberValue(args[0]); else return INVOKERESULT_INVALID_VALUE; /* if bad number is given return invalid value */ if ( ( i_trackID > ( i_limit - 1 ) ) || ( i_trackID < 0 ) ) return INVOKERESULT_INVALID_VALUE; /* get the good trackDesc */ for( i = 0 ; i < i_trackID ; i++ ) { p_trackDesc = p_trackDesc->p_next; } psz_name = p_trackDesc->psz_name; /* display the name of the track chosen */ return invokeResultString( psz_name, result ); } return INVOKERESULT_NO_SUCH_METHOD; } default: ; } } return INVOKERESULT_GENERIC_ERROR; }
RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const NPVariant &value) { /* is plugin still running */ if( isPluginRunning() ) { VlcPlugin* p_plugin = getPrivate<VlcPlugin>(); libvlc_exception_t ex; libvlc_exception_init(&ex); libvlc_media_player_t *p_md = p_plugin->getMD(&ex); RETURN_ON_EXCEPTION(this,ex); switch( index ) { case ID_video_fullscreen: { if( ! NPVARIANT_IS_BOOLEAN(value) ) { return INVOKERESULT_INVALID_VALUE; } int val = NPVARIANT_TO_BOOLEAN(value); p_plugin->set_fullscreen(val, &ex); RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } case ID_video_aspectratio: { char *psz_aspect = NULL; if( ! NPVARIANT_IS_STRING(value) ) { return INVOKERESULT_INVALID_VALUE; } psz_aspect = stringValue(NPVARIANT_TO_STRING(value)); if( !psz_aspect ) { return INVOKERESULT_GENERIC_ERROR; } libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex); free(psz_aspect); RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } case ID_video_subtitle: { if( isNumberValue(value) ) { libvlc_video_set_spu(p_md, numberValue(value), &ex); RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_INVALID_VALUE; } case ID_video_crop: { char *psz_geometry = NULL; if( ! NPVARIANT_IS_STRING(value) ) { return INVOKERESULT_INVALID_VALUE; } psz_geometry = stringValue(NPVARIANT_TO_STRING(value)); if( !psz_geometry ) { return INVOKERESULT_GENERIC_ERROR; } libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex); free(psz_geometry); RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } case ID_video_teletext: { if( isNumberValue(value) ) { libvlc_video_set_teletext(p_md, numberValue(value), &ex); RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_INVALID_VALUE; } } } return INVOKERESULT_GENERIC_ERROR; }