static JSBool js_getAuthCredentials(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { const char *id, *reason, *source; char *username, *password; JSBool query; int r; jsval val; if(!JS_ConvertArguments(cx, argc, argv, "sssb", &id, &source, &reason, &query)) return JS_FALSE; r = keyring_lookup(id, &username, &password, NULL, query, source, reason); if(r == 1) { *rval = BOOLEAN_TO_JSVAL(0); return JS_TRUE; } JSObject *robj = JS_NewObject(cx, NULL, NULL, NULL); *rval = OBJECT_TO_JSVAL(robj); if(r == -1) { val = BOOLEAN_TO_JSVAL(1); JS_SetProperty(cx, robj, "rejected", &val); } else { val = STRING_TO_JSVAL(JS_NewString(cx, username, strlen(username))); JS_SetProperty(cx, robj, "username", &val); val = STRING_TO_JSVAL(JS_NewString(cx, password, strlen(password))); JS_SetProperty(cx, robj, "password", &val); } return JS_TRUE; }
JavaPackage_convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp) { JSString *str; char *name, *cp; JavaPackage_Private *package = JS_GetPrivate(cx, obj); if (!package) { fprintf(stderr, "JavaPackage_resolve: no private data!\n"); return JS_FALSE; } switch (type) { /* Pretty-printing of JavaPackage */ case JSTYPE_VOID: /* Default value */ case JSTYPE_NUMBER: case JSTYPE_STRING: /* Convert '/' to '.' so that it looks like Java language syntax. */ if (!package->path) break; name = JS_smprintf("[JavaPackage %s]", package->path); if (!name) { JS_ReportOutOfMemory(cx); return JS_FALSE; } for (cp = name; *cp != '\0'; cp++) if (*cp == '/') *cp = '.'; str = JS_NewString(cx, name, strlen(name)); if (!str) { free(name); /* It's not necessary to call JS_ReportOutOfMemory(), as JS_NewString() will do so on failure. */ return JS_FALSE; } *vp = STRING_TO_JSVAL(str); break; case JSTYPE_OBJECT: *vp = OBJECT_TO_JSVAL(obj); break; default: break; } return JS_TRUE; }
// dnsResolveEx in JS context; not available in core JavaScript. // returns javascript null if not able to resolve. static JSBool // JS_TRUE or JS_FALSE dns_resolve_ex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* name = JS_GetStringBytes(JS_ValueToString(cx, argv[0])); char* out; char ipaddr[INET6_ADDRSTRLEN * MAX_IP_RESULTS + MAX_IP_RESULTS] = ""; out = JS_malloc(cx, strlen(ipaddr) + 1); // Return "" on failure. if(resolve_host(name, ipaddr, MAX_IP_RESULTS, AF_UNSPEC)) { strcpy(out, ""); } strcpy(out, ipaddr); JSString *str = JS_NewString(cx, out, strlen(out)); *rval = STRING_TO_JSVAL(str); return JS_TRUE; }
static JSBool js_escape(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval, int how) { const char *str; char *r; if (!JS_ConvertArguments(cx, argc, argv, "s", &str)) return JS_FALSE; size_t len = url_escape(NULL, 0, str, how); r = malloc(len); url_escape(r, len, str, how); *rval = STRING_TO_JSVAL(JS_NewString(cx, r, len-1)); return JS_TRUE; }
JSBool Core_exec (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { FILE* pipe; char* output = NULL; size_t length = 0; size_t read = 0; const char* command; JS_BeginRequest(cx); JS_EnterLocalRootScope(cx); if (argc != 1 || !JS_ConvertArguments(cx, argc, argv, "s", &command)) { JS_ReportError(cx, "Not enough parameters."); return JS_FALSE; } jsrefcount req = JS_SuspendRequest(cx); if ((pipe = popen(command, "r")) == NULL) { JS_ReportError(cx, "Command not found"); return JS_FALSE; } // Read untill the pipe is empty. while (1) { output = (char*) JS_realloc(cx, output, length+=512); read = fread(output+(length-512), sizeof(char), 512, pipe); if (read < 512) { output = (char*) JS_realloc(cx, output, length-=(512-read)); break; } } output[length-1] = '\0'; pclose(pipe); JS_ResumeRequest(cx, req); *rval = STRING_TO_JSVAL(JS_NewString(cx, output, length)); JS_LeaveLocalRootScope(cx); JS_EndRequest(cx); return JS_TRUE; }
static JSBool js_httpEscape(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { const char *str; char *r; if (!JS_ConvertArguments(cx, argc, argv, "s", &str)) return JS_FALSE; size_t l = strlen(str); r = malloc((l * 3) + 1); path_escape(r, l * 3, str); *rval = STRING_TO_JSVAL(JS_NewString(cx, r, strlen(r))); return JS_TRUE; }
// dnsResolve in JS context; not available in core JavaScript. // returns javascript null if not able to resolve. static JSBool // JS_TRUE or JS_FALSE dns_resolve(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* name = JS_GetStringBytes(JS_ValueToString(cx, argv[0])); char* out; char ipaddr[INET6_ADDRSTRLEN] = ""; // Return null on failure. if(resolve_host(name, ipaddr, 1, AF_INET)) { *rval = JSVAL_NULL; return JS_TRUE; } out = JS_malloc(cx, strlen(ipaddr) + 1); strcpy(out, ipaddr); JSString *str = JS_NewString(cx, out, strlen(out)); *rval = STRING_TO_JSVAL(str); return JS_TRUE; }
//--------------------------------------------------------------------------- jsval CONCEPT_TO_JS(JSContext *cx, void *member) { INTEGER type = 0; char *szValue = 0; NUMBER nValue = 0; jsval ret = 0; InvokePtr(INVOKE_GET_VARIABLE, member, &type, &szValue, &nValue); switch (type) { case VARIABLE_NUMBER: ret = DOUBLE_TO_JSVAL(JS_NewDouble(cx, nValue)); break; case VARIABLE_STRING: ret = STRING_TO_JSVAL(JS_NewString(cx, szValue, (int)nValue)); break; default: ret = DOUBLE_TO_JSVAL(JS_NewDouble(cx, 1.0)); } return ret; }
JavaClass_convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp) { char *name; JSString *str; JavaClassDescriptor *class_descriptor; class_descriptor = JS_GetPrivate(cx, obj); if (!class_descriptor) return JS_FALSE; switch(type) { case JSTYPE_STRING: /* Convert '/' to '.' so that it looks like Java language syntax. */ if (!class_descriptor->name) break; name = JS_smprintf("[JavaClass %s]", class_descriptor->name); if (!name) { JS_ReportOutOfMemory(cx); return JS_FALSE; } str = JS_NewString(cx, name, strlen(name)); if (!str) { free(name); /* It's not necessary to call JS_ReportOutOfMemory(), as JS_NewString() will do so on failure. */ return JS_FALSE; } *vp = STRING_TO_JSVAL(str); return JS_TRUE; default: break; } return JS_TRUE; }
static JSBool js_queryStringSplit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { const char *str; char *s, *s0; JSObject *robj = JS_NewObject(cx, NULL, NULL, NULL); if (!JS_ConvertArguments(cx, argc, argv, "s", &str)) return JS_FALSE; s0 = s = strdup(str); while(s) { char *k = s; char *v = strchr(s, '='); if(v == NULL) break; *v++ = 0; if((s = strchr(v, '&')) != NULL) *s++ = 0; k = strdup(k); v = strdup(v); http_deescape(k); http_deescape(v); jsval val = STRING_TO_JSVAL(JS_NewString(cx, v, strlen(v))); JS_SetProperty(cx, robj, k, &val); free(k); } free(s0); *rval = OBJECT_TO_JSVAL(robj); return JS_TRUE; }
// myIpAddressEx in JS context; not available in core JavaScript. // returns 127.0.0.1 if not able to determine local ip. static JSBool // JS_TRUE or JS_FALSE my_ip_ex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char ipaddr[INET6_ADDRSTRLEN * MAX_IP_RESULTS + MAX_IP_RESULTS]; char* out; if (myip) // If my (client's) IP address is already set. strcpy(ipaddr, myip); else { char name[256]; gethostname(name, sizeof(name)); if (resolve_host(name, ipaddr, MAX_IP_RESULTS, AF_UNSPEC)) { strcpy(ipaddr, ""); } } out = JS_malloc(cx, strlen(ipaddr) + 1); strcpy(out, ipaddr); JSString *str = JS_NewString(cx, out, strlen(out)); *rval = STRING_TO_JSVAL(str); return JS_TRUE; }
static JSBool js_textDialog(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { const char *message; char *input; JSBool ok, cancel; int r; jsval val; if(!JS_ConvertArguments(cx, argc, argv, "sbb", &message, &ok, &cancel)) return JS_FALSE; r = text_dialog(message, &input, (ok ? MESSAGE_POPUP_OK : 0) | (cancel ? MESSAGE_POPUP_CANCEL : 0) | MESSAGE_POPUP_RICH_TEXT); if(r == 1) { *rval = BOOLEAN_TO_JSVAL(0); return JS_TRUE; } obj = JS_NewObject(cx, NULL, NULL, NULL); *rval = OBJECT_TO_JSVAL(obj); if(r == -1) { val = BOOLEAN_TO_JSVAL(1); JS_SetProperty(cx, obj, "rejected", &val); } else { val = STRING_TO_JSVAL(JS_NewString(cx, input, strlen(input))); JS_SetProperty(cx, obj, "input", &val); } return JS_TRUE; }
/* * This is a wrapper around JS_ReportError(), useful when an error condition * is the result of a JVM failure or exception condition. It appends the * message associated with the pending Java exception to the passed in * printf-style format string and arguments. */ static void vreport_java_error(JSContext *cx, JNIEnv *jEnv, const char *format, va_list ap) { jobject java_obj; jclass java_class; JavaClassDescriptor *class_descriptor; jthrowable java_exception; JSType wrapped_exception_type; jsval js_exception; java_obj = NULL; class_descriptor = NULL; /* Get the exception out of the java environment. */ java_exception = (*jEnv)->ExceptionOccurred(jEnv); if (!java_exception) { JSString *err_jsstr; char *err = JS_vsmprintf(format, ap); if (!err) return; err_jsstr = JS_NewString(cx, err, strlen(err)); if (!err_jsstr) return; JS_SetPendingException(cx, STRING_TO_JSVAL(err_jsstr)); return; } (*jEnv)->ExceptionClear(jEnv); /* Check for JSException */ if (njJSException && (*jEnv)->IsInstanceOf(jEnv, java_exception, njJSException)) { wrapped_exception_type = (*jEnv)->GetIntField(jEnv, java_exception, njJSException_wrappedExceptionType); /* (int) to suppress warning */ if ((int)wrapped_exception_type != JSTYPE_EMPTY) { java_obj = (*jEnv)->GetObjectField(jEnv, java_exception, njJSException_wrappedException); if ((java_obj == NULL) && (wrapped_exception_type == JSTYPE_OBJECT)) { js_exception = JSVAL_NULL; } else { java_class = (*jEnv)->GetObjectClass(jEnv, java_obj); class_descriptor = jsj_GetJavaClassDescriptor(cx, jEnv, java_class); /* OK to delete ref, since above call adds global ref */ (*jEnv)->DeleteLocalRef(jEnv, java_class); /* Convert native JS values back to native types. */ switch(wrapped_exception_type) { case JSTYPE_NUMBER: if (!jsj_ConvertJavaObjectToJSNumber(cx, jEnv, class_descriptor, java_obj, &js_exception)) goto error; break; case JSTYPE_BOOLEAN: if (!jsj_ConvertJavaObjectToJSBoolean(cx, jEnv, class_descriptor, java_obj, &js_exception)) goto error; break; case JSTYPE_STRING: if (!jsj_ConvertJavaObjectToJSString(cx, jEnv, class_descriptor, java_obj, &js_exception)) goto error; break; case JSTYPE_VOID: js_exception = JSVAL_VOID; break; case JSTYPE_OBJECT: case JSTYPE_FUNCTION: default: if ((*jEnv)->IsInstanceOf(jEnv, java_obj, njJSObject)) { js_exception = OBJECT_TO_JSVAL(jsj_UnwrapJSObjectWrapper(jEnv, java_obj)); if (!js_exception) goto error; } else { if (!jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_obj, &js_exception)) goto error; } } } } /* Check for internal exception */ } else { if (!JSJ_ConvertJavaObjectToJSValue(cx, java_exception, &js_exception)) { goto error; } } /* Set pending JS exception and clear the java exception. */ JS_SetPendingException(cx, js_exception); goto done; error: JS_ASSERT(0); jsj_LogError("Out of memory while attempting to throw JSException\n"); done: if (class_descriptor) jsj_ReleaseJavaClassDescriptor(cx, jEnv, class_descriptor); if (java_obj) (*jEnv)->DeleteLocalRef(jEnv, java_obj); if (java_exception) (*jEnv)->DeleteLocalRef(jEnv, java_exception); }
void CJS_Value::operator=(const FX_WCHAR* pWstr) { m_pValue = JS_NewString(m_isolate, (wchar_t*)pWstr); m_eType = VT_string; }
void CJS_Value::operator =(FX_LPCWSTR pWstr) { m_pValue = JS_NewString(m_isolate,(wchar_t *)pWstr); m_eType = VT_string; }
JSBool TCP_read (JSContext *cx, JSObject *object, uintN argc, jsval *argv, jsval *rval) { int32 size; uint16 flags = 0; jsdouble timeout = -1; JS_BeginRequest(cx); if (argc < 1) { JS_ReportError(cx, "Not enough parameters."); JS_EndRequest(cx); return JS_FALSE; } switch (argc) { case 3: JS_ValueToNumber(cx, argv[2], &timeout); case 2: JS_ValueToUint16(cx, argv[1], &flags); case 1: JS_ValueToInt32(cx, argv[0], &size); } TCPInformation* data = (TCPInformation*) JS_GetPrivate(cx, object); jsval jsConnected; JS_GetProperty(cx, object, "connected", &jsConnected); JSBool connected; JS_ValueToBoolean(cx, jsConnected, &connected); if (!connected) { JS_ReportError(cx, "The socket isn't connected."); JS_LeaveLocalRootScope(cx); JS_EndRequest(cx); return JS_FALSE; } char* string = (char*) JS_malloc(cx, size*sizeof(char)); jsrefcount req = JS_SuspendRequest(cx); int32 offset = 0; int32 received = 0; while (offset < size) { received = PR_Recv(data->socket, (string+offset), (size-offset)*sizeof(char), flags, (timeout == -1) ? PR_INTERVAL_NO_TIMEOUT : PR_MicrosecondsToInterval(timeout*1000000)); if (received == -1) { break; } offset += received; } JS_ResumeRequest(cx, req); if (received < 0) { switch (PR_GetError()) { default: JS_ReportError(cx, "Something went wrong."); break; } JS_EndRequest(cx); return JS_FALSE; } *rval = STRING_TO_JSVAL(JS_NewString(cx, string, offset)); JS_EndRequest(cx); return JS_TRUE; }