void FWebJSScripting::BindUObject(const FString& Name, UObject* Object, bool bIsPermanent) { CefRefPtr<CefDictionaryValue> Converted = ConvertObject(Object); if (bIsPermanent) { // Each object can only have one permanent binding if (BoundObjects[Object].bIsPermanent) { return; } // Existing permanent objects must be removed first if (PermanentUObjectsByName.Contains(Name)) { return; } BoundObjects[Object]={true, -1}; PermanentUObjectsByName.Add(Name, Object); } CefRefPtr<CefProcessMessage> SetValueMessage = CefProcessMessage::Create(TEXT("UE::SetValue")); CefRefPtr<CefListValue>MessageArguments = SetValueMessage->GetArgumentList(); CefRefPtr<CefDictionaryValue> Value = CefDictionaryValue::Create(); Value->SetString("name", *Name); Value->SetDictionary("value", Converted); Value->SetBool("permanent", bIsPermanent); MessageArguments->SetDictionary(0, Value); SendProcessMessage(SetValueMessage); }
CefRefPtr<CefDictionaryValue> FWebJSScripting::GetPermanentBindings() { CefRefPtr<CefDictionaryValue> Result = CefDictionaryValue::Create(); for(auto& Entry : PermanentUObjectsByName) { Result->SetDictionary(*Entry.Key, ConvertObject(Entry.Value)); } return Result; }
SEXP ConvertValue(bson_iter_t* iter){ if(BSON_ITER_HOLDS_INT32(iter)){ return ScalarInteger(bson_iter_int32(iter)); } else if(BSON_ITER_HOLDS_NULL(iter)){ return R_NilValue; } else if(BSON_ITER_HOLDS_BOOL(iter)){ return ScalarLogical(bson_iter_bool(iter)); } else if(BSON_ITER_HOLDS_DOUBLE(iter)){ return ScalarReal(bson_iter_double(iter)); } else if(BSON_ITER_HOLDS_INT64(iter)){ return ScalarReal((double) bson_iter_int64(iter)); } else if(BSON_ITER_HOLDS_UTF8(iter)){ return mkStringUTF8(bson_iter_utf8(iter, NULL)); } else if(BSON_ITER_HOLDS_CODE(iter)){ return mkStringUTF8(bson_iter_code(iter, NULL)); } else if(BSON_ITER_HOLDS_BINARY(iter)){ return ConvertBinary(iter); } else if(BSON_ITER_HOLDS_DATE_TIME(iter)){ return ConvertDate(iter); } else if(BSON_ITER_HOLDS_OID(iter)){ const bson_oid_t *val = bson_iter_oid(iter); char str[25]; bson_oid_to_string(val, str); return mkString(str); } else if(BSON_ITER_HOLDS_ARRAY(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertArray(&child1, &child2); } else if(BSON_ITER_HOLDS_DOCUMENT(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertObject(&child1, &child2); } else { stop("Unimplemented BSON type %d\n", bson_iter_type(iter)); } }
SEXP ConvertValue(bson_iter_t* iter){ if(BSON_ITER_HOLDS_INT32(iter)){ return ScalarInteger(bson_iter_int32(iter)); } else if(BSON_ITER_HOLDS_NULL(iter)){ return R_NilValue; } else if(BSON_ITER_HOLDS_BOOL(iter)){ return ScalarLogical(bson_iter_bool(iter)); } else if(BSON_ITER_HOLDS_DOUBLE(iter)){ return ScalarReal(bson_iter_double(iter)); } else if(BSON_ITER_HOLDS_INT64(iter)){ return ScalarReal((double) bson_iter_int64(iter)); } else if(BSON_ITER_HOLDS_UTF8(iter)){ return mkStringUTF8(bson_iter_utf8(iter, NULL)); } else if(BSON_ITER_HOLDS_CODE(iter)){ return mkStringUTF8(bson_iter_code(iter, NULL)); } else if(BSON_ITER_HOLDS_BINARY(iter)){ return ConvertBinary(iter); } else if(BSON_ITER_HOLDS_DATE_TIME(iter)){ return ConvertDate(iter); } else if(BSON_ITER_HOLDS_OID(iter)){ //not sure if this casting works return mkRaw((unsigned char *) bson_iter_oid(iter), 12); } else if(BSON_ITER_HOLDS_ARRAY(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertArray(&child1, &child2); } else if(BSON_ITER_HOLDS_DOCUMENT(iter)){ bson_iter_t child1; bson_iter_t child2; bson_iter_recurse (iter, &child1); bson_iter_recurse (iter, &child2); return ConvertObject(&child1, &child2); } else { stop("Unimplemented BSON type %d\n", bson_iter_type(iter)); } }
int m_Convert(Object *in, Object *out) { Array incolorvec, outcolorvec; int ismap, isfield, count, i, ii, numitems, addpoints; char *colorstrin, *colorstrout; char newstrin[30], newstrout[30]; Object gout; float *dpin=NULL, *dpout=NULL; gout=NULL; incolorvec = NULL; outcolorvec = NULL; if (!in[0]) { DXSetError(ERROR_MISSING_DATA,"#10000","data"); return ERROR; } out[0] = in[0]; ismap = 0; isfield = 0; /* * if it's an array (vector or list of vectors) */ if (DXGetObjectClass(in[0]) == CLASS_ARRAY) { if (!(DXQueryParameter((Object)in[0], TYPE_FLOAT, 3, &numitems))) { /* must be a list of 3-vectors or a field */ DXSetError(ERROR_BAD_PARAMETER,"#10550","data"); out[0] = NULL; return ERROR; } if (!(incolorvec = DXNewArray(TYPE_FLOAT,CATEGORY_REAL, 1, 3))){ out[0] = NULL; return ERROR; } if (!(DXAddArrayData(incolorvec,0,numitems,NULL))) goto error; if (!(dpin = (float *)DXGetArrayData(incolorvec))) goto error; if (!(DXExtractParameter((Object)in[0], TYPE_FLOAT, 3, numitems, (Pointer)dpin))) { /* must be a list of 3-vectors or a field */ DXSetError(ERROR_BAD_PARAMETER,"#10550","data"); goto error; } /* * also make the output array */ if (!(outcolorvec = DXNewArray(TYPE_FLOAT,CATEGORY_REAL, 1, 3))) goto error; if (!(DXAddArrayData(outcolorvec,0,numitems,NULL))) goto error; if (!(dpout = (float *)DXGetArrayData(outcolorvec))) goto error; } else { if (_dxfIsColorMap(in[0])) ismap = 1; else { DXResetError(); isfield = 1; } } /* now extract the to and from space names */ /* get color name */ if (!(in[1])) colorstrin = "hsv"; else if (!DXExtractString((Object)in[1], &colorstrin)) { /* invalid input string */ DXSetError(ERROR_BAD_PARAMETER,"#10200","incolorspace"); goto error; } /* convert color name to all lower case and remove spaces */ count = 0; i = 0; while ( i<29 && colorstrin[i] != '\0') { if (isalpha(colorstrin[i])){ if (isupper(colorstrin[i])) newstrin[count]= tolower(colorstrin[i]); else newstrin[count]= colorstrin[i]; count++; } i++; } newstrin[count]='\0'; if (strcmp(newstrin,"rgb")&&strcmp(newstrin,"hsv")) { DXSetError(ERROR_BAD_PARAMETER,"#10210", newstrin, "incolorspace"); goto error; } if (!in[2]) colorstrout = "rgb"; else if (!DXExtractString((Object)in[2], &colorstrout)) { /* invalid outcolorspace string */ DXSetError(ERROR_BAD_PARAMETER,"#10200","outcolorspace"); goto error; } /* convert color name to all lower case and remove spaces */ count = 0; i = 0; while ( i<29 && colorstrout[i] != '\0') { if (isalpha(colorstrout[i])){ if (isupper(colorstrout[i])) newstrout[count]= tolower(colorstrout[i]); else newstrout[count]= colorstrout[i]; count++; } i++; } newstrout[count]='\0'; if (strcmp(newstrout,"rgb")&&strcmp(newstrout,"hsv")){ /* invalid outcolorspace string */ DXSetError(ERROR_BAD_PARAMETER,"#10210", newstrout, "outcolorspace"); goto error; } if (!strcmp(newstrin,newstrout)) { DXWarning("incolorspace and outcolorspace are the same"); return OK; } if (!in[3]) { /* default behavior is to treat maps like maps (adding points) and to treat fields like fields (not adding points) */ } else { if (!DXExtractInteger(in[3], &addpoints)) { DXSetError(ERROR_BAD_PARAMETER, "#10070", "addpoints"); goto error; } if ((addpoints < 0) || (addpoints > 1)) { DXSetError(ERROR_BAD_PARAMETER, "#10070", "addpoints"); goto error; } if (isfield && addpoints) { DXSetError(ERROR_BAD_PARAMETER, "#10370", "for a field with greater than 1D positions, addpoints", "0"); goto error; } if (ismap && (!addpoints)) { /* treat the map like a field */ ismap = 0; isfield = 1; } } /* we have been given a vector value or list of values, not a map */ if ((!ismap)&&(!isfield)) { if (!strcmp(newstrin,"hsv")) { for (ii = 0; ii < numitems*3; ii = ii+3) { if (!(_dxfHSVtoRGB(dpin[ii], dpin[ii+1], dpin[ii+2], &dpout[ii], &dpout[ii+1], &dpout[ii+2]))) goto error; } } else { for (ii = 0; ii < numitems*3; ii = ii+3) { if (!(_dxfRGBtoHSV(dpin[ii], dpin[ii+1], dpin[ii+2], &dpout[ii], &dpout[ii+1], &dpout[ii+2]))) goto error; } } out[0] = (Object)outcolorvec; DXDelete((Object)incolorvec); return OK; } /* we have a map or field */ else { if (ismap) { if (!(ConvertObject(in[0], newstrin, &gout))) goto error; } else { gout = DXCopy(in[0], COPY_STRUCTURE); if (!gout) goto error; if (!(ConvertFieldObject(gout, newstrin))) goto error; } out[0] = gout; return OK; } error: out[0] = NULL; DXDelete((Object)gout); DXDelete((Object)incolorvec); DXDelete((Object)outcolorvec); return ERROR; }