/************************************************************************ * SafeArrayDestroy (OLEAUT32.16) * * Destroy a SafeArray. * * PARAMS * psa [I] Array to destroy * * RETURNS * Success: S_OK. All resources used by the array are freed. * Failure: An HRESULT error code indicating the error. * * NOTES * See SafeArray. */ HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa) { TRACE("(%p)\n", psa); if(!psa) return S_OK; if(psa->cLocks > 0) return DISP_E_ARRAYISLOCKED; /* Native doesn't check to see if the free succeeds */ SafeArrayDestroyData(psa); SafeArrayDestroyDescriptor(psa); return S_OK; }
JSBool XPCDispConvert::JSArrayToCOMArray(XPCCallContext& ccx, JSObject *obj, VARIANT & var, nsresult& err) { err = NS_OK; jsuint len; if(!JS_GetArrayLength(ccx, obj, &len)) { // TODO: I think we should create a specific error for this err = NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY; return PR_FALSE; } // Create the safe array of variants and populate it SAFEARRAY * array = nsnull; VARIANT* varArray = 0; for(jsuint index = 0; index < len; ++index) { jsval val; if(JS_GetElement(ccx, obj, index, &val)) { if(!JSVAL_IS_VOID(val)) { if(!array) { // Create an array that starts at index, and has len // elements array = SafeArrayCreateVector(VT_VARIANT, index, len - index); if(!array) { err = NS_ERROR_OUT_OF_MEMORY; return JS_FALSE; } if(FAILED(SafeArrayAccessData(array, reinterpret_cast<void**>(&varArray)))) { err = NS_ERROR_FAILURE; return JS_FALSE; } } if(!JSToCOM(ccx, val, *varArray, err)) { SafeArrayUnaccessData(array); err = NS_ERROR_FAILURE; // This cleans up the elements as well SafeArrayDestroyData(array); return JS_FALSE; } } if(varArray) ++varArray; } } if(!array) { array = SafeArrayCreateVector(VT_VARIANT, 0, 0); if(!array) { err = NS_ERROR_OUT_OF_MEMORY; return JS_FALSE; } } else { SafeArrayUnaccessData(array); } var.vt = VT_ARRAY | VT_VARIANT; var.parray = array; return JS_TRUE; }
static bool ASCOM_Image(IDispatch *cam, usImage& Image, bool takeSubframe, const wxRect& subframe, EXCEPINFO *excep) { // returns true on error, false if OK DISPPARAMS dispParms; dispParms.cArgs = 0; dispParms.rgvarg = NULL; dispParms.cNamedArgs = 0; dispParms.rgdispidNamedArgs = NULL; Variant vRes; HRESULT hr; if (FAILED(hr = cam->Invoke(dispid_imagearray, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParms, &vRes, excep, NULL))) { LogExcep(hr, "invoke imagearray", *excep); return true; } SAFEARRAY *rawarray = vRes.parray; long ubound1, ubound2, lbound1, lbound2; SafeArrayGetUBound(rawarray, 1, &ubound1); SafeArrayGetUBound(rawarray, 2, &ubound2); SafeArrayGetLBound(rawarray, 1, &lbound1); SafeArrayGetLBound(rawarray, 2, &lbound2); long *rawdata; hr = SafeArrayAccessData(rawarray, (void**)&rawdata); if (hr != S_OK) { hr = SafeArrayDestroyData(rawarray); return true; } long xsize = ubound1 - lbound1 + 1; long ysize = ubound2 - lbound2 + 1; if ((xsize < ysize) && (Image.Size.GetWidth() > Image.Size.GetHeight())) // array has dim #'s switched, Tom.. { std::swap(xsize, ysize); } if (takeSubframe) { Image.Subframe = subframe; // Clear out the image Image.Clear(); int i = 0; for (int y = 0; y < subframe.height; y++) { unsigned short *dataptr = Image.ImageData + (y + subframe.y) * Image.Size.GetWidth() + subframe.x; for (int x = 0; x < subframe.width; x++, i++) *dataptr++ = (unsigned short) rawdata[i]; } } else { for (int i = 0; i < Image.NPixels; i++) Image.ImageData[i] = (unsigned short) rawdata[i]; } hr = SafeArrayUnaccessData(rawarray); hr = SafeArrayDestroyData(rawarray); return false; }