NS_IMETHODIMP GonkGPSGeolocationProvider::Handle(const nsAString& aName, JS::Handle<JS::Value> aResult) { #ifdef MOZ_B2G_RIL if (aName.EqualsLiteral("ril.supl.apn")) { // When we get the APN, we attempt to call data_call_open of AGPS. if (aResult.isString()) { JSContext *cx = nsContentUtils::GetCurrentJSContext(); NS_ENSURE_TRUE(cx, NS_OK); // NB: No need to enter a compartment to read the contents of a string. nsAutoJSString apn; if (!apn.init(cx, aResult.toString())) { return NS_ERROR_FAILURE; } if (!apn.IsEmpty()) { SetAGpsDataConn(apn); } } } else #endif // MOZ_B2G_RIL if (aName.EqualsLiteral(SETTING_DEBUG_ENABLED)) { gGPSDebugging = aResult.isBoolean() ? aResult.toBoolean() : false; return NS_OK; } return NS_OK; }
NS_IMETHODIMP GonkGPSGeolocationProvider::Handle(const nsAString& aName, JS::Handle<JS::Value> aResult) { #ifdef MOZ_B2G_RIL if (aName.EqualsLiteral("ril.supl.apn")) { // When we get the APN, we attempt to call data_call_open of AGPS. if (aResult.isString()) { JSContext *cx = nsContentUtils::GetCurrentJSContext(); NS_ENSURE_TRUE(cx, NS_OK); // NB: No need to enter a compartment to read the contents of a string. nsAutoJSString apn; if (!apn.init(cx, aResult.toString())) { return NS_ERROR_FAILURE; } if (!apn.IsEmpty()) { SetAGpsDataConn(apn); } } } else #endif // MOZ_B2G_RIL if (aName.EqualsASCII(kSettingDebugGpsIgnored)) { gDebug_isGPSLocationIgnored = aResult.isBoolean() ? aResult.toBoolean() : false; if (gDebug_isLoggingEnabled) { nsContentUtils::LogMessageToConsole("geo: Debug: GPS ignored %d\n", gDebug_isGPSLocationIgnored); } return NS_OK; } else if (aName.EqualsASCII(kSettingDebugEnabled)) { gDebug_isLoggingEnabled = aResult.isBoolean() ? aResult.toBoolean() : false; return NS_OK; } return NS_OK; }
NS_IMETHODIMP GonkGPSGeolocationProvider::Handle(const nsAString& aName, JS::Handle<JS::Value> aResult) { #ifdef MOZ_B2G_RIL if (aName.EqualsLiteral("ril.supl.apn")) { // When we get the APN, we attempt to call data_call_open of AGPS. if (aResult.isString()) { JSContext *cx = nsContentUtils::GetCurrentJSContext(); NS_ENSURE_TRUE(cx, NS_OK); // NB: No need to enter a compartment to read the contents of a string. nsAutoJSString apn; if (!apn.init(cx, aResult.toString())) { return NS_ERROR_FAILURE; } if (!apn.IsEmpty()) { SetAGpsDataConn(apn); } } } else if (aName.EqualsASCII(kSettingRilDefaultServiceId)) { uint32_t id = 0; JSContext *cx = nsContentUtils::GetCurrentJSContext(); NS_ENSURE_TRUE(cx, NS_OK); if (!JS::ToUint32(cx, aResult, &id)) { return NS_ERROR_FAILURE; } if (!IsValidRilServiceId(id)) { return NS_ERROR_UNEXPECTED; } mRilDataServiceId = id; UpdateRadioInterface(); MOZ_ASSERT(!mObservingNetworkConnStateChange); // Now we know which service ID to deal with, observe necessary topic then nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); NS_ENSURE_TRUE(obs, NS_OK); if (NS_FAILED(obs->AddObserver(this, kNetworkConnStateChangedTopic, false))) { NS_WARNING("Failed to add network state changed observer!"); } else { mObservingNetworkConnStateChange = true; } } #endif // MOZ_B2G_RIL return NS_OK; }
NS_IMETHODIMP GonkGPSGeolocationProvider::Handle(const nsAString& aName, JS::Handle<JS::Value> aResult) { if (aName.EqualsLiteral("ril.supl.apn")) { JSContext *cx = nsContentUtils::GetCurrentJSContext(); NS_ENSURE_TRUE(cx, NS_OK); // When we get the APN, we attempt to call data_call_open of AGPS. if (aResult.isString()) { // NB: No need to enter a compartment to read the contents of a string. nsDependentJSString apn; apn.init(cx, aResult.toString()); if (!apn.IsEmpty()) { SetAGpsDataConn(apn); } } } return NS_OK; }
NS_IMETHODIMP TCPSocketParent::SendEvent(const nsAString& aType, JS::Handle<JS::Value> aDataVal, const nsAString& aReadyState, 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(); nsAutoJSString str; if (!str.init(aCx, jsstr)) { FireInteralError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } data = SendableData(str); } else if (aDataVal.isUndefined() || aDataVal.isNull()) { data = mozilla::void_t(); } else if (aDataVal.isObject()) { JS::Rooted<JSObject *> obj(aCx, &aDataVal.toObject()); if (JS_IsArrayBufferObject(obj)) { FallibleTArray<uint8_t> fallibleArr; uint32_t errLine = 0; do { JS::AutoCheckCannotGC nogc; uint32_t nbytes = JS_GetArrayBufferByteLength(obj); uint8_t* buffer = JS_GetArrayBufferData(obj, nogc); if (!buffer) { errLine = __LINE__; break; } if (!fallibleArr.InsertElementsAt(0, buffer, nbytes, fallible)) { errLine = __LINE__; break; } } while (false); if (errLine) { FireInteralError(this, errLine); return NS_ERROR_OUT_OF_MEMORY; } InfallibleTArray<uint8_t> arr; arr.SwapElements(fallibleArr); data = SendableData(arr); } else { nsAutoJSString name; JS::Rooted<JS::Value> val(aCx); if (!JS_GetProperty(aCx, obj, "name", &val)) { NS_ERROR("No name property on supposed error object"); } else if (val.isString()) { if (!name.init(aCx, val.toString())) { NS_WARNING("couldn't initialize string"); } } data = TCPError(name); } } else { NS_ERROR("Unexpected JS value encountered"); FireInteralError(this, __LINE__); return NS_ERROR_FAILURE; } mozilla::unused << PTCPSocketParent::SendCallback(nsString(aType), data, nsString(aReadyState)); return NS_OK; }
NS_IMETHODIMP MobileMessageManager::Send(JS::Handle<JS::Value> aNumber, const nsAString& aMessage, JS::Handle<JS::Value> aSendParams, JSContext* aCx, uint8_t aArgc, JS::MutableHandle<JS::Value> aReturn) { if (!aNumber.isString() && !(aNumber.isObject() && JS_IsArrayObject(aCx, &aNumber.toObject()))) { return NS_ERROR_INVALID_ARG; } nsresult rv; nsIScriptContext* sc = GetContextForEventHandlers(&rv); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_STATE(sc); JS::Rooted<JSObject*> global(aCx, JS::CurrentGlobalOrNull(aCx)); mozilla::Maybe<JSAutoCompartment> ac; if (!global) { global = sc->GetWindowProxy(); ac.construct(aCx, global); } nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID); NS_ENSURE_TRUE(smsService, NS_ERROR_FAILURE); // Use the default one unless |aSendParams.serviceId| is available. uint32_t serviceId; rv = smsService->GetSmsDefaultServiceId(&serviceId); NS_ENSURE_SUCCESS(rv, rv); if (aArgc == 3) { JS::Rooted<JS::Value> param(aCx, aSendParams); RootedDictionary<SmsSendParameters> sendParams(aCx); if (!sendParams.Init(aCx, param)) { return NS_ERROR_TYPE_ERR; } if (sendParams.mServiceId.WasPassed()) { serviceId = sendParams.mServiceId.Value(); } } if (aNumber.isString()) { JS::Rooted<JSString*> str(aCx, aNumber.toString()); return Send(aCx, global, serviceId, str, aMessage, aReturn.address()); } // Must be an array then. JS::Rooted<JSObject*> numbers(aCx, &aNumber.toObject()); uint32_t size; if (!JS_GetArrayLength(aCx, numbers, &size)) { return NS_ERROR_FAILURE; } JS::AutoValueVector requests(aCx); if (!requests.resize(size)) { return NS_ERROR_FAILURE; } JS::Rooted<JS::Value> number(aCx); JS::Rooted<JSString*> str(aCx); for (uint32_t i = 0; i < size; ++i) { if (!JS_GetElement(aCx, numbers, i, &number)) { return NS_ERROR_INVALID_ARG; } str = JS::ToString(aCx, number); if (!str) { return NS_ERROR_FAILURE; } nsresult rv = Send(aCx, global, serviceId, str, aMessage, &requests[i]); NS_ENSURE_SUCCESS(rv, rv); } JS::Rooted<JSObject*> obj(aCx); obj = JS_NewArrayObject(aCx, requests.length(), requests.begin()); if (!obj) { return NS_ERROR_FAILURE; } aReturn.setObject(*obj); return NS_OK; }