/* [implicit_jscontext] jsval getListOfCameras (); */ NS_IMETHODIMP nsDOMCameraManager::GetListOfCameras(JSContext* cx, JS::Value* _retval) { JSObject* a = JS_NewArrayObject(cx, 0, nullptr); camera_module_t* module; uint32_t index = 0; uint32_t count; if (!a) { DOM_CAMERA_LOGE("getListOfCameras : Could not create array object"); return NS_ERROR_OUT_OF_MEMORY; } if (hw_get_module(CAMERA_HARDWARE_MODULE_ID, (const hw_module_t**)&module) < 0) { DOM_CAMERA_LOGE("getListOfCameras : Could not load camera HAL module"); return NS_ERROR_NOT_AVAILABLE; } count = module->get_number_of_cameras(); DOM_CAMERA_LOGI("getListOfCameras : get_number_of_cameras() returned %d\n", count); while (count--) { struct camera_info info; int rv = module->get_camera_info(count, &info); if (rv != 0) { DOM_CAMERA_LOGE("getListOfCameras : get_camera_info(%d) failed: %d\n", count, rv); continue; } JSString* v; jsval jv; switch (info.facing) { case CAMERA_FACING_BACK: v = JS_NewStringCopyZ(cx, "back"); index = 0; break; case CAMERA_FACING_FRONT: v = JS_NewStringCopyZ(cx, "front"); index = 1; break; default: // TODO: see bug 779143. { static uint32_t extraIndex = 2; nsCString s; s.AppendPrintf("extra-camera-%d", count); v = JS_NewStringCopyZ(cx, s.get()); index = extraIndex++; } break; } if (!v) { DOM_CAMERA_LOGE("getListOfCameras : out of memory populating camera list"); return NS_ERROR_NOT_AVAILABLE; } jv = STRING_TO_JSVAL(v); if (!JS_SetElement(cx, a, index, &jv)) { DOM_CAMERA_LOGE("getListOfCameras : failed building list of cameras"); return NS_ERROR_NOT_AVAILABLE; } } *_retval = OBJECT_TO_JSVAL(a); return NS_OK; }
static nsresult getHelper(nsCameraControl *aCameraControl, PRUint32 aKey, JSContext *cx, JS::Value *aValue) { nsAutoArrayPtr<nsCameraControl::CameraRegion> regions; PRUint32 length = 0; aCameraControl->GetParameter(aKey, getter_Transfers(regions), &length); if (!regions && length > 0) { DOM_CAMERA_LOGE("%s:%d : got length %d, but no regions\n", __func__, __LINE__, length); return NS_ERROR_UNEXPECTED; } JSObject *array = JS_NewArrayObject(cx, 0, nsnull); if (!array) { return NS_ERROR_OUT_OF_MEMORY; } DOM_CAMERA_LOGI("%s:%d : got %d regions\n", __func__, __LINE__, length); for (PRUint32 i = 0; i < length; ++i) { JS::Value v; JSObject *o = JS_NewObject(cx, nsnull, nsnull, nsnull); if (!o) { return NS_ERROR_OUT_OF_MEMORY; } DOM_CAMERA_LOGI("mLeft=%d\n", regions[i].mTop); v = INT_TO_JSVAL(regions[i].mTop); if (!JS_SetProperty(cx, o, "top", &v)) { return NS_ERROR_FAILURE; } DOM_CAMERA_LOGI("mLeft=%d\n", regions[i].mLeft); v = INT_TO_JSVAL(regions[i].mLeft); if (!JS_SetProperty(cx, o, "left", &v)) { return NS_ERROR_FAILURE; } DOM_CAMERA_LOGI("mBottom=%d\n", regions[i].mBottom); v = INT_TO_JSVAL(regions[i].mBottom); if (!JS_SetProperty(cx, o, "bottom", &v)) { return NS_ERROR_FAILURE; } DOM_CAMERA_LOGI("mRight=%d\n", regions[i].mRight); v = INT_TO_JSVAL(regions[i].mRight); if (!JS_SetProperty(cx, o, "right", &v)) { return NS_ERROR_FAILURE; } DOM_CAMERA_LOGI("mWeight=%d\n", regions[i].mWeight); v = INT_TO_JSVAL(regions[i].mWeight); if (!JS_SetProperty(cx, o, "weight", &v)) { return NS_ERROR_FAILURE; } v = OBJECT_TO_JSVAL(o); if (!JS_SetElement(cx, array, i, &v)) { return NS_ERROR_FAILURE; } } *aValue = JS::ObjectValue(*array); return NS_OK; }