84#define SAFEARRAY_HIDDEN_SIZE sizeof(GUID)
166 ULONG ulNumCells = 1;
200 psa->fFeatures = FADF_HAVEIID;
205 psa->fFeatures = FADF_HAVEIID;
209 psa->fFeatures = FADF_RECORD;
212 psa->fFeatures = FADF_HAVEVARTYPE;
230 case VT_BSTR:
psa->fFeatures |= FADF_BSTR;
break;
236 for (
i = 0;
i < cDims;
i++)
240 psa->cbElements = ulSize;
266 psa->cbElements = ulSize;
267 psa->rgsabound[0].cElements = cElements;
268 psa->rgsabound[0].lLbound = lLbound;
272 case VT_BSTR:
psa->fFeatures |= FADF_BSTR;
break;
285 if (
psa->pvData && !(
psa->fFeatures & FADF_DATADELETED))
289 if (ulStartCell > ulCellCount) {
290 FIXME(
"unexpected ulCellCount %d, start %d\n",ulCellCount,ulStartCell);
294 ulCellCount -= ulStartCell;
296 if (
psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
303 IUnknown_Release(*lpUnknown);
307 else if (
psa->fFeatures & FADF_RECORD)
316 IRecordInfo_RecordClear(lpRecInfo, pRecordData);
317 pRecordData +=
psa->cbElements;
319 IRecordInfo_Release(lpRecInfo);
322 else if (
psa->fFeatures & FADF_BSTR)
332 else if (
psa->fFeatures & FADF_VARIANT)
340 if (
FAILED(hRet))
FIXME(
"VariantClear of element failed!\n");
356 if (!
dest->pvData ||
psa->fFeatures & FADF_DATADELETED)
364 if (
psa->fFeatures & FADF_VARIANT)
375 if (
FAILED(hRet))
FIXME(
"VariantCopy failed with 0x%08x, element %u\n", hRet, ulCellCount);
380 else if (
psa->fFeatures & FADF_BSTR)
400 else if (
psa->fFeatures & FADF_RECORD)
407 while (ulCellCount--)
410 hr = IRecordInfo_RecordCopy(
record, src_data, dest_data);
412 src_data +=
psa->cbElements;
413 dest_data +=
psa->cbElements;
419 dest->cbElements =
psa->cbElements;
420 IRecordInfo_Release(
record);
422 else if (
psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
428 while (ulCellCount--)
431 IUnknown_Release(*dest_unk);
432 *dest_unk = *src_unk;
434 IUnknown_AddRef(*dest_unk);
445 if (
psa->fFeatures & FADF_HAVEIID)
451 else if (
psa->fFeatures & FADF_HAVEVARTYPE)
481 TRACE(
"(%d,%p)\n", cDims, ppsaOut);
483 if (!cDims || cDims >= 0x10000)
496 (*ppsaOut)->cDims = cDims;
498 TRACE(
"(%d): %u bytes allocated for descriptor.\n", cDims, allocSize);
526 TRACE(
"(%s,%u,%p)\n", debugstr_vt(
vt), cDims, ppsaOut);
530 WARN(
"Creating a descriptor with an invalid VARTYPE!\n");
537 (*ppsaOut)->cbElements = cbElements;
572 TRACE(
"%u bytes allocated for data at %p (%u objects).\n",
573 ulSize *
psa->cbElements,
psa->pvData, ulSize);
602 TRACE(
"(%s,%u,%p)\n", debugstr_vt(
vt), cDims, rgsabound);
634 TRACE(
"(%s,%u,%p,%p)\n", debugstr_vt(
vt), cDims, rgsabound, pvExtra);
640 IRecordInfo_GetSize(iRecInfo, &ulSize);
679 TRACE(
"(%s,%d,%u)\n", debugstr_vt(
vt), lLbound, cElements);
711 TRACE(
"(%s,%d,%u,%p)\n", debugstr_vt(
vt), lLbound, cElements, pvExtra);
717 IRecordInfo_GetSize(iRecInfo, &ulSize);
766 if (
psa->fFeatures & FADF_RECORD)
770 !(
psa->fFeatures & FADF_DATADELETED))
806 if (ulLocks > 0xffff)
808 WARN(
"Out of locks!\n");
840 WARN(
"Unlocked but no lock held!\n");
870 if (!
psa || !rgIndices)
883 if (
psa->fFeatures & FADF_VARIANT)
889 if (
FAILED(hRet))
FIXME(
"VariantCopy failed with 0x%x\n", hRet);
891 else if (
psa->fFeatures & FADF_BSTR)
894 BSTR* lpDest = lpvDest;
902 else if (
psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
908 IUnknown_AddRef(lpUnknown);
910 IUnknown_Release(*lpDest);
913 else if (
psa->fFeatures & FADF_RECORD)
919 IRecordInfo_Release(
record);
966 if (
psa->fFeatures & FADF_VARIANT)
974 if (
FAILED(hRet))
FIXME(
"VariantCopy failed with 0x%x\n", hRet);
976 else if (
psa->fFeatures & FADF_BSTR)
978 BSTR* lpBstr = lpvSrc;
990 else if (
psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
996 IUnknown_AddRef(*src_unk);
997 *dest_unk = *src_unk;
999 else if (
psa->fFeatures & FADF_RECORD)
1005 IRecordInfo_Release(
record);
1035 TRACE(
"(%p,%d,%p)\n",
psa, nDim, plUbound);
1037 if (!
psa || !plUbound)
1040 if(!nDim || nDim >
psa->cDims)
1043 *plUbound =
psa->rgsabound[
psa->cDims - nDim].lLbound +
1044 psa->rgsabound[
psa->cDims - nDim].cElements - 1;
1068 TRACE(
"(%p,%d,%p)\n",
psa, nDim, plLbound);
1070 if (!
psa || !plLbound)
1073 if(!nDim || nDim >
psa->cDims)
1076 *plLbound =
psa->rgsabound[
psa->cDims - nDim].lLbound;
1097 return psa ?
psa->cDims : 0;
1117 return psa ?
psa->cbElements : 0;
1143 if(!
psa || !ppvData)
1197 ULONG cell = 0, dimensionSize = 1;
1201 TRACE(
"(%p,%p,%p)\n",
psa, rgIndices, ppvData);
1211 if (!
psa || !rgIndices || !ppvData)
1214 psab =
psa->rgsabound +
psa->cDims - 1;
1220 for (dim = 1; dim <
psa->cDims; dim++)
1227 *rgIndices < psab->lLbound ||
1231 cell += (*rgIndices - psab->
lLbound) * dimensionSize;
1235 cell += (c1 -
psa->rgsabound[
psa->cDims - 1].lLbound);
1237 *ppvData = (
char*)
psa->pvData + cell *
psa->cbElements;
1275 if (
psa->fFeatures & FADF_STATIC)
1287 psa->fFeatures |= FADF_DATADELETED;
1316 TRACE(
"(%p,%p)\n", psaSource, psaTarget);
1318 if (!psaSource || !psaTarget ||
1324 for (dim = psaSource->
cDims - 1; dim >= 0 ; dim--)
1393 if (!
psa->cbElements)
1396 if (
psa->fFeatures & (FADF_RECORD|FADF_HAVEIID|FADF_HAVEVARTYPE))
1409 (*ppsaOut)->fFeatures =
psa->fFeatures & ~ignored_copy_features;
1410 (*ppsaOut)->cbElements =
psa->cbElements;
1420 if (!(*ppsaOut)->pvData)
1463 if (!
psa ||
psa->fFeatures & FADF_FIXEDSIZE || !psabound)
1466 if (
psa->cLocks > 0)
1473 oldBounds =
psa->rgsabound;
1488 ULONG ulOldSize, ulNewSize;
1507 memcpy(pvNewData,
psa->pvData, ulOldSize);
1509 psa->pvData = pvNewData;
1541 if (
psa->fFeatures & FADF_RECORD)
1543 else if ((
psa->fFeatures & (FADF_HAVEIID|FADF_DISPATCH)) == (FADF_HAVEIID|FADF_DISPATCH))
1545 else if (
psa->fFeatures & FADF_HAVEIID)
1547 else if (
psa->fFeatures & FADF_HAVEVARTYPE)
1580 if (!
psa || !(
psa->fFeatures & FADF_RECORD))
1584 IRecordInfo_AddRef(pRinfo);
1587 IRecordInfo_Release(
dest[-1]);
1615 if (!
psa || !pRinfo || !(
psa->fFeatures & FADF_RECORD))
1621 IRecordInfo_AddRef(*pRinfo);
1647 if (!
psa || !
guid || !(
psa->fFeatures & FADF_HAVEIID))
1676 if (!
psa || !pGuid || !(
psa->fFeatures & FADF_HAVEIID))
1703 TRACE(
"(%p,%p)\n", bstr, ppsa);
1749 if (!
psa ||
psa->cbElements != 1 ||
psa->cDims != 1)
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
struct tagVARIANT VARIANT
struct tagSAFEARRAY SAFEARRAY
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
static ULONG SAFEARRAY_GetCellCount(const SAFEARRAY *psa)
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
HRESULT WINAPI SafeArrayDestroyDescriptor(SAFEARRAY *psa)
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
static SAFEARRAY * SAFEARRAY_Create(VARTYPE vt, UINT cDims, const SAFEARRAYBOUND *rgsabound, ULONG ulSize)
static void SAFEARRAY_Free(void *ptr)
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
HRESULT WINAPI SafeArrayUnlock(SAFEARRAY *psa)
HRESULT WINAPI SafeArrayAllocDescriptorEx(VARTYPE vt, UINT cDims, SAFEARRAY **ppsaOut)
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
static void SAFEARRAY_SetHiddenDWORD(SAFEARRAY *psa, DWORD dw)
HRESULT WINAPI VectorFromBstr(BSTR bstr, SAFEARRAY **ppsa)
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
SAFEARRAY *WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements)
HRESULT WINAPI SafeArrayGetIID(SAFEARRAY *psa, GUID *pGuid)
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
HRESULT WINAPI SafeArrayDestroyData(SAFEARRAY *psa)
SAFEARRAY *WINAPI SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, ULONG cElements, LPVOID pvExtra)
#define SAFEARRAY_HIDDEN_SIZE
UINT WINAPI SafeArrayGetElemsize(SAFEARRAY *psa)
HRESULT WINAPI BstrFromVector(SAFEARRAY *psa, BSTR *pbstr)
static HRESULT SAFEARRAY_DestroyData(SAFEARRAY *psa, ULONG ulStartCell)
HRESULT WINAPI SafeArrayAllocDescriptor(UINT cDims, SAFEARRAY **ppsaOut)
static HRESULT SAFEARRAY_CopyData(SAFEARRAY *psa, SAFEARRAY *dest)
HRESULT WINAPI SafeArrayGetRecordInfo(SAFEARRAY *psa, IRecordInfo **pRinfo)
static void * SAFEARRAY_Malloc(ULONG size)
static DWORD SAFEARRAY_GetVTSize(VARTYPE vt)
HRESULT WINAPI SafeArrayPtrOfIndex(SAFEARRAY *psa, LONG *rgIndices, void **ppvData)
HRESULT WINAPI SafeArraySetRecordInfo(SAFEARRAY *psa, IRecordInfo *pRinfo)
SAFEARRAY *WINAPI SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound, LPVOID pvExtra)
static HRESULT SAFEARRAY_AllocDescriptor(ULONG ulSize, SAFEARRAY **ppsaOut)
HRESULT WINAPI SafeArrayLock(SAFEARRAY *psa)
static DWORD SAFEARRAY_GetHiddenDWORD(SAFEARRAY *psa)
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
static const USHORT ignored_copy_features
HRESULT WINAPI SafeArrayRedim(SAFEARRAY *psa, SAFEARRAYBOUND *psabound)
SAFEARRAY *WINAPI SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound)
HRESULT WINAPI SafeArrayCopyData(SAFEARRAY *psaSource, SAFEARRAY *psaTarget)
HRESULT WINAPI SafeArrayAllocData(SAFEARRAY *psa)
HRESULT WINAPI SafeArraySetIID(SAFEARRAY *psa, REFGUID guid)
HRESULT WINAPI SafeArrayGetVartype(SAFEARRAY *psa, VARTYPE *pvt)
static SAFEARRAY * SAFEARRAY_CreateVector(VARTYPE vt, LONG lLbound, ULONG cElements, ULONG ulSize)
HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
static void SAFEARRAY_SetFeatures(VARTYPE vt, SAFEARRAY *psa)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
VOID WINAPI CoTaskMemFree(LPVOID ptr)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
REFIID LPVOID DWORD_PTR dw
#define memcpy(s1, s2, n)
const USHORT FADF_CREATEVECTOR
static SCRIPT_CACHE SCRIPT_ANALYSIS * psa
unsigned __int3264 UINT_PTR
UINT WINAPI SysStringByteLen(BSTR str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
BSTR WINAPI DECLSPEC_HOTPATCH SysAllocStringByteLen(LPCSTR str, UINT len)
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
_In_ ULONG _In_opt_ PVOID pvData
#define DISP_E_ARRAYISLOCKED