static inline HRESULT enumvar_get_next_item(EnumeratorInstance *This) { HRESULT hres; VARIANT nextitem; if (This->atend) return S_OK; /* dont leak pervious value */ jsval_release(This->item); /* not at end ... get next item */ VariantInit(&nextitem); hres = IEnumVARIANT_Next(This->enumvar, 1, &nextitem, NULL); if (hres == S_OK) { hres = variant_to_jsval(&nextitem, &This->item); VariantClear(&nextitem); if (FAILED(hres)) { WARN("failed to convert jsval to variant!"); This->item = jsval_undefined(); return hres; } } else { This->item = jsval_undefined(); This->atend = TRUE; } return S_OK; }
static HRESULT VBArray_toArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray; jsdisp_t *array; jsval_t val; VARIANT *v; int i, size = 1, ubound, lbound; HRESULT hres; TRACE("\n"); vbarray = vbarray_this(vthis); if(!vbarray) return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL); for(i=1; i<=SafeArrayGetDim(vbarray->safearray); i++) { SafeArrayGetLBound(vbarray->safearray, i, &lbound); SafeArrayGetUBound(vbarray->safearray, i, &ubound); size *= ubound-lbound+1; } hres = SafeArrayAccessData(vbarray->safearray, (void**)&v); if(FAILED(hres)) return hres; hres = create_array(ctx, 0, &array); if(FAILED(hres)) { SafeArrayUnaccessData(vbarray->safearray); return hres; } for(i=0; i<size; i++) { hres = variant_to_jsval(v, &val); if(SUCCEEDED(hres)) { hres = jsdisp_propput_idx(array, i, val); jsval_release(val); } if(FAILED(hres)) { SafeArrayUnaccessData(vbarray->safearray); jsdisp_release(array); return hres; } v++; } SafeArrayUnaccessData(vbarray->safearray); if(r) *r = jsval_obj(array); else jsdisp_release(array); return S_OK; }
static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { VBArrayInstance *vbarray; int i, *indexes; VARIANT out; HRESULT hres; TRACE("\n"); vbarray = vbarray_this(vthis); if(!vbarray) return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL); if(argc < SafeArrayGetDim(vbarray->safearray)) return throw_range_error(ctx, JS_E_SUBSCRIPT_OUT_OF_RANGE, NULL); indexes = heap_alloc(sizeof(int)*argc); if(!indexes) return E_OUTOFMEMORY; for(i=0; i<argc; i++) { hres = to_int32(ctx, argv[i], indexes+i); if(FAILED(hres)) { heap_free(indexes); return hres; } } hres = SafeArrayGetElement(vbarray->safearray, indexes, (void*)&out); heap_free(indexes); if(hres == DISP_E_BADINDEX) return throw_range_error(ctx, JS_E_SUBSCRIPT_OUT_OF_RANGE, NULL); else if(FAILED(hres)) return hres; if(r) { hres = variant_to_jsval(&out, r); VariantClear(&out); } return hres; }
HRESULT variant_change_type(script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTYPE vt) { jsval_t val; HRESULT hres; clear_ei(ctx); hres = variant_to_jsval(src, &val); if(FAILED(hres)) return hres; switch(vt) { case VT_I2: case VT_I4: { INT i; hres = to_int32(ctx, val, &i); if(SUCCEEDED(hres)) { if(vt == VT_I4) V_I4(dst) = i; else V_I2(dst) = i; } break; } case VT_R8: { double n; hres = to_number(ctx, val, &n); if(SUCCEEDED(hres)) V_R8(dst) = n; break; } case VT_R4: { double n; hres = to_number(ctx, val, &n); if(SUCCEEDED(hres)) V_R4(dst) = n; break; } case VT_BOOL: { BOOL b; hres = to_boolean(val, &b); if(SUCCEEDED(hres)) V_BOOL(dst) = b ? VARIANT_TRUE : VARIANT_FALSE; break; } case VT_BSTR: { jsstr_t *str; hres = to_string(ctx, val, &str); if(FAILED(hres)) break; if(str->length_flags & JSSTR_FLAG_NULLBSTR) { V_BSTR(dst) = NULL; break; } V_BSTR(dst) = SysAllocStringLen(str->str, jsstr_length(str)); if(!V_BSTR(dst)) hres = E_OUTOFMEMORY; break; } case VT_EMPTY: hres = V_VT(src) == VT_EMPTY ? S_OK : E_NOTIMPL; break; case VT_NULL: hres = V_VT(src) == VT_NULL ? S_OK : E_NOTIMPL; break; default: FIXME("vt %d not implemented\n", vt); hres = E_NOTIMPL; } jsval_release(val); if(FAILED(hres)) return hres; V_VT(dst) = vt; return S_OK; }