JSBool ADM_JSAvidemuxAudio::JSSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { if (JSVAL_IS_INT(id)) { ADM_JSAvidemuxAudio *priv = (ADM_JSAvidemuxAudio *) JS_GetPrivate(cx, obj); switch(JSVAL_TO_INT(id)) { case audioprocess_prop: { if(JSVAL_IS_BOOLEAN(*vp) == false) break; priv->getObject()->m_bNormalize = JSVAL_TO_BOOLEAN(*vp); enterLock(); UI_setAProcessToggleStatus(priv->getObject()->m_bAudioProcess); leaveLock(); break; } case resample_prop: { if(JSVAL_IS_INT(*vp) == false) break; priv->getObject()->m_nResample = JSVAL_TO_INT(*vp); enterLock(); audioFilterResample(priv->getObject()->m_nResample); leaveLock(); break; } case delay_prop: { if(JSVAL_IS_INT(*vp) == false) break; priv->getObject()->m_nDelay = JSVAL_TO_INT(*vp); //audioFilterDelay(priv->getObject()->m_nDelay); enterLock(); UI_setTimeShift(1, priv->getObject()->m_nDelay); leaveLock(); break; } case film2pal_prop: { if(JSVAL_IS_BOOLEAN(*vp) == false) break; priv->getObject()->m_bFilm2PAL = JSVAL_TO_BOOLEAN(*vp); enterLock(); audioFilterFilm2Pal(priv->getObject()->m_bFilm2PAL); leaveLock(); break; } case pal2film_prop: { if(JSVAL_IS_BOOLEAN(*vp) == false) break; priv->getObject()->m_bPAL2Film = JSVAL_TO_BOOLEAN(*vp); enterLock(); audioFilterFilm2Pal(priv->getObject()->m_bPAL2Film); leaveLock(); break; } case normalizemode_prop: { enterLock(); priv->getObject()->m_nNormalizeMode = JSVAL_TO_INT(*vp); audioFilterNormalizeMode(priv->getObject()->m_nNormalizeMode); leaveLock(); break; } case normalizevalue_prop: { priv->getObject()->m_nNormalizeValue = JSVAL_TO_INT(*vp); enterLock(); audioFilterNormalizeValue(priv->getObject()->m_nNormalizeValue); leaveLock(); break; } default : printf("UNKNOWN AUDIO PROP\n"); return JS_FALSE; } } return JS_TRUE; }
INT unit_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { CDebug cDbg("unit getProperty"); BnetData* pData = *p_D2LAUNCH_BnData; GameStructInfo* pInfo = *p_D2CLIENT_GameInfo; switch(JSVAL_TO_INT(id)) { case ME_ACCOUNT: if(!pData) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pData->szAccountName)); break; case ME_CHARNAME: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szCharName)); break; case ME_CHICKENHP: *vp = INT_TO_JSVAL(Vars.nChickenHP); break; case ME_CHICKENMP: *vp = INT_TO_JSVAL(Vars.nChickenMP); break; case ME_DIFF: *vp = INT_TO_JSVAL(D2CLIENT_GetDifficulty()); break; case ME_GAMENAME: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szGameName)); break; case ME_GAMEPASSWORD: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szGamePassword)); break; case ME_GAMESERVERIP: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szGameServerIp)); break; case ME_GAMESTARTTIME: *vp = INT_TO_JSVAL(Vars.dwGameTime); break; case ME_GAMETYPE: *vp = INT_TO_JSVAL(*p_D2CLIENT_ExpCharFlag); break; case ME_ITEMONCURSOR: *vp = BOOLEAN_TO_JSVAL(!!D2CLIENT_GetCursorItem()); break; case ME_LADDER: if(pData) *vp = BOOLEAN_TO_JSVAL(((pData->nCharFlags & PLAYER_TYPE_LADDER) == TRUE)); break; case ME_QUITONHOSTILE: *vp = BOOLEAN_TO_JSVAL(Vars.bQuitOnHostile); break; case ME_REALM: *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pData->szRealmName)); break; case ME_REALMSHORT: *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pData->szRealmName2)); break; case OOG_SCREENSIZE: *vp = INT_TO_JSVAL(D2GFX_GetScreenSize()); break; case OOG_WINDOWTITLE: CHAR szTitle[128]; GetWindowText(D2WIN_GetHwnd(), szTitle, 128); *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, szTitle)); break; case ME_PING: *vp = INT_TO_JSVAL(*p_D2CLIENT_Ping); break; case OOG_INGAME: *vp = BOOLEAN_TO_JSVAL(ClientState() == ClientStateMenu ? FALSE : TRUE); break; case OOG_QUITONERROR: *vp = BOOLEAN_TO_JSVAL(Vars.bQuitOnError); break; case OOG_MAXGAMETIME: *vp = INT_TO_JSVAL(Vars.dwMaxGameTime); break; case OOG_DEBUG: *vp = BOOLEAN_TO_JSVAL(Vars.bDebug); break; case ME_MERCREVIVECOST: *vp = INT_TO_JSVAL((*p_D2CLIENT_MercReviveCost)); break; case ME_BLOCKKEYS: *vp = BOOLEAN_TO_JSVAL(Vars.bBlockKeys); break; case ME_BLOCKMOUSE: *vp = BOOLEAN_TO_JSVAL(Vars.bBlockMouse); break; default: break; } /* // TODO: Properly fix this... if ((JSVAL_TO_INT(id) < OOG_WINDOWTITLE) && !GameReady()) return JS_TRUE; */ if(!GameReady()) return JS_TRUE; myUnit* lpUnit = (myUnit*)JS_GetPrivate(cx, obj); if(!lpUnit || IsBadReadPtr(lpUnit, sizeof(myUnit)) || lpUnit->_dwPrivateType != PRIVATE_UNIT) return JS_TRUE; UnitAny* pUnit = D2CLIENT_FindUnit(lpUnit->dwUnitId, lpUnit->dwType); if(!pUnit) return JS_TRUE; char* tmp = NULL; Room1* pRoom = NULL; switch(JSVAL_TO_INT(id)) { case UNIT_TYPE: *vp = INT_TO_JSVAL(pUnit->dwType); break; case UNIT_CLASSID: *vp = INT_TO_JSVAL(pUnit->dwTxtFileNo); break; case UNIT_MODE: *vp = INT_TO_JSVAL(pUnit->dwMode); break; case UNIT_NAME: tmp = new char[8192]; GetUnitName(pUnit, tmp, 8192); *vp = STRING_TO_JSVAL(JS_InternString(cx, tmp)); delete[] tmp; break; case UNIT_ACT: *vp = INT_TO_JSVAL(pUnit->dwAct + 1); break; case UNIT_AREA: pRoom = D2COMMON_GetRoomFromUnit(pUnit); if(pRoom && pRoom->pRoom2 && pRoom->pRoom2->pLevel) *vp = INT_TO_JSVAL(pRoom->pRoom2->pLevel->dwLevelNo); break; case UNIT_ID: *vp = INT_TO_JSVAL(pUnit->dwUnitId); break; case UNIT_XPOS: *vp = INT_TO_JSVAL(GetUnitX(pUnit)); break; case UNIT_YPOS: *vp = INT_TO_JSVAL(GetUnitY(pUnit)); break; case UNIT_HP: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 6, 0) >> 8); break; case UNIT_HPMAX: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 7, 0) >> 8); break; case UNIT_MP: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 8, 0) >> 8); break; case UNIT_MPMAX: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 9, 0) >> 8); break; case UNIT_STAMINA: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 10, 0) >> 8); break; case UNIT_STAMINAMAX: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 11, 0) >> 8); break; case UNIT_CHARLVL: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 12, 0)); break; case ME_RUNWALK: *vp = INT_TO_JSVAL(*p_D2CLIENT_AlwaysRun); break; case UNIT_ADDRESS: *vp = INT_TO_JSVAL(pUnit); break; case UNIT_SPECTYPE: DWORD SpecType; SpecType = NULL; if(pUnit->dwType == UNIT_MONSTER && pUnit->pMonsterData) { if(pUnit->pMonsterData->fMinion & 1) SpecType |= 0x08; if(pUnit->pMonsterData->fBoss & 1) SpecType |= 0x04; if(pUnit->pMonsterData->fChamp & 1) SpecType |= 0x02; if((pUnit->pMonsterData->fBoss & 1)&& (pUnit->pMonsterData->fNormal & 1)) SpecType |= 0x01; if(pUnit->pMonsterData->fNormal & 1) SpecType |= 0x00; *vp = INT_TO_JSVAL(SpecType); return JS_TRUE; } break; case UNIT_UNIQUEID: if(pUnit->dwType == UNIT_MONSTER && pUnit->pMonsterData->fBoss && pUnit->pMonsterData->fNormal) *vp = INT_TO_JSVAL(pUnit->pMonsterData->wUniqueNo); else *vp = INT_TO_JSVAL(-1); break; case ITEM_CODE: // replace with better method if found if(!(pUnit->dwType == UNIT_ITEM) && pUnit->pItemData) break; ItemTxt* pTxt; pTxt = D2COMMON_GetItemText(pUnit->dwTxtFileNo); if(!pTxt) { *vp = STRING_TO_JSVAL(JS_InternString(cx, "Unknown")); return JS_TRUE; } CHAR szCode[4]; memcpy(szCode, pTxt->szCode, 3); szCode[3] = 0x00; *vp = STRING_TO_JSVAL(JS_InternString(cx, szCode)); break; case ITEM_PREFIX: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) if (D2COMMON_GetItemMagicalMods(pUnit->pItemData->wPrefix)) *vp = STRING_TO_JSVAL(JS_InternString(cx, D2COMMON_GetItemMagicalMods(pUnit->pItemData->wPrefix))); break; case ITEM_SUFFIX: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) if (D2COMMON_GetItemMagicalMods(pUnit->pItemData->wSuffix)) *vp = STRING_TO_JSVAL(JS_InternString(cx, D2COMMON_GetItemMagicalMods(pUnit->pItemData->wSuffix))); break; case ITEM_PREFIXNUM: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->wPrefix); break; case ITEM_SUFFIXNUM: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->wSuffix); break; case ITEM_FNAME: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { wchar_t wszfname[256] = L""; D2CLIENT_GetItemName(pUnit, wszfname, sizeof(wszfname)); if(wszfname) { char* tmp = UnicodeToAnsi(wszfname); *vp = STRING_TO_JSVAL(JS_InternString(cx, tmp)); delete[] tmp; } } break; case ITEM_QUALITY: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->dwQuality); break; case ITEM_NODE: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->NodePage); break; case ITEM_LOC: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->ItemLocation); break; case ITEM_SIZEX: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { if(!D2COMMON_GetItemText(pUnit->dwTxtFileNo)) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemText(pUnit->dwTxtFileNo)->xSize); } break; case ITEM_SIZEY: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { if(!D2COMMON_GetItemText(pUnit->dwTxtFileNo)) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemText(pUnit->dwTxtFileNo)->ySize); } break; case ITEM_Type: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { if(!D2COMMON_GetItemText(pUnit->dwTxtFileNo)) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemText(pUnit->dwTxtFileNo)->nType); } break; case ITEM_DESC: { if(pUnit->dwType != UNIT_ITEM) break; wchar_t wBuffer[8192] = L""; D2CLIENT_GetItemDesc(pUnit, wBuffer); tmp = UnicodeToAnsi(wBuffer); *vp = STRING_TO_JSVAL(JS_InternString(cx, tmp)); delete[] tmp; } break; case UNIT_ITEMCOUNT: if(pUnit->pInventory) *vp = INT_TO_JSVAL(pUnit->pInventory->dwItemCount); break; case ITEM_BODYLOCATION: if(pUnit->dwType != UNIT_ITEM) break; if(pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->BodyLocation); break; case UNIT_OWNER: *vp = INT_TO_JSVAL(pUnit->dwOwnerId); break; case UNIT_OWNERTYPE: *vp = INT_TO_JSVAL(pUnit->dwOwnerType); break; case ITEM_LEVEL: if(pUnit->dwType != UNIT_ITEM) break; if(pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->dwItemLevel); break; case ITEM_LEVELREQ: if(pUnit->dwType != UNIT_ITEM) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemLevelRequirement(pUnit, D2CLIENT_GetPlayerUnit())); break; case UNIT_DIRECTION: if(pUnit->pPath) *vp = INT_TO_JSVAL(pUnit->pPath->bDirection); break; case OBJECT_TYPE: if(pUnit->dwType == UNIT_OBJECT) if(pUnit->pObjectData) { pRoom = D2COMMON_GetRoomFromUnit(pUnit); if(pRoom && pRoom->pRoom2 && pRoom->pRoom2->pLevel && IsTownLevel(pRoom->pRoom2->pLevel->dwLevelNo)) *vp = INT_TO_JSVAL(pUnit->pObjectData->Type & 255); else *vp = INT_TO_JSVAL(pUnit->pObjectData->Type); } break; case ME_WSWITCH: *vp = INT_TO_JSVAL(*p_D2CLIENT_bWeapSwitch); break; default: break; } return JS_TRUE; }
INT unit_interact(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { CDebug cDbg("unit interact"); if(!GameReady()) return JS_TRUE; myUnit* lpUnit = (myUnit*)JS_GetPrivate(cx, obj); *rval = JSVAL_FALSE; if(!lpUnit || IsBadReadPtr(lpUnit, sizeof(myUnit)) || lpUnit->_dwPrivateType != PRIVATE_UNIT) return JS_TRUE; UnitAny* pUnit = D2CLIENT_FindUnit(lpUnit->dwUnitId, lpUnit->dwType); if(!pUnit) return JS_TRUE; if(pUnit->dwType == UNIT_ITEM && pUnit->dwMode != ITEM_MODE_ON_GROUND && pUnit->dwMode != ITEM_MODE_BEING_DROPPED) { INT nLocation = GetItemLocation(pUnit); BYTE aPacket[13] = {NULL}; if(nLocation == STORAGE_INVENTORY) { aPacket[0] = 0x20; *(DWORD*)&aPacket[1] = pUnit->dwUnitId; *(DWORD*)&aPacket[5] = D2CLIENT_GetPlayerUnit()->pPath->xPos; *(DWORD*)&aPacket[9] = D2CLIENT_GetPlayerUnit()->pPath->yPos; D2NET_SendPacket(13, 1, aPacket); return JS_TRUE; } else if(nLocation == STORAGE_BELT) { aPacket[0] = 0x26; *(DWORD*)&aPacket[1] = pUnit->dwUnitId; *(DWORD*)&aPacket[5] = 0; *(DWORD*)&aPacket[9] = 0; D2NET_SendPacket(13, 1, aPacket); return JS_TRUE; } } if(pUnit->dwType == UNIT_OBJECT && argc == 1 && JSVAL_IS_INT(argv[0])) { // TODO: check the range on argv[0] to make sure it won't crash the game D2CLIENT_TakeWaypoint(pUnit->dwUnitId, JSVAL_TO_INT(argv[0])); // D2CLIENT_TakeWP(pUnit->dwUnitId, JSVAL_TO_INT(argv[0])); *rval = JSVAL_TRUE; return JS_TRUE; } else if(pUnit->dwType == UNIT_PLAYER && argc == 1 && JSVAL_IS_INT(argv[0]) && JSVAL_TO_INT(argv[0]) == 1) { // Accept Trade } else { *rval = JSVAL_TRUE; ClickMap(0, GetUnitX(pUnit), GetUnitY(pUnit), FALSE, pUnit); //D2CLIENT_Interact(pUnit, 0x45); } return JS_TRUE; }
static JSBool js_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) { jsval idval; jsint tiny; int32 i=0; JSBool b; jsrefcount rc; JS_IdToValue(cx, id, &idval); tiny = JSVAL_TO_INT(idval); switch(tiny) { case PROP_WSCROLL: JS_ValueToBoolean(cx, *vp, &_wscroll); break; case PROP_DIRECTVIDEO: JS_ValueToBoolean(cx, *vp, &directvideo); break; case PROP_HOLD_UPDATE: JS_ValueToBoolean(cx, *vp, &hold_update); break; case PROP_PUTTEXT_CAN_MOVE: JS_ValueToBoolean(cx, *vp, &puttext_can_move); break; case PROP_ESCDELAY: if(cio_api.ESCDELAY) { if(!JS_ValueToInt32(cx, *vp, (int32*)cio_api.ESCDELAY)) return JS_FALSE; } break; case PROP_TEXTATTR: if(!JS_ValueToInt32(cx, *vp, &i)) return JS_FALSE; rc=JS_SUSPENDREQUEST(cx); textattr(i); JS_RESUMEREQUEST(cx, rc); break; case PROP_WHEREX: if(!JS_ValueToInt32(cx, *vp, &i)) return JS_FALSE; rc=JS_SUSPENDREQUEST(cx); gotoxy(i, cio_textinfo.cury); JS_RESUMEREQUEST(cx, rc); break; case PROP_WHEREY: if(!JS_ValueToInt32(cx, *vp, &i)) return JS_FALSE; rc=JS_SUSPENDREQUEST(cx); gotoxy(cio_textinfo.curx, i); JS_RESUMEREQUEST(cx, rc); break; case PROP_TEXTMODE: if(!JS_ValueToInt32(cx, *vp, &i)) return JS_FALSE; rc=JS_SUSPENDREQUEST(cx); textmode(i); JS_RESUMEREQUEST(cx, rc); break; case PROP_TEXTBACKGROUND: if(!JS_ValueToInt32(cx, *vp, &i)) return JS_FALSE; rc=JS_SUSPENDREQUEST(cx); textbackground(i); JS_RESUMEREQUEST(cx, rc); break; case PROP_TEXTCOLOR: if(!JS_ValueToInt32(cx, *vp, &i)) return JS_FALSE; rc=JS_SUSPENDREQUEST(cx); textcolor(i); JS_RESUMEREQUEST(cx, rc); break; case PROP_CLIPBOARD: { size_t len; char *bytes; JSVALUE_TO_MSTRING(cx, *vp, bytes, &len); HANDLE_PENDING(cx); if(!bytes) return JS_FALSE; rc=JS_SUSPENDREQUEST(cx); copytext(bytes, len+1); free(bytes); JS_RESUMEREQUEST(cx, rc); } break; case PROP_HIGHVIDEO: JS_ValueToBoolean(cx, *vp, &b); rc=JS_SUSPENDREQUEST(cx); if(b) highvideo(); else lowvideo(); JS_RESUMEREQUEST(cx, rc); break; case PROP_LOWVIDEO: JS_ValueToBoolean(cx, *vp, &b); rc=JS_SUSPENDREQUEST(cx); if(b) lowvideo(); else highvideo(); JS_RESUMEREQUEST(cx, rc); break; } return(JS_TRUE); }
static JSBool gjs_value_to_g_value_internal(JSContext *context, jsval value, GValue *gvalue, gboolean no_copy) { GType gtype; gtype = G_VALUE_TYPE(gvalue); if (gtype == 0) { gtype = gjs_value_guess_g_type(context, value); if (gtype == G_TYPE_INVALID) { gjs_throw(context, "Could not guess unspecified GValue type"); return JS_FALSE; } gjs_debug_marshal(GJS_DEBUG_GCLOSURE, "Guessed GValue type %s from JS Value", g_type_name(gtype)); g_value_init(gvalue, gtype); } gjs_debug_marshal(GJS_DEBUG_GCLOSURE, "Converting jsval to gtype %s", g_type_name(gtype)); if (gtype == G_TYPE_STRING) { /* Don't use ValueToString since we don't want to just toString() * everything automatically */ if (JSVAL_IS_NULL(value)) { g_value_set_string(gvalue, NULL); } else if (JSVAL_IS_STRING(value)) { gchar *utf8_string; if (!gjs_string_to_utf8(context, value, &utf8_string)) return JS_FALSE; g_value_take_string(gvalue, utf8_string); } else { gjs_throw(context, "Wrong type %s; string expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_CHAR) { gint32 i; if (JS_ValueToInt32(context, value, &i) && i >= SCHAR_MIN && i <= SCHAR_MAX) { g_value_set_schar(gvalue, (signed char)i); } else { gjs_throw(context, "Wrong type %s; char expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_UCHAR) { guint16 i; if (JS_ValueToUint16(context, value, &i) && i <= UCHAR_MAX) { g_value_set_uchar(gvalue, (unsigned char)i); } else { gjs_throw(context, "Wrong type %s; unsigned char expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_INT) { gint32 i; if (JS_ValueToInt32(context, value, &i)) { g_value_set_int(gvalue, i); } else { gjs_throw(context, "Wrong type %s; integer expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_DOUBLE) { gdouble d; if (JS_ValueToNumber(context, value, &d)) { g_value_set_double(gvalue, d); } else { gjs_throw(context, "Wrong type %s; double expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_FLOAT) { gdouble d; if (JS_ValueToNumber(context, value, &d)) { g_value_set_float(gvalue, d); } else { gjs_throw(context, "Wrong type %s; float expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_UINT) { guint32 i; if (JS_ValueToECMAUint32(context, value, &i)) { g_value_set_uint(gvalue, i); } else { gjs_throw(context, "Wrong type %s; unsigned integer expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_BOOLEAN) { JSBool b; /* JS_ValueToBoolean() pretty much always succeeds, * which is maybe surprising sometimes, but could * be handy also... */ if (JS_ValueToBoolean(context, value, &b)) { g_value_set_boolean(gvalue, b); } else { gjs_throw(context, "Wrong type %s; boolean expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_OBJECT) || g_type_is_a(gtype, G_TYPE_INTERFACE)) { GObject *gobj; gobj = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj; obj = JSVAL_TO_OBJECT(value); if (!gjs_typecheck_object(context, obj, gtype, JS_TRUE)) return JS_FALSE; gobj = gjs_g_object_from_object(context, obj); } else { gjs_throw(context, "Wrong type %s; object %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_object(gvalue, gobj); } else if (gtype == G_TYPE_STRV) { if (JSVAL_IS_NULL(value)) { /* do nothing */ } else if (gjs_object_has_property(context, JSVAL_TO_OBJECT(value), "length")) { jsval length_value; guint32 length; if (!gjs_object_require_property(context, JSVAL_TO_OBJECT(value), NULL, "length", &length_value) || !JS_ValueToECMAUint32(context, length_value, &length)) { gjs_throw(context, "Wrong type %s; strv expected", gjs_get_type_name(value)); return JS_FALSE; } else { void *result; char **strv; if (!gjs_array_to_strv (context, value, length, &result)) return JS_FALSE; /* cast to strv in a separate step to avoid type-punning */ strv = result; g_value_take_boxed (gvalue, strv); } } else { gjs_throw(context, "Wrong type %s; strv expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_BOXED)) { void *gboxed; gboxed = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj; obj = JSVAL_TO_OBJECT(value); if (g_type_is_a(gtype, G_TYPE_ERROR)) { /* special case GError */ if (!gjs_typecheck_gerror(context, obj, JS_TRUE)) return JS_FALSE; gboxed = gjs_gerror_from_error(context, obj); } else { /* First try a union, if that fails, assume a boxed struct. Distinguishing which one is expected would require checking the associated GIBaseInfo, which is not necessary possible, if e.g. we see the GType without loading the typelib. */ if (gjs_typecheck_union(context, obj, NULL, gtype, JS_FALSE)) { gboxed = gjs_c_union_from_union(context, obj); } else { if (!gjs_typecheck_boxed(context, obj, NULL, gtype, JS_TRUE)) return JS_FALSE; gboxed = gjs_c_struct_from_boxed(context, obj); } } } else { gjs_throw(context, "Wrong type %s; boxed type %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } if (no_copy) g_value_set_static_boxed(gvalue, gboxed); else g_value_set_boxed(gvalue, gboxed); } else if (g_type_is_a(gtype, G_TYPE_VARIANT)) { GVariant *variant = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj = JSVAL_TO_OBJECT(value); if (!gjs_typecheck_boxed(context, obj, NULL, G_TYPE_VARIANT, JS_TRUE)) return JS_FALSE; variant = gjs_c_struct_from_boxed(context, obj); } else { gjs_throw(context, "Wrong type %s; boxed type %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_variant (gvalue, variant); } else if (g_type_is_a(gtype, G_TYPE_ENUM)) { gint64 value_int64; if (gjs_value_to_int64 (context, value, &value_int64)) { GEnumValue *v; /* See arg.c:_gjs_enum_to_int() */ v = g_enum_get_value(G_ENUM_CLASS(g_type_class_peek(gtype)), (int)value_int64); if (v == NULL) { gjs_throw(context, "%d is not a valid value for enumeration %s", JSVAL_TO_INT(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_enum(gvalue, v->value); } else { gjs_throw(context, "Wrong type %s; enum %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_FLAGS)) { gint64 value_int64; if (gjs_value_to_int64 (context, value, &value_int64)) { if (!_gjs_flags_value_is_valid(context, gtype, value_int64)) return JS_FALSE; /* See arg.c:_gjs_enum_to_int() */ g_value_set_flags(gvalue, (int)value_int64); } else { gjs_throw(context, "Wrong type %s; flags %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_PARAM)) { void *gparam; gparam = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj; obj = JSVAL_TO_OBJECT(value); if (!gjs_typecheck_param(context, obj, gtype, JS_TRUE)) return JS_FALSE; gparam = gjs_g_param_from_param(context, obj); } else { gjs_throw(context, "Wrong type %s; param type %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_param(gvalue, gparam); } else if (g_type_is_a(gtype, G_TYPE_GTYPE)) { GType type; if (!JSVAL_IS_OBJECT(value)) { gjs_throw(context, "Wrong type %s; expect a GType object", gjs_get_type_name(value)); return JS_FALSE; } type = gjs_gtype_get_actual_gtype(context, JSVAL_TO_OBJECT(value)); g_value_set_gtype(gvalue, type); } else if (g_type_is_a(gtype, G_TYPE_POINTER)) { if (JSVAL_IS_NULL(value)) { /* Nothing to do */ } else { gjs_throw(context, "Cannot convert non-null JS value to G_POINTER"); return JS_FALSE; } } else if (JSVAL_IS_NUMBER(value) && g_value_type_transformable(G_TYPE_INT, gtype)) { /* Only do this crazy gvalue transform stuff after we've * exhausted everything else. Adding this for * e.g. ClutterUnit. */ gint32 i; if (JS_ValueToInt32(context, value, &i)) { GValue int_value = { 0, }; g_value_init(&int_value, G_TYPE_INT); g_value_set_int(&int_value, i); g_value_transform(&int_value, gvalue); } else { gjs_throw(context, "Wrong type %s; integer expected", gjs_get_type_name(value)); return JS_FALSE; } } else { gjs_debug(GJS_DEBUG_GCLOSURE, "jsval is number %d gtype fundamental %d transformable to int %d from int %d", JSVAL_IS_NUMBER(value), G_TYPE_IS_FUNDAMENTAL(gtype), g_value_type_transformable(gtype, G_TYPE_INT), g_value_type_transformable(G_TYPE_INT, gtype)); gjs_throw(context, "Don't know how to convert JavaScript object to GType %s", g_type_name(gtype)); return JS_FALSE; } return JS_TRUE; }
NS_IMETHODIMP TCPSocketParent::SendCallback(const nsAString& aType, const JS::Value& aDataVal, const nsAString& aReadyState, uint32_t aBuffered, JSContext* aCx) { if (!mIPCOpen) { NS_WARNING("Dropping callback due to no IPC connection"); return NS_OK; } CallbackData data; if (aDataVal.isString()) { JSString* jsstr = aDataVal.toString(); nsDependentJSString str; if (!str.init(aCx, jsstr)) { FireInteralError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } data = str; } else if (aDataVal.isUndefined() || aDataVal.isNull()) { data = mozilla::void_t(); } else if (aDataVal.isObject()) { JSObject* obj = &aDataVal.toObject(); if (JS_IsTypedArrayObject(obj)) { NS_ENSURE_TRUE(JS_IsUint8Array(obj), NS_ERROR_FAILURE); uint32_t nbytes = JS_GetTypedArrayByteLength(obj); uint8_t* buffer = JS_GetUint8ArrayData(obj); if (!buffer) { FireInteralError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } FallibleTArray<uint8_t> fallibleArr; if (!fallibleArr.InsertElementsAt(0, buffer, nbytes)) { FireInteralError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } InfallibleTArray<uint8_t> arr; arr.SwapElements(fallibleArr); data = SendableData(arr); } else { nsDependentJSString message, filename; uint32_t lineNumber = 0; uint32_t columnNumber = 0; jsval val; if (!JS_GetProperty(aCx, obj, "message", &val)) { NS_ERROR("No message property on supposed error object"); } else if (JSVAL_IS_STRING(val)) { if (!message.init(aCx, JSVAL_TO_STRING(val))) { NS_WARNING("couldn't initialize string"); } } if (!JS_GetProperty(aCx, obj, "fileName", &val)) { NS_ERROR("No fileName property on supposed error object"); } else if (JSVAL_IS_STRING(val)) { if (!filename.init(aCx, JSVAL_TO_STRING(val))) { NS_WARNING("couldn't initialize string"); } } if (!JS_GetProperty(aCx, obj, "lineNumber", &val)) { NS_ERROR("No lineNumber property on supposed error object"); } else if (JSVAL_IS_INT(val)) { lineNumber = JSVAL_TO_INT(val); } if (!JS_GetProperty(aCx, obj, "columnNumber", &val)) { NS_ERROR("No columnNumber property on supposed error object"); } else if (JSVAL_IS_INT(val)) { columnNumber = JSVAL_TO_INT(val); } data = JSError(message, filename, lineNumber, columnNumber); } } else { NS_ERROR("Unexpected JS value encountered"); FireInteralError(this, __LINE__); return NS_ERROR_FAILURE; } mozilla::unused << PTCPSocketParent::SendCallback(nsString(aType), data, nsString(aReadyState), aBuffered); return NS_OK; }
/* Helper for weighted regions. */ static nsresult setHelper(nsCameraControl *aCameraContol, PRUint32 aKey, const JS::Value & aValue, JSContext *cx) { nsCameraControl::CameraRegion *parsedRegions; PRUint32 length = 0; if (aValue.isObject()) { JSObject *regions = JSVAL_TO_OBJECT(aValue); if (JS_IsArrayObject(cx, regions)) { if (JS_GetArrayLength(cx, regions, &length)) { DOM_CAMERA_LOGI("%s:%d : got %d regions\n", __func__, __LINE__, length); parsedRegions = new nsCameraControl::CameraRegion[length]; for (PRUint32 i = 0; i < length; ++i) { jsval v; if (JS_GetElement(cx, regions, i, &v)) { if (v.isObject()) { nsCameraControl::CameraRegion* parsed = &parsedRegions[i]; JSObject *r = JSVAL_TO_OBJECT(v); jsval p; /* TODO: move these Gonk-specific values somewhere else */ PRInt32 top = -1000; PRInt32 left = -1000; PRInt32 bottom = 1000; PRInt32 right = 1000; PRUint32 weight = 1; if (JS_GetProperty(cx, r, "top", &p)) { if (JSVAL_IS_INT(p)) { top = JSVAL_TO_INT(p); } } if (JS_GetProperty(cx, r, "left", &p)) { if (JSVAL_IS_INT(p)) { left = JSVAL_TO_INT(p); } } if (JS_GetProperty(cx, r, "bottom", &p)) { if (JSVAL_IS_INT(p)) { bottom = JSVAL_TO_INT(p); } } if (JS_GetProperty(cx, r, "right", &p)) { if (JSVAL_IS_INT(p)) { right = JSVAL_TO_INT(p); } } if (JS_GetProperty(cx, r, "weight", &p)) { if (JSVAL_IS_INT(p)) { weight = JSVAL_TO_INT(p); } } DOM_CAMERA_LOGI("region %d: top=%d, left=%d, bottom=%d, right=%d, weight=%d\n", i, top, left, bottom, right, weight ); parsed->mTop = top; parsed->mLeft = left; parsed->mBottom = bottom; parsed->mRight = right; parsed->mWeight = weight; } } } } } } aCameraContol->SetParameter(aKey, parsedRegions, length); delete[] parsedRegions; return NS_OK; }
static JSBool js_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { jsint tiny; js_branch_t* branch; if((branch=(js_branch_t*)JS_GetPrivate(cx,obj))==NULL) return(JS_FALSE); tiny = JSVAL_TO_INT(id); switch(tiny) { case PROP_VERSION: *vp=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,(char *)JS_GetImplementationVersion())); break; case PROP_TERMINATED: if(branch->terminated==NULL) *vp=JSVAL_FALSE; else *vp=BOOLEAN_TO_JSVAL(*branch->terminated); break; case PROP_AUTO_TERMINATE: *vp=BOOLEAN_TO_JSVAL(branch->auto_terminate); break; case PROP_BRANCH_COUNTER: JS_NewNumberValue(cx,branch->counter,vp); break; case PROP_BRANCH_LIMIT: JS_NewNumberValue(cx,branch->limit,vp); break; case PROP_YIELD_INTERVAL: JS_NewNumberValue(cx,branch->yield_interval,vp); break; case PROP_GC_INTERVAL: JS_NewNumberValue(cx,branch->gc_interval,vp); break; case PROP_GC_ATTEMPTS: JS_NewNumberValue(cx,branch->gc_attempts,vp); break; #ifdef jscntxt_h___ case PROP_GC_COUNTER: JS_NewNumberValue(cx,cx->runtime->gcNumber,vp); break; case PROP_GC_LASTBYTES: JS_NewNumberValue(cx,cx->runtime->gcLastBytes,vp); break; case PROP_BYTES: JS_NewNumberValue(cx,cx->runtime->gcBytes,vp); break; case PROP_MAXBYTES: JS_NewNumberValue(cx,cx->runtime->gcMaxBytes,vp); break; case PROP_GLOBAL: *vp = OBJECT_TO_JSVAL(cx->globalObject); break; #else case PROP_GLOBAL: *vp = OBJECT_TO_JSVAL(JS_GetParent(cx,obj)); break; #endif } return(JS_TRUE); }
/* * call-seq: * each {| element | block } * each {| name, value | block } * * Calls <em>block</em> with each item in this JavaScript array, or with * each +name+/+value+ pair (like a Hash) for any other JavaScript * object. */ static VALUE each(VALUE self) { RubyLandProxy* proxy; Data_Get_Struct(self, RubyLandProxy, proxy); JSContext * context = johnson_get_current_context(proxy->runtime); PREPARE_RUBY_JROOTS(context, 5); jsval proxy_value; JCHECK(get_jsval_for_proxy(proxy, &proxy_value)); JROOT(proxy_value); JSObject* value = JSVAL_TO_OBJECT(proxy_value); JROOT(value); // arrays behave like you'd expect, indexes in order if (JS_IsArrayObject(context, value)) { jsuint length; JCHECK(JS_GetArrayLength(context, value, &length)); jsuint i = 0; for (i = 0; i < length; ++i) { jsval element; JCHECK(JS_GetElement(context, value, (signed) i, &element)); CALL_RUBY_WRAPPER(rb_yield, CONVERT_TO_RUBY(proxy->runtime, element)); } } else { // not an array? behave like each on Hash; yield [key, value] JSIdArray* ids = JS_Enumerate(context, value); JCHECK(ids); JCLEANUP(destroy_id_array, ids); int i; for (i = 0; i < ids->length; ++i) { jsval js_key, js_value; JCHECK(JS_IdToValue(context, ids->vector[i], &js_key)); JROOT(js_key); if (JSVAL_IS_STRING(js_key)) { // regular properties have string keys JCHECK(JS_GetProperty(context, value, JS_GetStringBytes(JSVAL_TO_STRING(js_key)), &js_value)); } else { // it's a numeric property, use array access JCHECK(JS_GetElement(context, value, JSVAL_TO_INT(js_key), &js_value)); } JROOT(js_value); VALUE key = CONVERT_TO_RUBY(proxy->runtime, js_key); VALUE value = CONVERT_TO_RUBY(proxy->runtime, js_value); CALL_RUBY_WRAPPER(rb_yield, rb_ary_new3(2L, key, value)); JUNROOT(js_value); JUNROOT(js_key); } } JRETURN_RUBY(self); }
// // Native method FileWindowsShortcut // JSBool PR_CALLBACK InstallFileOpFileWindowsShortcut(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { nsInstall *nativeThis = GetNativeThis(cx, obj, argv); if (!nativeThis) return JS_FALSE; PRInt32 nativeRet; nsAutoString b0; nsAutoString b1; nsAutoString b2; nsAutoString b3; nsAutoString b4; nsAutoString b5; nsCOMPtr<nsILocalFile> nsfsB0; nsCOMPtr<nsILocalFile> nsfsB1; nsCOMPtr<nsILocalFile> nsfsB3; nsCOMPtr<nsILocalFile> nsfsB5; PRInt32 b6; //JSObject *jsObj; //nsInstallFolder *folder; *rval = JSVAL_NULL; if(argc >= 7) { // public int FileWindowsShortcut(String aTarget, // String aShortcutPath, // String aDescription, // String aWorkingPath, // String aParams, // String aIcon, // Number aIconId); ConvertJSValToStr(b0, cx, argv[0]); NS_NewLocalFile(b0, PR_TRUE, getter_AddRefs(nsfsB0)); ConvertJSValToStr(b1, cx, argv[1]); NS_NewLocalFile(b1, PR_TRUE, getter_AddRefs(nsfsB1)); ConvertJSValToStr(b2, cx, argv[2]); ConvertJSValToStr(b3, cx, argv[3]); NS_NewLocalFile(b3, PR_TRUE, getter_AddRefs(nsfsB3)); ConvertJSValToStr(b4, cx, argv[4]); ConvertJSValToStr(b5, cx, argv[5]); NS_NewLocalFile(b5, PR_TRUE, getter_AddRefs(nsfsB5)); if(JSVAL_IS_NULL(argv[6])) { b6 = 0; } else { b6 = JSVAL_TO_INT(argv[6]); } if(NS_OK != nativeThis->FileOpFileWindowsShortcut(nsfsB0, nsfsB1, b2, nsfsB3, b4, nsfsB5, b6, &nativeRet)) { return JS_TRUE; } *rval = INT_TO_JSVAL(nativeRet); } else { JS_ReportError(cx, "Function FileWindowsShortcut requires 7 parameters"); return JS_TRUE; } return JS_TRUE; }
static JSBool rpmsx_getprop(JSContext *cx, JSObject *obj, jsid id, jsval *vp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmsxClass, NULL); jsint tiny = JSVAL_TO_INT(id); #if defined(WITH_SELINUX) security_context_t con = NULL; #endif /* XXX the class has ptr == NULL, instances have ptr != NULL. */ if (ptr == NULL) return JS_TRUE; switch (tiny) { case _DEBUG: *vp = INT_TO_JSVAL(_debug); break; #if defined(WITH_SELINUX) case _CURRENT: *vp = _GET_CON(!getcon(&con)); break; case _PID: *vp = _GET_CON(!getpidcon(getpid(), &con)); break; case _PPID: *vp = _GET_CON(!getpidcon(getppid(), &con)); break; case _PREV: *vp = _GET_CON(!getprevcon(&con)); break; case _EXEC: *vp = _GET_CON(!getexeccon(&con)); break; case _FSCREATE: *vp = _GET_CON(!getfscreatecon(&con)); break; case _KEYCREATE: *vp = _GET_CON(!getkeycreatecon(&con)); break; case _SOCKCREATE: *vp = _GET_CON(!getsockcreatecon(&con)); break; case _ENFORCE: *vp = INT_TO_JSVAL(security_getenforce()); break; case _DENY: *vp = INT_TO_JSVAL(security_deny_unknown()); break; case _POLICYVERS: *vp = INT_TO_JSVAL(security_policyvers()); break; case _ENABLED: *vp = INT_TO_JSVAL(is_selinux_enabled()); break; case _MLSENABLED: *vp = INT_TO_JSVAL(is_selinux_mls_enabled()); break; #ifdef NOTYET case _BOOLS: *vp = ; break; #endif case _ROOT: *vp = _GET_STR(selinux_policy_root()); break; case _BINARY: *vp = _GET_STR(selinux_binary_policy_path()); break; case _FAILSAFE: *vp = _GET_STR(selinux_failsafe_context_path());break; case _REMOVABLE: *vp = _GET_STR(selinux_removable_context_path());break; case _DEFAULT: *vp = _GET_STR(selinux_default_context_path()); break; case _USER: *vp = _GET_STR(selinux_user_contexts_path()); break; case _FCON: *vp = _GET_STR(selinux_file_context_path()); break; case _FCONHOME: *vp = _GET_STR(selinux_file_context_homedir_path());break; case _FCONLOCAL: *vp = _GET_STR(selinux_file_context_local_path());break; case _FCONSUBS: *vp = _GET_STR(selinux_file_context_subs_path());break; case _HOMEDIR: *vp = _GET_STR(selinux_homedir_context_path()); break; case _MEDIA: *vp = _GET_STR(selinux_media_context_path()); break; case _VIRTDOMAIN: *vp = _GET_STR(selinux_virtual_domain_context_path());break; case _VIRTIMAGE: *vp = _GET_STR(selinux_virtual_image_context_path());break; case _X: *vp = _GET_STR(selinux_x_context_path()); break; case _CONTEXTS: *vp = _GET_STR(selinux_contexts_path()); break; case _SECURETTY: *vp = _GET_STR(selinux_securetty_types_path()); break; case _BOOLEANS: *vp = _GET_STR(selinux_booleans_path()); break; case _CUSTOMTYPES: *vp = _GET_STR(selinux_customizable_types_path());break; case _USERS: *vp = _GET_STR(selinux_users_path()); break; case _USERSCONF: *vp = _GET_STR(selinux_usersconf_path()); break; case _XLATIONS: *vp = _GET_STR(selinux_translations_path()); break; case _COLORS: *vp = _GET_STR(selinux_colors_path()); break; case _NETFILTER: *vp = _GET_STR(selinux_netfilter_context_path());break; case _PATH: *vp = _GET_STR(selinux_path()); break; #endif default: break; } #if defined(WITH_SELINUX) if (con) { freecon(con); con = NULL; } #endif return JS_TRUE; }
void js_LeaveLocalRootScopeWithResult(JSContext *cx, jsval rval) { JSLocalRootStack *lrs; uint32 mark, m, n; JSLocalRootChunk *lrc; /* Defend against buggy native callers. */ lrs = cx->localRootStack; JS_ASSERT(lrs && lrs->rootCount != 0); if (!lrs || lrs->rootCount == 0) return; mark = lrs->scopeMark; JS_ASSERT(mark != JSLRS_NULL_MARK); if (mark == JSLRS_NULL_MARK) return; /* Free any chunks being popped by this leave operation. */ m = mark >> JSLRS_CHUNK_SHIFT; n = (lrs->rootCount - 1) >> JSLRS_CHUNK_SHIFT; while (n > m) { lrc = lrs->topChunk; JS_ASSERT(lrc != &lrs->firstChunk); lrs->topChunk = lrc->down; JS_free(cx, lrc); --n; } /* * Pop the scope, restoring lrs->scopeMark. If rval is a GC-thing, push * it on the caller's scope, or store it in cx->lastInternalResult if we * are leaving the outermost scope. We don't need to allocate a new lrc * because we can overwrite the old mark's slot with rval. */ lrc = lrs->topChunk; m = mark & JSLRS_CHUNK_MASK; lrs->scopeMark = (uint32) JSVAL_TO_INT(lrc->roots[m]); if (JSVAL_IS_GCTHING(rval) && !JSVAL_IS_NULL(rval)) { if (mark == 0) { cx->lastInternalResult = rval; } else { /* * Increment m to avoid the "else if (m == 0)" case below. If * rval is not a GC-thing, that case would take care of freeing * any chunk that contained only the old mark. Since rval *is* * a GC-thing here, we want to reuse that old mark's slot. */ lrc->roots[m++] = rval; ++mark; } } lrs->rootCount = (uint32) mark; /* * Free the stack eagerly, risking malloc churn. The alternative would * require an lrs->entryCount member, maintained by Enter and Leave, and * tested by the GC in addition to the cx->localRootStack non-null test. * * That approach would risk hoarding 264 bytes (net) per context. Right * now it seems better to give fresh (dirty in CPU write-back cache, and * the data is no longer needed) memory back to the malloc heap. */ if (mark == 0) { cx->localRootStack = NULL; JS_free(cx, lrs); } else if (m == 0) { lrs->topChunk = lrc->down; JS_free(cx, lrc); } }
static JSBool obj_getSlot(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { JS_LOCK_VOID(cx, *vp = js_GetSlot(cx, obj, JSVAL_TO_INT(id))); return JS_TRUE; }
/** * This method is called when getting a Property from HTMLTableRowElement */ static JSBool jhtml_tablerow_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { #if (WEBC_SUPPORT_TABLES) HTMLElement *pElem = (HTMLElement *) jhutil_GetPrivate(cx, obj); HTMLTableRow *pTableRow = (pElem)? (HTMLTableRow *) pElem : 0; WebcJSScript *jsscr = (WebcJSScript *) jhutil_GetContextPrivate(cx); WebcJSDocumentContext *jsmgr = (jsscr)? jsscr->GetJSMgr() : 0; if (!pTableRow || !jsmgr) return JS_TRUE; JSString *jsstr = 0; switch (JSVAL_TO_INT(id)) { case HTMLTABLEROWELEMENT_ROWINDEX: *vp = INT_TO_JSVAL(pTableRow->RowIndex()); case HTMLTABLEROWELEMENT_SECTIONROWINDEX: //this is not implimented in our browser break; case HTMLTABLEROWELEMENT_ALIGN: switch (pTableRow->GetTextAlign()) { case TU_ALIGN_LEFT: jsstr = JS_InternString(cx, "left"); break; case TU_ALIGN_RIGHT: jsstr = JS_InternString(cx, "right"); break; case TU_ALIGN_CENTER: jsstr = JS_InternString(cx, "center"); break; // case TU_ALIGN_JUSTIFY: // jsstr = JS_InternString(cx, "justify"); // break; } if (!jsstr) jsstr = JS_InternString(cx, "undefined"); *vp = STRING_TO_JSVAL(jsstr); return JS_TRUE; case HTMLTABLEROWELEMENT_BGCOLOR: //this has been deprecated break; case HTMLTABLEROWELEMENT_CH: //this is not implemented in our browser break; case HTMLTABLEROWELEMENT_CHOFF: //this is not implemented in our browser break; case HTMLTABLEROWELEMENT_VALIGN: switch (pTableRow->GetVAlign()) { case TU_VALIGN_TOP: jsstr = JS_InternString(cx, "top"); break; case TU_VALIGN_MIDDLE: jsstr = JS_InternString(cx, "center"); break; case TU_VALIGN_BOTTOM: jsstr = JS_InternString(cx, "bottom"); break; case TU_VALIGN_BASELINE: jsstr = JS_InternString(cx, "baseline"); break; default: jsstr = JS_InternString(cx, "undefined"); break; } *vp = STRING_TO_JSVAL(jsstr); return JS_TRUE; }//end switch return JS_TRUE; #else // WEBC_SUPPORT_TABLES return JS_FALSE; #endif // WEBC_SUPPORT_TABLES }
/** * Call this method when getting a Property from HTMLCollection */ static JSBool jhtml_collection_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { WebcJSScript *jsscr = (WebcJSScript *) jhutil_GetContextPrivate(cx); WebcJSDocumentContext *jsmgr = (jsscr)? jsscr->GetJSMgr() : 0; if (!jsmgr) { return JS_FALSE; } HTMLDocument *pDoc = jsmgr->GetDocument(); jhtml_collection *pColl = (jhtml_collection *)jhutil_GetPrivate(cx, obj); if (!pColl) return JS_TRUE; switch (JSVAL_TO_INT(id)) { //if we are looking for the element length case HTMLCOLLECTION_LENGTH: { if (pColl->finderType) { HTMLElementType ele_type = HTML_ELEMENT_NONE; //switch on the type of collection this is switch(pColl->finderType) { //these cases can use the HTMLCountByType Finder, and therefore //just set the ele_type and break case DOCUMENT_IMAGES: ele_type = HTML_IMAGE_ELEMENT; break; case DOCUMENT_ANCHORS: ele_type = HTML_ANCHOR_ELEMENT; break; case TABLE_ROWS: ele_type = HTML_TABLE_ROW_ELEMENT; break; case TABLEROW_CELLS: ele_type = HTML_TABLE_CELL_ELEMENT; break; case MAP_AREAS: ele_type = HTML_AREA_ELEMENT; break; case SELECT_OPTIONS: ele_type = HTML_OPTION_ELEMENT; break; case WIN_FRAMES: ele_type = HTML_FRAME_ELEMENT; break; case ELEMENT_NODES: { HTMLCountAllFinder finder; pColl->pTop->FindElement(&finder, 1, INCLUDE_SELF_NODES_DEFAULT); int count = finder.Length(); *vp = INT_TO_JSVAL(count); return JS_TRUE; } case DOCUMENT_FORMS: { WebcJSScript *jsscr = (WebcJSScript *) jhutil_GetContextPrivate(cx); WebcJSDocumentContext *jsmgr = (jsscr)? jsscr->GetJSMgr() : 0; //forms do not live in the document tree, therefore we must use //the form vector if (jsmgr) { HTMLElementTypeFinder f(HTML_FORM_ELEMENT); HTMLElementCounter fl(&f); jsmgr->GetDocument()->FindElement(&fl); int len = fl.Count(); *vp = INT_TO_JSVAL(len); return JS_TRUE; } return JS_FALSE; } case DOCUMENT_IDS: { HTMLCountAllFinder finder; pColl->pTop->FindElement(&finder,1, INCLUDE_SELF_ELEMENT_DEFAULT); int count = finder.Length(); *vp = INT_TO_JSVAL(count); return JS_TRUE; } case DOCUMENT_ALL: { HTMLCountAllFinder finder; pColl->pTop->FindElement(&finder,1, INCLUDE_SELF_ELEMENT_DEFAULT); int count = finder.Length(); *vp = INT_TO_JSVAL(count); return JS_TRUE; } case ALL_BY_NAME: { if (!pColl->nameOfAll) { *vp = INT_TO_JSVAL(0); return JS_TRUE; } //this finder counts the total number of elements with the //name given by nameOfAll HTMLCountByNameFinder finder(pColl->nameOfAll); pColl->pTop->FindElement(&finder, 1, INCLUDE_SELF_ELEMENT_DEFAULT); int count = finder.Length(); *vp = INT_TO_JSVAL(count); return JS_TRUE; } case ALL_TAGS_BY_TAGNAME: { if (!pColl->nameOfAll) { *vp = INT_TO_JSVAL(0); return JS_TRUE; } // use this finder to count the total number of elements with the // type given by nameOfAll (misnomer) HTMLTagType hType = HTML_ParseTagType(pColl->nameOfAll, webc_strlen(pColl->nameOfAll)); HTMLElementType eType = TagToHTMLElementType[hType]; HTMLCountByTypeFinder finder(eType); pColl->pTop->FindElement(&finder, 1, WEBC_FALSE); // don't include myself in the search results int count = finder.Length(); *vp = INT_TO_JSVAL(count); return JS_TRUE; } case FORM_INPUTS: { //for this type of collection, the top will always be of type form HTMLForm *form = (HTMLForm *)pColl->pTop; int len = vector_get_size(form->GetFieldVector()); *vp = INT_TO_JSVAL(len); return JS_TRUE; } case DOCUMENT_STYLESHEETS: { //GMP this needs to be revisited if CSS is changed to have more than 1 style sheet *vp = INT_TO_JSVAL(1); return JS_TRUE; } case SSHEET_RULES: { #if (WEBC_SUPPORT_STYLE_SHEETS) CSSDocumentContext *pCSSCx= pDoc->GetCSSContext(); /* int i = 0; if (pCSSCx) { vector_iterator pvi[1]; CSSPropertyDescriptor * pCSSPD = pCSSCx->EnumFirstProperty(pvi); while (pCSSPD) { i++; pCSSPD = pCSSCx->EnumNextProperty(pvi); } } *vp = INT_TO_JSVAL(i);*/ #endif //(WEBC_SUPPORT_STYLE_SHEETS) return JS_TRUE; } case RADIO_BUTTONS: { int numRadioElems = 0; HTMLRadioButton *pRadio = (HTMLRadioButton*)pColl->pTop; while (pRadio) { numRadioElems++; pRadio = (pRadio->mpGroupNext != pColl->pTop) ? pRadio->mpGroupNext : 0; } *vp = INT_TO_JSVAL(numRadioElems); return JS_TRUE; } }//end inner switch if (ele_type != HTML_ELEMENT_NONE) { HTMLCountByTypeFinder finder(ele_type); pColl->pTop->FindElement(&finder, 1, INCLUDE_SELF_ELEMENT_DEFAULT); *vp = INT_TO_JSVAL(finder.Length()); } }//end if return JS_TRUE; }//end case length default: { //MSIE allows collections to be index like 'document.all.nameofelement' where //nameofelement is an element name in the document tree. It also allows //'document.all[4]' To account for that we call item on the element passed in. //which will call namedItem if the jsval passed is not an int. jhtml_collection_item(cx, obj, 1, &id, vp); break; } }//end switch return JS_TRUE; }
nsresult Key::EncodeJSValInternal(JSContext* aCx, const jsval aVal, uint8_t aTypeOffset, uint16_t aRecursionDepth) { NS_ENSURE_TRUE(aRecursionDepth < MaxRecursionDepth, NS_ERROR_DOM_INDEXEDDB_DATA_ERR); MOZ_STATIC_ASSERT(eMaxType * MaxArrayCollapse < 256, "Unable to encode jsvals."); if (JSVAL_IS_STRING(aVal)) { nsDependentJSString str; if (!str.init(aCx, aVal)) { return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } EncodeString(str, aTypeOffset); return NS_OK; } if (JSVAL_IS_INT(aVal)) { EncodeNumber((double)JSVAL_TO_INT(aVal), eFloat + aTypeOffset); return NS_OK; } if (JSVAL_IS_DOUBLE(aVal)) { double d = JSVAL_TO_DOUBLE(aVal); if (MOZ_DOUBLE_IS_NaN(d)) { return NS_ERROR_DOM_INDEXEDDB_DATA_ERR; } EncodeNumber(d, eFloat + aTypeOffset); return NS_OK; } if (!JSVAL_IS_PRIMITIVE(aVal)) { JS::Rooted<JSObject*> obj(aCx, JSVAL_TO_OBJECT(aVal)); if (JS_IsArrayObject(aCx, obj)) { aTypeOffset += eMaxType; if (aTypeOffset == eMaxType * MaxArrayCollapse) { mBuffer.Append(aTypeOffset); aTypeOffset = 0; } NS_ASSERTION((aTypeOffset % eMaxType) == 0 && aTypeOffset < (eMaxType * MaxArrayCollapse), "Wrong typeoffset"); uint32_t length; if (!JS_GetArrayLength(aCx, obj, &length)) { return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } for (uint32_t index = 0; index < length; index++) { JS::Rooted<JS::Value> val(aCx); if (!JS_GetElement(aCx, obj, index, val.address())) { return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } nsresult rv = EncodeJSValInternal(aCx, val, aTypeOffset, aRecursionDepth + 1); if (NS_FAILED(rv)) { return rv; } aTypeOffset = 0; } mBuffer.Append(eTerminator + aTypeOffset); return NS_OK; } if (JS_ObjectIsDate(aCx, obj)) { if (!js_DateIsValid(obj)) { return NS_ERROR_DOM_INDEXEDDB_DATA_ERR; } EncodeNumber(js_DateGetMsecSinceEpoch(obj), eDate + aTypeOffset); return NS_OK; } } return NS_ERROR_DOM_INDEXEDDB_DATA_ERR; }
static JSBool jhtml_collection_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { WebcJSScript *jsscr = (WebcJSScript *) jhutil_GetContextPrivate(cx); WebcJSDocumentContext *jsmgr = (jsscr)? jsscr->GetJSMgr() : 0; if (!jsmgr) { return JS_FALSE; } HTMLDocument *pDoc = jsmgr->GetDocument(); jhtml_collection *pColl = (jhtml_collection *)jhutil_GetPrivate(cx, obj); if (!pColl) { return JS_TRUE; } JSObject *jvalobj = JSVAL_IS_OBJECT(*vp)? JSVAL_TO_OBJECT(*vp) : 0; switch (JSVAL_TO_INT(id)) { case HTMLCOLLECTION_LENGTH: switch(pColl->finderType) { case SELECT_OPTIONS: { HTMLSelect *pSelect = (HTMLSelect *) pColl->pTop; if (JSVAL_IS_INT(*vp)) { pSelect->SetNumOptions(UTIL_SAFE_LONG_TO_SHORT(JSVAL_TO_INT(*vp))); } } break; default: break; } break; default: switch(pColl->finderType) { case SELECT_OPTIONS: { HTMLOption *pOption = 0; HTMLSelect *pSelect = (HTMLSelect *) pColl->pTop; if (jvalobj) { // check to make sure this object is the right class if (JS_GetClass(jvalobj) == getHtmlOptionElement()) { HTMLElement *pElem = (HTMLElement *) jhutil_GetPrivate(cx, jvalobj); pOption = (pElem)? (HTMLOption *) pElem : 0; } } if (pOption) { if (pColl->pTop && pColl->pTop->Type() == HTML_SELECT_ELEMENT) { HTMLOption *pNextOption = pSelect->GetOptionIndex(JSVAL_TO_INT(id)); if (pNextOption != pOption) { if (pOption->mpParent) { pOption->mpParent->Remove(pOption); } if (pNextOption) { pNextOption->mpParent->InsertBefore(pOption, pNextOption); pNextOption->mpParent->Remove(pNextOption); WEBC_DELETE(pNextOption); } else { pSelect->InsertFirst(pOption); } } } break; } else // this means we're setting the object to null { HTMLOption *pNullOption = pSelect->GetOptionIndex(JSVAL_TO_INT(id)); if (pNullOption) { pNullOption->mpParent->Remove(pNullOption); if (!jsmgr->AddNewElement(pNullOption)) { WEBC_DELETE(pNullOption); } } } } break; default: break; } break; } return JS_TRUE; }
void js_prop_set_from_jsval(JSContext *cx, prop_t *p, jsval value) { JSBool b; if(JSVAL_IS_INT(value)) { prop_set_int(p, JSVAL_TO_INT(value)); } else if(JSVAL_IS_BOOLEAN(value)) { prop_set_int(p, JSVAL_TO_BOOLEAN(value)); } else if(JSVAL_IS_NULL(value) || JSVAL_IS_VOID(value)) { prop_set_void(p); } else if(JSVAL_IS_DOUBLE(value)) { double d; if(JS_ValueToNumber(cx, value, &d)) prop_set_float(p, d); } else if(JS_HasInstance(cx, RichText, value, &b) && b) { JSObject *o = JSVAL_TO_OBJECT(value); jsval v2; if(!JS_EnterLocalRootScope(cx)) return; if(!JS_GetProperty(cx, o, "text", &v2)) { JS_LeaveLocalRootScope(cx); return; } prop_set_string_ex(p, NULL, JS_GetStringBytes(JS_ValueToString(cx, v2)), PROP_STR_RICH); JS_LeaveLocalRootScope(cx); } else if(JS_HasInstance(cx, Link, value, &b) && b) { JSObject *o = JSVAL_TO_OBJECT(value); jsval v1; jsval v2; if(!JS_EnterLocalRootScope(cx)) return; if(!JS_GetProperty(cx, o, "title", &v1)) { JS_LeaveLocalRootScope(cx); return; } if(!JS_GetProperty(cx, o, "url", &v2)) { JS_LeaveLocalRootScope(cx); return; } prop_set_link(p, JS_GetStringBytes(JS_ValueToString(cx, v1)), JS_GetStringBytes(JS_ValueToString(cx, v2))); JS_LeaveLocalRootScope(cx); } else if(JSVAL_IS_STRING(value)) { js_prop_from_str(cx, p, value); } else if(JSVAL_IS_OBJECT(value)) { JSObject *obj = JSVAL_TO_OBJECT(value); JSClass *c = JS_GetClass(cx, obj); if(!strcmp(c->name, "XML")) // Treat some classes special js_prop_from_str(cx, p, value); else js_prop_from_object(cx, obj, p); } else { prop_set_void(p); } }
/* void takePicture (in nsICameraTakePictureCallback onSuccess, [optional] in nsICameraErrorCallback onError); */ NS_IMETHODIMP nsCameraControl::TakePicture(nsICameraPictureOptions *aOptions, nsICameraTakePictureCallback *onSuccess, nsICameraErrorCallback *onError, JSContext* cx) { PRUint32 width = 0; PRUint32 height = 0; PRInt32 rotation = 0; double latitude = 0; double longitude = 0; double altitude = 0; double timestamp = 0; bool latitudeSet = false; bool longitudeSet = false; bool altitudeSet = false; bool timestampSet = false; NS_ENSURE_TRUE(onSuccess, NS_ERROR_INVALID_ARG); NS_ENSURE_TRUE(aOptions, NS_ERROR_INVALID_ARG); jsval pictureSize; nsresult rv = aOptions->GetPictureSize(&pictureSize); NS_ENSURE_SUCCESS(rv, rv); if (pictureSize.isObject()) { JSObject* options = JSVAL_TO_OBJECT(pictureSize); jsval v; if (JS_GetProperty(cx, options, "width", &v)) { if (JSVAL_IS_INT(v)) { width = JSVAL_TO_INT(v); } } if (JS_GetProperty(cx, options, "height", &v)) { if (JSVAL_IS_INT(v)) { height = JSVAL_TO_INT(v); } } } nsString fileFormat; rv = aOptions->GetFileFormat(fileFormat); NS_ENSURE_SUCCESS(rv, rv); rv = aOptions->GetRotation(&rotation); NS_ENSURE_SUCCESS(rv, rv); jsval position; rv = aOptions->GetPosition(&position); NS_ENSURE_SUCCESS(rv, rv); if (position.isObject()) { JSObject* options = JSVAL_TO_OBJECT(position); jsval v; if (JS_GetProperty(cx, options, "latitude", &v)) { if (JSVAL_IS_NUMBER(v)) { if (JS_ValueToNumber(cx, v, &latitude)) { latitudeSet = true; } } } if (JS_GetProperty(cx, options, "longitude", &v)) { if (JSVAL_IS_NUMBER(v)) { if (JS_ValueToNumber(cx, v, &longitude)) { longitudeSet = true; } } } if (JS_GetProperty(cx, options, "altitude", &v)) { if (JSVAL_IS_NUMBER(v)) { if (JS_ValueToNumber(cx, v, &altitude)) { altitudeSet = true; } } } if (JS_GetProperty(cx, options, "timestamp", &v)) { if (JSVAL_IS_NUMBER(v)) { if (JS_ValueToNumber(cx, v, ×tamp)) { timestampSet = true; } } } } nsCOMPtr<nsIRunnable> takePictureTask = new TakePictureTask(this, width, height, rotation, fileFormat, latitude, latitudeSet, longitude, longitudeSet, altitude, altitudeSet, timestamp, timestampSet, onSuccess, onError); mCameraThread->Dispatch(takePictureTask, NS_DISPATCH_NORMAL); return NS_OK; }
/** * This method is called when setting a Property in HTMLOption */ static JSBool jhtml_option_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { HTMLElement *pElem = (HTMLElement *) jhutil_GetPrivate(cx, obj); HTMLOption *pOption = (pElem)? (HTMLOption *) pElem : 0; if (!pOption) { return JS_TRUE; } //Get this Option's Select Element HTMLSelect *pSelect = pOption->GetSelectElement(); switch (JSVAL_TO_INT(id)) { case HTMLOPTIONELEMENT_DEFAULTSELECTED: if (JSVAL_IS_BOOLEAN(*vp)) { if (JSVAL_TO_BOOLEAN(*vp) == JS_TRUE) { if (pSelect) { pSelect->SetDefSelected(pOption->GetIndex()); } } } break; case HTMLOPTIONELEMENT_SELECTED: if (JSVAL_IS_BOOLEAN(*vp)) { if (JSVAL_TO_BOOLEAN(*vp) == JS_TRUE) { if (pSelect) { pSelect->SetSelectedIndex(pOption->GetIndex()); pSelect->Refresh(WEBC_FALSE); } } } break; case HTMLOPTIONELEMENT_TEXT: if (JSVAL_IS_STRINGABLE(*vp)) { pOption->SetText(WEBC_JS_STRING_TO_WEBC_STRING(JS_ValueToString(cx, *vp))); if (pSelect) { pSelect->StyleUpdate(); } } break; case HTMLOPTIONELEMENT_INDEX: if (JSVAL_IS_INT(*vp)) { //GMP this will take some work. Talk to FT } break; case HTMLOPTIONELEMENT_VALUE: if (JSVAL_IS_STRINGABLE(*vp)) { pOption->SetValue(WEBC_JS_STRING_TO_WEBC_STRING(JS_ValueToString(cx,*vp))); } break; }//end switch return JS_TRUE; }
static nsresult CVE_2013_1705_firefox8_0_1_cryptojs_ReadArgsAndGenerateKey(JSContext *cx, jsval *argv, nsKeyPairInfo *keyGenType, nsIInterfaceRequestor *uiCxt, PK11SlotInfo **slot, PRBool willEscrow) { JSString *jsString; JSAutoByteString params, keyGenAlg; int keySize; nsresult rv; if (!JSVAL_IS_INT(argv[0])) { JS_ReportError(cx, "%s%s\n", JS_ERROR, "passed in non-integer for key size"); return NS_ERROR_FAILURE; } keySize = JSVAL_TO_INT(argv[0]); if (!JSVAL_IS_NULL(argv[1])) { jsString = JS_ValueToString(cx,argv[1]); NS_ENSURE_TRUE(jsString, NS_ERROR_OUT_OF_MEMORY); argv[1] = STRING_TO_JSVAL(jsString); params.encode(cx, jsString); NS_ENSURE_TRUE(!!params, NS_ERROR_OUT_OF_MEMORY); } if (JSVAL_IS_NULL(argv[2])) { JS_ReportError(cx,"%s%s\n", JS_ERROR, "key generation type not specified"); return NS_ERROR_FAILURE; } jsString = JS_ValueToString(cx, argv[2]); NS_ENSURE_TRUE(jsString, NS_ERROR_OUT_OF_MEMORY); argv[2] = STRING_TO_JSVAL(jsString); keyGenAlg.encode(cx, jsString); NS_ENSURE_TRUE(!!keyGenAlg, NS_ERROR_OUT_OF_MEMORY); keyGenType->keyGenType = cryptojs_interpret_key_gen_type(keyGenAlg.ptr()); if (keyGenType->keyGenType == invalidKeyGen) { JS_ReportError(cx, "%s%s%s", JS_ERROR, "invalid key generation argument:", keyGenAlg.ptr()); goto loser; } if (*slot == nsnull) { *slot = nsGetSlotForKeyGen(keyGenType->keyGenType, uiCxt); if (*slot == nsnull) goto loser; } rv = cryptojs_generateOneKeyPair(cx,keyGenType,keySize,params.ptr(),uiCxt, *slot,willEscrow); if (rv != NS_OK) { JS_ReportError(cx,"%s%s%s", JS_ERROR, "could not generate the key for algorithm ", keyGenAlg.ptr()); goto loser; } return NS_OK; loser: return NS_ERROR_FAILURE; }
static JSBool SMJS_FUNCTION(upnp_service_call_action) { u32 i=1; GPAC_ActionUDTA *act_udta = NULL; char *action_name = NULL; SMJS_OBJ SMJS_ARGS GPAC_ServiceItem *service = (GPAC_ServiceItem *)JS_GetPrivate(c, obj); if (!service || !argc || !JSVAL_IS_STRING(argv[0]) ) return JS_FALSE; action_name = SMJS_CHARS(c, argv[0]); PLT_ActionDesc* action_desc = service->m_service->FindActionDesc(action_name); SMJS_FREE(c, action_name); if (action_desc == NULL) return JS_FALSE; PLT_ActionReference action; NPT_CHECK_SEVERE( service->m_device->m_pUPnP->m_pGenericController->m_CtrlPoint->CreateAction( service->m_device->m_device, service->m_service->GetServiceType(), action_name, action) ); if ((argc>=2) && JSVAL_IS_OBJECT(argv[1])) { JSObject *list = JSVAL_TO_OBJECT(argv[1]); u32 i, count; JS_GetArrayLength(c, list, (jsuint*) &count); GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Calling %s(", action_name)); i=0; while (i+2<=count) { NPT_Result res; jsval an_arg; char *param_val, *_param_val = NULL; char szParamVal[1024]; JS_GetElement(c, list, (jsint) i, &an_arg); char *param_name = SMJS_CHARS(c, an_arg); JS_GetElement(c, list, (jsint) i+1, &an_arg); param_val = ""; if (JSVAL_IS_STRING(an_arg)) { param_val = _param_val = SMJS_CHARS(c, an_arg); } else if (JSVAL_IS_BOOLEAN(an_arg)) { param_val = (char *) ((JSVAL_TO_BOOLEAN(an_arg) == JS_TRUE) ? "true" : "false"); } else if (JSVAL_IS_INT(argv[1])) { sprintf(szParamVal, "%d", JSVAL_TO_INT(an_arg)); param_val = szParamVal; } else if (JSVAL_IS_NUMBER(an_arg)) { jsdouble v; JS_ValueToNumber(c, an_arg, &v); sprintf(szParamVal, "%g", v); param_val = szParamVal; } if (!param_name || !param_val) res = NPT_FAILURE; else { GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, (" %s(%s)", param_name, param_val)); res = action->SetArgumentValue(param_name, param_val); } SMJS_FREE(c, param_name); SMJS_FREE(c, _param_val); if (res != NPT_SUCCESS) return JS_FALSE; i+=2; } GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, (" )\n")); } if ((argc==3) && JSVAL_IS_OBJECT(argv[2])) { act_udta = new GPAC_ActionUDTA(); act_udta->udta = argv[2]; gf_js_add_root(c, &act_udta->udta, GF_JSGC_VAL); } service->m_device->m_pUPnP->m_pGenericController->m_CtrlPoint->InvokeAction(action, act_udta); return JS_TRUE; }
static JSBool js_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) { jsval idval; jsint tiny; jsrefcount rc; JS_IdToValue(cx, id, &idval); tiny = JSVAL_TO_INT(idval); rc=JS_SUSPENDREQUEST(cx); switch(tiny) { case PROP_WSCROLL: *vp=BOOLEAN_TO_JSVAL(_wscroll); break; case PROP_DIRECTVIDEO: *vp=BOOLEAN_TO_JSVAL(directvideo); break; case PROP_HOLD_UPDATE: *vp=BOOLEAN_TO_JSVAL(hold_update); break; case PROP_PUTTEXT_CAN_MOVE: *vp=BOOLEAN_TO_JSVAL(puttext_can_move); break; case PROP_MODE: *vp=INT_TO_JSVAL(cio_api.mode); break; case PROP_MOUSE: *vp=BOOLEAN_TO_JSVAL(cio_api.mouse); break; case PROP_ESCDELAY: *vp=INT_TO_JSVAL(cio_api.ESCDELAY?*cio_api.ESCDELAY:0); break; case PROP_TEXTATTR: *vp=INT_TO_JSVAL(cio_textinfo.attribute); break; case PROP_KBHIT: *vp=BOOLEAN_TO_JSVAL(kbhit()); break; case PROP_WHEREX: *vp=INT_TO_JSVAL(cio_textinfo.curx); break; case PROP_WHEREY: *vp=INT_TO_JSVAL(cio_textinfo.cury); break; case PROP_TEXTMODE: *vp=INT_TO_JSVAL(cio_textinfo.currmode); break; case PROP_WINLEFT: *vp=INT_TO_JSVAL(cio_textinfo.winleft); break; case PROP_WINTOP: *vp=INT_TO_JSVAL(cio_textinfo.wintop); break; case PROP_WINRIGHT: *vp=INT_TO_JSVAL(cio_textinfo.winright); break; case PROP_WINBOTTOM: *vp=INT_TO_JSVAL(cio_textinfo.winbottom); break; case PROP_SCREENWIDTH: *vp=INT_TO_JSVAL(cio_textinfo.screenwidth); break; case PROP_SCREENHEIGHT: *vp=INT_TO_JSVAL(cio_textinfo.screenheight); break; case PROP_NORMATTR: *vp=INT_TO_JSVAL(cio_textinfo.normattr); break; case PROP_TEXTBACKGROUND: *vp=INT_TO_JSVAL((cio_textinfo.attribute & 0x70)>>4); break; case PROP_TEXTCOLOR: *vp=INT_TO_JSVAL(cio_textinfo.attribute & 0xf); break; case PROP_CLIPBOARD: *vp=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,getcliptext())); break; case PROP_HIGHVIDEO: *vp=BOOLEAN_TO_JSVAL(cio_textinfo.attribute & 0x8); break; case PROP_LOWVIDEO: *vp=BOOLEAN_TO_JSVAL(!(cio_textinfo.attribute & 0x8)); break; } JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); }
static JSBool SMJS_FUNCTION(upnp_action_send_reply) { u32 i=1; SMJS_OBJ SMJS_ARGS GPAC_GenericDevice *device = (GPAC_GenericDevice *)JS_GetPrivate(c, obj); if (!device) return JS_FALSE; if (argc && JSVAL_IS_OBJECT(argv[0]) ) { JSObject *list = JSVAL_TO_OBJECT(argv[0]); u32 i, count; JS_GetArrayLength(c, list, (jsuint*) &count); GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Calling response %s(", (char *) device->act_ref->GetActionDesc().GetName())); i=0; while (i+2<=count) { jsval an_arg; NPT_Result res; char *param_val, *_param_val = NULL; char szParamVal[1024]; JS_GetElement(c, list, (jsint) i, &an_arg); char *param_name = SMJS_CHARS(c, an_arg); JS_GetElement(c, list, (jsint) i+1, &an_arg); param_val = ""; if (JSVAL_IS_STRING(an_arg)) { param_val = _param_val = SMJS_CHARS(c, an_arg); } else if (JSVAL_IS_BOOLEAN(an_arg)) { param_val = (char *) ((JSVAL_TO_BOOLEAN(an_arg) == JS_TRUE) ? "true" : "false"); } else if (JSVAL_IS_INT(argv[1])) { sprintf(szParamVal, "%d", JSVAL_TO_INT(an_arg)); param_val = szParamVal; } else if (JSVAL_IS_NUMBER(an_arg)) { jsdouble v; JS_ValueToNumber(c, an_arg, &v); sprintf(szParamVal, "%g", v); param_val = szParamVal; } if (!param_name || !param_val) res = NPT_FAILURE; else { GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, (" %s(%s)", param_name, param_val)); res = device->act_ref->SetArgumentValue(param_name, param_val); } SMJS_FREE(c, param_name); SMJS_FREE(c, _param_val); if (res != NPT_SUCCESS) return JS_FALSE; i+=2; } GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, (" )\n")); } //notify we are ready if (device->m_pSema) { gf_sema_notify(device->m_pSema, 1); } return JS_TRUE; }
embed_array_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { JSObjectArray *array; MochaDecoder *decoder; MWContext *context; jsint count, slot; LO_EmbedStruct *embed_data; int32 active_layer_id; if (!JSVAL_IS_INT(id)) return JS_TRUE; slot = JSVAL_TO_INT(id); array = JS_GetInstancePrivate(cx, obj, &lm_embed_array_class, NULL); if (!array) return JS_TRUE; decoder = array->decoder; context = decoder->window_context; if (!context) return JS_TRUE; if (LM_MOJA_OK != ET_InitMoja(context)) return JS_FALSE; LO_LockLayout(); switch (slot) { case EMBED_ARRAY_LENGTH: active_layer_id = LM_GetActiveLayer(context); LM_SetActiveLayer(context, array->layer_id); count = LO_EnumerateEmbeds(context, array->layer_id); LM_SetActiveLayer(context, active_layer_id); if (count > array->length) array->length = count; *vp = INT_TO_JSVAL(array->length); break; default: if (slot < 0) { /* Don't mess with user-defined or method properties. */ LO_UnlockLayout(); return JS_TRUE; } embed_data = LO_GetEmbedByIndex(context, array->layer_id, (uint)slot); if (embed_data) { JSObject *mo = LM_ReflectEmbed(context, embed_data, NULL, array->layer_id, (uint)slot); if (!mo) { JS_ReportError(cx, "unable to reflect embed with index %d - not loaded yet?", (uint) slot); goto err; } *vp = OBJECT_TO_JSVAL(mo); XP_ASSERT(slot < array->length); } else { JS_ReportError(cx, "no embed with index %d\n"); goto err; } break; } LO_UnlockLayout(); return JS_TRUE; err: LO_UnlockLayout(); return JS_FALSE; }
nsresult Key::EncodeJSVal(JSContext* aCx, const jsval aVal, PRUint8 aTypeOffset) { PR_STATIC_ASSERT(eMaxType * MaxArrayCollapse < 256); if (JSVAL_IS_STRING(aVal)) { nsDependentJSString str; if (!str.init(aCx, aVal)) { return NS_ERROR_OUT_OF_MEMORY; } EncodeString(str, aTypeOffset); return NS_OK; } if (JSVAL_IS_INT(aVal)) { EncodeNumber((double)JSVAL_TO_INT(aVal), eFloat + aTypeOffset); return NS_OK; } if (JSVAL_IS_DOUBLE(aVal)) { double d = JSVAL_TO_DOUBLE(aVal); if (DOUBLE_IS_NaN(d)) { return NS_ERROR_DOM_INDEXEDDB_DATA_ERR; } EncodeNumber(d, eFloat + aTypeOffset); return NS_OK; } if (!JSVAL_IS_PRIMITIVE(aVal)) { JSObject* obj = JSVAL_TO_OBJECT(aVal); if (JS_IsArrayObject(aCx, obj)) { aTypeOffset += eMaxType; if (aTypeOffset == eMaxType * MaxArrayCollapse) { mBuffer.Append(aTypeOffset); aTypeOffset = 0; } NS_ASSERTION((aTypeOffset % eMaxType) == 0 && aTypeOffset < (eMaxType * MaxArrayCollapse), "Wrong typeoffset"); jsuint length; if (!JS_GetArrayLength(aCx, obj, &length)) { return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } for (jsuint index = 0; index < length; index++) { jsval val; if (!JS_GetElement(aCx, obj, index, &val)) { return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } nsresult rv = EncodeJSVal(aCx, val, aTypeOffset); NS_ENSURE_SUCCESS(rv, rv); aTypeOffset = 0; } mBuffer.Append(eTerminator + aTypeOffset); return NS_OK; } if (JS_ObjectIsDate(aCx, obj)) { EncodeNumber(js_DateGetMsecSinceEpoch(aCx, obj), eDate + aTypeOffset); return NS_OK; } } return NS_ERROR_DOM_INDEXEDDB_DATA_ERR; }
INT unit_getUnit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { CDebug cDbg("getUnit"); if(argc < 1) return JS_TRUE; jsint nType = NULL; jsint nClassId = -1; jsint nMode = -1; jsint nUnitId = NULL; CHAR szName[128] = ""; if(argc > 0 && JSVAL_IS_INT(argv[0])) nType = JSVAL_TO_INT(argv[0]); else return JS_TRUE; if(argc > 1 && JSVAL_IS_STRING(argv[1])) strcpy_s(szName, sizeof(szName), JS_GetStringBytes(JS_ValueToString(cx, argv[1]))); if(argc > 1 && JSVAL_IS_INT(argv[1])) nClassId = JSVAL_TO_INT(argv[1]); if(argc > 2 && JSVAL_IS_INT(argv[2])) nMode = JSVAL_TO_INT(argv[2]); if(argc > 3 && JSVAL_IS_INT(argv[3])) nUnitId = JSVAL_TO_INT(argv[3]); UnitAny* pUnit = NULL; if(nType == 100) pUnit = D2CLIENT_GetCursorItem(); else if(nType == 101) { pUnit = D2CLIENT_GetSelectedUnit(); if(!pUnit) pUnit = (*p_D2CLIENT_SelectedInvItem); } else pUnit = GetUnit(szName, nClassId, nType, nMode, nUnitId); if(!pUnit) return JS_TRUE; myUnit* pmyUnit = new myUnit; // leaked? if(!pmyUnit) return JS_TRUE; pmyUnit->_dwPrivateType = PRIVATE_UNIT; pmyUnit->dwClassId = nClassId; pmyUnit->dwMode = nMode; pmyUnit->dwType = pUnit->dwType; pmyUnit->dwUnitId = pUnit->dwUnitId; strcpy_s(pmyUnit->szName, sizeof(pmyUnit->szName), szName); JSObject *jsunit = BuildObject(cx, &unit_class, unit_methods, unit_props, pmyUnit); if(!jsunit) return JS_TRUE; *rval = OBJECT_TO_JSVAL(jsunit); return JS_TRUE; }
static JSBool XPC_XOW_NewResolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp) { obj = GetWrapper(obj); JSObject *wrappedObj = GetWrappedObject(cx, obj); if (!wrappedObj) { // No wrappedObj means that this is probably the prototype. *objp = nsnull; return JS_TRUE; } XPCCallContext ccx(JS_CALLER, cx); if (!ccx.IsValid()) { return ThrowException(NS_ERROR_FAILURE, cx); } JSBool privilegeEnabled; nsresult rv = CanAccessWrapper(cx, wrappedObj, &privilegeEnabled); if (NS_FAILED(rv)) { if (rv != NS_ERROR_DOM_PROP_ACCESS_DENIED) { return JS_FALSE; } // We're dealing with a cross-origin lookup. Ensure that we're allowed to // resolve this property and resolve it if so. Otherwise, we deny access // and throw a security error. Note that this code does not actually check // to see if the property exists, that's dealt with below. XPCWrappedNative *wn = XPCWrappedNative::GetWrappedNativeOfJSObject(cx, wrappedObj); NS_ASSERTION(wn, "How did we wrap a non-WrappedNative?"); if (!IsValFrame(wrappedObj, id, wn)) { nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager(); if (!ssm) { return ThrowException(NS_ERROR_NOT_INITIALIZED, cx); } PRUint32 action = (flags & JSRESOLVE_ASSIGNING) ? XPCWrapper::sSecMgrSetProp : XPCWrapper::sSecMgrGetProp; rv = ssm->CheckPropertyAccess(cx, wrappedObj, STOBJ_GET_CLASS(wrappedObj)->name, id, action); if (NS_FAILED(rv)) { // The security manager threw an exception for us. return JS_FALSE; } } // We're out! We're allowed to resolve this property. return XPCWrapper::ResolveNativeProperty(cx, obj, wrappedObj, wn, id, flags, objp, JS_FALSE); } if (privilegeEnabled && !(obj = GetUXPCObject(cx, obj))) { return JS_FALSE; } if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) { jsval oldSlotVal; if (!JS_GetReservedSlot(cx, obj, XPCWrapper::sFlagsSlot, &oldSlotVal) || !JS_SetReservedSlot(cx, obj, XPCWrapper::sFlagsSlot, INT_TO_JSVAL(JSVAL_TO_INT(oldSlotVal) | FLAG_RESOLVING))) { return JS_FALSE; } JSBool ok = JS_DefineFunction(cx, obj, "toString", XPC_XOW_toString, 0, 0) != nsnull; JS_SetReservedSlot(cx, obj, XPCWrapper::sFlagsSlot, oldSlotVal); if (ok) { *objp = obj; } return ok; } return XPCWrapper::NewResolve(cx, obj, JS_TRUE, wrappedObj, id, flags, objp); }
nsresult xpc_qsUnwrapArgImpl(JSContext *cx, jsval v, const nsIID &iid, void **ppArg, nsISupports **ppArgRef, jsval *vp) { // From XPCConvert::JSData2Native if(JSVAL_IS_VOID(v) || JSVAL_IS_NULL(v)) { *ppArg = nsnull; *ppArgRef = nsnull; return NS_OK; } if(!JSVAL_IS_OBJECT(v)) { *ppArgRef = nsnull; return ((JSVAL_IS_INT(v) && JSVAL_TO_INT(v) == 0) ? NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL : NS_ERROR_XPC_BAD_CONVERT_JS); } JSObject *src = JSVAL_TO_OBJECT(v); if(IS_SLIM_WRAPPER(src)) { nsISupports *iface = static_cast<nsISupports*>(xpc_GetJSPrivate(src)); if(NS_FAILED(getNative(iface, GetOffsetsFromSlimWrapper(src), src, iid, ppArg, ppArgRef, vp))) return NS_ERROR_XPC_BAD_CONVERT_JS; return NS_OK; } // From XPCConvert::JSObject2NativeInterface XPCWrappedNative* wrappedNative = XPCWrappedNative::GetWrappedNativeOfJSObject(cx, src); nsISupports *iface; if(wrappedNative) { iface = wrappedNative->GetIdentityObject(); if(NS_FAILED(getNativeFromWrapper(wrappedNative, iid, ppArg, ppArgRef, vp))) return NS_ERROR_XPC_BAD_CONVERT_JS; return NS_OK; } // else... // Slow path. // XXX E4X breaks the world. Don't try wrapping E4X objects! // This hack can be removed (or changed accordingly) when the // DOM <-> E4X bindings are complete, see bug 270553 if(JS_TypeOfValue(cx, OBJECT_TO_JSVAL(src)) == JSTYPE_XML) { *ppArgRef = nsnull; return NS_ERROR_XPC_BAD_CONVERT_JS; } // Does the JSObject have 'nsISupportness'? // XXX hmm, I wonder if this matters anymore with no // oldstyle DOM objects around. if(XPCConvert::GetISupportsFromJSObject(src, &iface)) { if(!iface || NS_FAILED(iface->QueryInterface(iid, ppArg))) { *ppArgRef = nsnull; return NS_ERROR_XPC_BAD_CONVERT_JS; } *ppArgRef = static_cast<nsISupports*>(*ppArg); return NS_OK; } // Create the ccx needed for quick stubs. XPCCallContext ccx(JS_CALLER, cx); if(!ccx.IsValid()) { *ppArgRef = nsnull; return NS_ERROR_XPC_BAD_CONVERT_JS; } nsXPCWrappedJS *wrapper; nsresult rv = nsXPCWrappedJS::GetNewOrUsed(ccx, src, iid, nsnull, &wrapper); if(NS_FAILED(rv) || !wrapper) { *ppArgRef = nsnull; return rv; } // We need to go through the QueryInterface logic to make this return // the right thing for the various 'special' interfaces; e.g. // nsIPropertyBag. We must use AggregatedQueryInterface in cases where // there is an outer to avoid nasty recursion. rv = wrapper->QueryInterface(iid, ppArg); if(NS_SUCCEEDED(rv)) { *ppArgRef = static_cast<nsISupports*>(*ppArg); *vp = OBJECT_TO_JSVAL(wrapper->GetJSObject()); } NS_RELEASE(wrapper); return rv; }
JSBool ADM_JSAvidemuxVideo::IndexMPEG(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {// begin IndexMPEG ADM_JSAvidemuxVideo *p = (ADM_JSAvidemuxVideo *)JS_GetPrivate(cx, obj); // default return value *rval = BOOLEAN_TO_JSVAL(false); if(argc != 3) return JS_FALSE; printf("Indexing MPEG... \n"); *rval = BOOLEAN_TO_JSVAL(indexMpeg(JS_GetStringBytes(JSVAL_TO_STRING(argv[0])),JS_GetStringBytes(JSVAL_TO_STRING(argv[1])),JSVAL_TO_INT(argv[2]))); return JS_TRUE; }// end IndexMPEG