84#define SAFEARRAY_HIDDEN_SIZE sizeof(GUID)
166 ULONG ulNumCells = 1;
236 for (
i = 0;
i < cDims;
i++)
289 if (ulStartCell > ulCellCount) {
290 FIXME(
"unexpected ulCellCount %ld, start %ld\n", ulCellCount, ulStartCell);
294 ulCellCount -= ulStartCell;
296 if (psa->
fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
303 IUnknown_Release(*lpUnknown);
316 IRecordInfo_RecordClear(lpRecInfo, pRecordData);
319 IRecordInfo_Release(lpRecInfo);
340 if (
FAILED(hRet))
FIXME(
"VariantClear of element failed!\n");
375 if (
FAILED(hRet))
FIXME(
"VariantCopy failed with %#lx, element %lu.\n", hRet, ulCellCount);
407 while (ulCellCount--)
410 hr = IRecordInfo_RecordCopy(
record, src_data, dest_data);
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);
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: %lu 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;
561 TRACE(
"(%p)\n", psa);
572 TRACE(
"%lu bytes allocated for data at %p (%lu objects).\n",
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, %ld, %lu.\n", debugstr_vt(
vt), lLbound, cElements);
711 TRACE(
"%s, %ld, %lu, %p.\n", debugstr_vt(
vt), lLbound, cElements, pvExtra);
717 IRecordInfo_GetSize(iRecInfo, &ulSize);
757 TRACE(
"(%p)\n", psa);
799 TRACE(
"(%p)\n", psa);
806 if (ulLocks > 0xffff)
808 WARN(
"Out of locks!\n");
833 TRACE(
"(%p)\n", psa);
840 WARN(
"Unlocked but no lock held!\n");
870 if (!psa || !rgIndices)
889 if (
FAILED(hRet))
FIXME(
"VariantCopy failed with %#lx.\n", hRet);
894 BSTR* lpDest = lpvDest;
902 else if (psa->
fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
908 IUnknown_AddRef(lpUnknown);
910 IUnknown_Release(*lpDest);
919 IRecordInfo_Release(
record);
953 if (!psa || !rgIndices || !
pvData)
974 if (
FAILED(hRet))
FIXME(
"VariantCopy failed with %#lx.\n", hRet);
978 BSTR* lpBstr = lpvSrc;
990 else if (psa->
fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
996 IUnknown_AddRef(*src_unk);
997 *dest_unk = *src_unk;
1005 IRecordInfo_Release(
record);
1035 TRACE(
"(%p,%d,%p)\n", psa, nDim, plUbound);
1037 if (!psa || !plUbound)
1040 if(!nDim || nDim > psa->
cDims)
1068 TRACE(
"(%p,%d,%p)\n", psa, nDim, plLbound);
1070 if (!psa || !plLbound)
1073 if(!nDim || nDim > psa->
cDims)
1096 TRACE(
"(%p) returning %d\n", psa, psa ? psa->
cDims : 0
u);
1097 return psa ? psa->
cDims : 0;
1141 TRACE(
"(%p,%p)\n", psa, ppvData);
1143 if(!psa || !ppvData)
1170 TRACE(
"(%p)\n", psa);
1197 ULONG cell = 0, dimensionSize = 1;
1201 TRACE(
"(%p,%p,%p)\n", psa, rgIndices, ppvData);
1211 if (!psa || !rgIndices || !ppvData)
1220 for (dim = 1; dim < psa->
cDims; dim++)
1227 *rgIndices < psab->lLbound ||
1231 cell += (*rgIndices - psab->
lLbound) * dimensionSize;
1260 TRACE(
"(%p)\n", psa);
1316 TRACE(
"(%p,%p)\n", psaSource, psaTarget);
1318 if (!psaSource || !psaTarget ||
1324 for (dim = psaSource->
cDims - 1; dim >= 0 ; dim--)
1349 TRACE(
"(%p)\n", psa);
1383 TRACE(
"(%p,%p)\n", psa, ppsaOut);
1396 if (psa->
fFeatures & (FADF_RECORD|FADF_HAVEIID|FADF_HAVEVARTYPE))
1409 (*ppsaOut)->fFeatures = psa->
fFeatures & ~ignored_copy_features;
1420 if (!(*ppsaOut)->pvData)
1461 TRACE(
"(%p,%p)\n", psa, psabound);
1463 if (!psa || !psabound)
1488 ULONG ulOldSize, ulNewSize;
1536 TRACE(
"(%p,%p)\n", psa, pvt);
1543 else if ((psa->
fFeatures & (FADF_HAVEIID|FADF_DISPATCH)) == (FADF_HAVEIID|FADF_DISPATCH))
1547 else if (psa->
fFeatures & FADF_HAVEVARTYPE)
1578 TRACE(
"(%p,%p)\n", psa, pRinfo);
1580 if (!psa || !(psa->
fFeatures & FADF_RECORD))
1584 IRecordInfo_AddRef(pRinfo);
1587 IRecordInfo_Release(
dest[-1]);
1613 TRACE(
"(%p,%p)\n", psa, pRinfo);
1615 if (!psa || !pRinfo || !(psa->
fFeatures & FADF_RECORD))
1621 IRecordInfo_AddRef(*pRinfo);
1674 TRACE(
"(%p,%p)\n", psa, pGuid);
1676 if (!psa || !pGuid || !(psa->
fFeatures & FADF_HAVEIID))
1703 TRACE(
"(%p,%p)\n", bstr, ppsa);
1742 TRACE(
"(%p,%p)\n", psa, pbstr);
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void *WINAPI CoTaskMemAlloc(SIZE_T size)
void WINAPI CoTaskMemFree(void *ptr)
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
REFIID LPVOID DWORD_PTR dw
#define memcpy(s1, s2, n)
const USHORT FADF_CREATEVECTOR
unsigned __int3264 UINT_PTR
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
UINT WINAPI SysStringByteLen(BSTR str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
BSTR WINAPI DECLSPEC_HOTPATCH SysAllocStringByteLen(LPCSTR str, UINT len)
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc)
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
#define DISP_E_ARRAYISLOCKED