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))
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)
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
static void SAFEARRAY_SetHiddenDWORD(SAFEARRAY *psa, DWORD dw)
unsigned __int3264 UINT_PTR
static ULONG SAFEARRAY_GetCellCount(const SAFEARRAY *psa)
static const USHORT ignored_copy_features
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
struct tagVARIANT VARIANT
HRESULT WINAPI SafeArrayGetRecordInfo(SAFEARRAY *psa, IRecordInfo **pRinfo)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
HRESULT WINAPI SafeArrayCopyData(SAFEARRAY *psaSource, SAFEARRAY *psaTarget)
static SAFEARRAY * SAFEARRAY_Create(VARTYPE vt, UINT cDims, const SAFEARRAYBOUND *rgsabound, ULONG ulSize)
UINT WINAPI SysStringByteLen(BSTR str)
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
static void SAFEARRAY_SetFeatures(VARTYPE vt, SAFEARRAY *psa)
SAFEARRAY *WINAPI SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, ULONG cElements, LPVOID pvExtra)
static void SAFEARRAY_Free(void *ptr)
#define DISP_E_ARRAYISLOCKED
struct tagSAFEARRAY SAFEARRAY
const USHORT FADF_CREATEVECTOR
HRESULT WINAPI SafeArraySetIID(SAFEARRAY *psa, REFGUID guid)
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
static DWORD SAFEARRAY_GetHiddenDWORD(SAFEARRAY *psa)
REFIID LPVOID DWORD_PTR dw
HRESULT WINAPI SafeArrayPtrOfIndex(SAFEARRAY *psa, LONG *rgIndices, void **ppvData)
_In_ ULONG _In_opt_ PVOID pvData
static HRESULT SAFEARRAY_AllocDescriptor(ULONG ulSize, SAFEARRAY **ppsaOut)
static HRESULT SAFEARRAY_CopyData(SAFEARRAY *psa, SAFEARRAY *dest)
HRESULT WINAPI SafeArraySetRecordInfo(SAFEARRAY *psa, IRecordInfo *pRinfo)
HRESULT WINAPI SafeArrayLock(SAFEARRAY *psa)
BSTR WINAPI DECLSPEC_HOTPATCH SysAllocStringByteLen(LPCSTR str, UINT len)
HRESULT WINAPI SafeArrayUnlock(SAFEARRAY *psa)
SAFEARRAY *WINAPI SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound, LPVOID pvExtra)
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
HRESULT WINAPI SafeArrayAllocData(SAFEARRAY *psa)
#define SAFEARRAY_HIDDEN_SIZE
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
SAFEARRAY *WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements)
HRESULT WINAPI BstrFromVector(SAFEARRAY *psa, BSTR *pbstr)
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
#define InterlockedDecrement
WINE_DEFAULT_DEBUG_CHANNEL(variant)
HRESULT WINAPI VectorFromBstr(BSTR bstr, SAFEARRAY **ppsa)
static HRESULT SAFEARRAY_DestroyData(SAFEARRAY *psa, ULONG ulStartCell)
#define memcpy(s1, s2, n)
HRESULT WINAPI SafeArrayRedim(SAFEARRAY *psa, SAFEARRAYBOUND *psabound)
HRESULT WINAPI SafeArrayDestroyData(SAFEARRAY *psa)
HRESULT WINAPI SafeArrayDestroyDescriptor(SAFEARRAY *psa)
SAFEARRAY *WINAPI SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound)
HRESULT WINAPI SafeArrayGetIID(SAFEARRAY *psa, GUID *pGuid)
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
#define InterlockedIncrement
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
UINT WINAPI SafeArrayGetElemsize(SAFEARRAY *psa)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
HRESULT WINAPI SafeArrayAllocDescriptorEx(VARTYPE vt, UINT cDims, SAFEARRAY **ppsaOut)
HRESULT WINAPI SafeArrayGetVartype(SAFEARRAY *psa, VARTYPE *pvt)
static DWORD SAFEARRAY_GetVTSize(VARTYPE vt)
static SCRIPT_CACHE SCRIPT_ANALYSIS * psa
HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
static void * SAFEARRAY_Malloc(ULONG size)
static SAFEARRAY * SAFEARRAY_CreateVector(VARTYPE vt, LONG lLbound, ULONG cElements, ULONG ulSize)
HRESULT WINAPI SafeArrayAllocDescriptor(UINT cDims, SAFEARRAY **ppsaOut)
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)