ReactOS 0.4.17-dev-540-g8f54750
recinfo.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "objbase.h"
#include "oaidl.h"
#include "oleauto.h"
#include "variant.h"
#include "wine/debug.h"
Include dependency graph for recinfo.c:

Go to the source code of this file.

Classes

struct  fieldstr
 
struct  IRecordInfoImpl
 

Macros

#define COBJMACROS
 
#define CASE_COPY(x)
 
#define CASE_COPY(x)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (ole)
 
static IRecordInfoImplimpl_from_IRecordInfo (IRecordInfo *iface)
 
static HRESULT copy_to_variant (void *src, VARIANT *pvar, enum VARENUM vt)
 
static HRESULT copy_from_variant (VARIANT *src, void *dest, enum VARENUM vt)
 
static HRESULT WINAPI IRecordInfoImpl_QueryInterface (IRecordInfo *iface, REFIID riid, void **ppvObject)
 
static ULONG WINAPI IRecordInfoImpl_AddRef (IRecordInfo *iface)
 
static ULONG WINAPI IRecordInfoImpl_Release (IRecordInfo *iface)
 
static HRESULT WINAPI IRecordInfoImpl_RecordInit (IRecordInfo *iface, PVOID pvNew)
 
static HRESULT WINAPI IRecordInfoImpl_RecordClear (IRecordInfo *iface, PVOID pvExisting)
 
static HRESULT WINAPI IRecordInfoImpl_RecordCopy (IRecordInfo *iface, void *src_rec, void *dest_rec)
 
static HRESULT WINAPI IRecordInfoImpl_GetGuid (IRecordInfo *iface, GUID *pguid)
 
static HRESULT WINAPI IRecordInfoImpl_GetName (IRecordInfo *iface, BSTR *pbstrName)
 
static HRESULT WINAPI IRecordInfoImpl_GetSize (IRecordInfo *iface, ULONG *pcbSize)
 
static HRESULT WINAPI IRecordInfoImpl_GetTypeInfo (IRecordInfo *iface, ITypeInfo **ppTypeInfo)
 
static HRESULT WINAPI IRecordInfoImpl_GetField (IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
 
static HRESULT WINAPI IRecordInfoImpl_GetFieldNoCopy (IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray)
 
static HRESULT WINAPI IRecordInfoImpl_PutField (IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
 
static HRESULT WINAPI IRecordInfoImpl_PutFieldNoCopy (IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
 
static HRESULT WINAPI IRecordInfoImpl_GetFieldNames (IRecordInfo *iface, ULONG *pcNames, BSTR *rgBstrNames)
 
static BOOL WINAPI IRecordInfoImpl_IsMatchingType (IRecordInfo *iface, IRecordInfo *info2)
 
static PVOID WINAPI IRecordInfoImpl_RecordCreate (IRecordInfo *iface)
 
static HRESULT WINAPI IRecordInfoImpl_RecordCreateCopy (IRecordInfo *iface, PVOID pvSource, PVOID *ppvDest)
 
static HRESULT WINAPI IRecordInfoImpl_RecordDestroy (IRecordInfo *iface, PVOID pvRecord)
 
HRESULT WINAPI GetRecordInfoFromGuids (REFGUID rGuidTypeLib, ULONG uVerMajor, ULONG uVerMinor, LCID lcid, REFGUID rGuidTypeInfo, IRecordInfo **ppRecInfo)
 
HRESULT WINAPI GetRecordInfoFromTypeInfo (ITypeInfo *pTI, IRecordInfo **ppRecInfo)
 

Variables

static const IRecordInfoVtbl IRecordInfoImplVtbl
 

Macro Definition Documentation

◆ CASE_COPY [1/2]

#define CASE_COPY (   x)
Value:
case VT_ ## x: \
memcpy(&V_ ## x(pvar), src, sizeof(V_ ## x(pvar))); \
break
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLenum src
Definition: glext.h:6340

◆ CASE_COPY [2/2]

#define CASE_COPY (   x)
Value:
case VT_ ## x: \
memcpy(dest, &V_ ## x(&var), sizeof(V_ ## x(&var))); \
break
const char * var
Definition: shader.c:5666
static char * dest
Definition: rtl.c:149

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file recinfo.c.

Function Documentation

◆ copy_from_variant()

static HRESULT copy_from_variant ( VARIANT src,
void dest,
enum VARENUM  vt 
)
static

Definition at line 98 of file recinfo.c.

99{
100 VARIANT var;
102
103 TRACE("(%p(%d) %p %d)\n", src, V_VT(src), dest, vt);
104
106 if(FAILED(hres))
107 return hres;
108
109#define CASE_COPY(x) \
110 case VT_ ## x: \
111 memcpy(dest, &V_ ## x(&var), sizeof(V_ ## x(&var))); \
112 break
113
114 switch(vt) {
115 CASE_COPY(I2);
116 CASE_COPY(I4);
117 CASE_COPY(R4);
118 CASE_COPY(R8);
119 CASE_COPY(CY);
125 CASE_COPY(I1);
126 CASE_COPY(UI1);
127 CASE_COPY(UI2);
128 CASE_COPY(UI4);
129 CASE_COPY(I8);
130 CASE_COPY(UI8);
131 CASE_COPY(INT);
135 default:
136 FIXME("Not supported type: %d\n", V_VT(&var));
137 return E_NOTIMPL;
138 };
139#undef CASE_COPY
140 return S_OK;
141}
@ R8
Definition: amd64_sup.c:13
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
double DATE
Definition: compat.h:2253
OLECHAR * BSTR
Definition: compat.h:2293
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
#define ERROR(name)
Definition: error_private.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned int UINT
Definition: sysinfo.c:13
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT hres
Definition: protocol.c:465
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
#define V_VT(A)
Definition: oleauto.h:211
#define CASE_COPY(x)
#define R4(v, w, x, y, z, i)
Definition: sha1.c:39
#define TRACE(s)
Definition: solgame.cpp:4
int32_t INT_PTR
Definition: typedefs.h:64
int32_t INT
Definition: typedefs.h:58
Definition: compat.h:2255
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:939

Referenced by IRecordInfoImpl_PutField().

◆ copy_to_variant()

static HRESULT copy_to_variant ( void src,
VARIANT pvar,
enum VARENUM  vt 
)
static

Definition at line 58 of file recinfo.c.

59{
60 TRACE("%p %p %d\n", src, pvar, vt);
61
62#define CASE_COPY(x) \
63 case VT_ ## x: \
64 memcpy(&V_ ## x(pvar), src, sizeof(V_ ## x(pvar))); \
65 break
66
67 switch(vt) {
68 CASE_COPY(I2);
69 CASE_COPY(I4);
78 CASE_COPY(I1);
79 CASE_COPY(UI1);
80 CASE_COPY(UI2);
81 CASE_COPY(UI4);
82 CASE_COPY(I8);
83 CASE_COPY(UI8);
88 default:
89 FIXME("Not supported type: %d\n", vt);
90 return E_NOTIMPL;
91 };
92#undef CASE_COPY
93
94 V_VT(pvar) = vt;
95 return S_OK;
96}

Referenced by IRecordInfoImpl_GetField().

◆ GetRecordInfoFromGuids()

HRESULT WINAPI GetRecordInfoFromGuids ( REFGUID  rGuidTypeLib,
ULONG  uVerMajor,
ULONG  uVerMinor,
LCID  lcid,
REFGUID  rGuidTypeInfo,
IRecordInfo **  ppRecInfo 
)

Definition at line 589 of file recinfo.c.

591{
592 ITypeInfo *pTypeInfo;
593 ITypeLib *pTypeLib;
595
596 TRACE("%s, %lu, %lu, %#lx, %s, %p.\n", debugstr_guid(rGuidTypeLib), uVerMajor, uVerMinor,
597 lcid, debugstr_guid(rGuidTypeInfo), ppRecInfo);
598
599 hres = LoadRegTypeLib(rGuidTypeLib, uVerMajor, uVerMinor, lcid, &pTypeLib);
600 if(FAILED(hres)) {
601 WARN("LoadRegTypeLib failed!\n");
602 return hres;
603 }
604
605 hres = ITypeLib_GetTypeInfoOfGuid(pTypeLib, rGuidTypeInfo, &pTypeInfo);
606 ITypeLib_Release(pTypeLib);
607 if(FAILED(hres)) {
608 WARN("GetTypeInfoOfGuid failed!\n");
609 return hres;
610 }
611
612 hres = GetRecordInfoFromTypeInfo(pTypeInfo, ppRecInfo);
613 ITypeInfo_Release(pTypeInfo);
614 return hres;
615}
#define WARN(fmt,...)
Definition: precomp.h:61
LCID lcid
Definition: locale.c:5660
HRESULT WINAPI LoadRegTypeLib(REFGUID rguid, WORD wVerMajor, WORD wVerMinor, LCID lcid, ITypeLib **ppTLib)
Definition: typelib.c:507
#define debugstr_guid
Definition: kernel32.h:35
HRESULT WINAPI GetRecordInfoFromTypeInfo(ITypeInfo *pTI, IRecordInfo **ppRecInfo)
Definition: recinfo.c:620

◆ GetRecordInfoFromTypeInfo()

HRESULT WINAPI GetRecordInfoFromTypeInfo ( ITypeInfo pTI,
IRecordInfo **  ppRecInfo 
)

Definition at line 620 of file recinfo.c.

620 {
622 TYPEATTR *typeattr;
624 ITypeInfo *pTypeInfo;
625 int i;
626 GUID guid;
627
628 TRACE("(%p %p)\n", pTI, ppRecInfo);
629
630 if(!pTI || !ppRecInfo)
631 return E_INVALIDARG;
632
633 hres = ITypeInfo_GetTypeAttr(pTI, &typeattr);
634 if(FAILED(hres) || !typeattr) {
635 WARN("GetTypeAttr failed: %#lx.\n", hres);
636 return hres;
637 }
638
639 if(typeattr->typekind == TKIND_ALIAS) {
640 hres = ITypeInfo_GetRefTypeInfo(pTI, typeattr->tdescAlias.hreftype, &pTypeInfo);
641 guid = typeattr->guid;
642 ITypeInfo_ReleaseTypeAttr(pTI, typeattr);
643 if(FAILED(hres)) {
644 WARN("GetRefTypeInfo failed: %#lx.\n", hres);
645 return hres;
646 }
647 hres = ITypeInfo_GetTypeAttr(pTypeInfo, &typeattr);
648 if(FAILED(hres)) {
649 ITypeInfo_Release(pTypeInfo);
650 WARN("GetTypeAttr failed for referenced type: %#lx.\n", hres);
651 return hres;
652 }
653 }else {
654 pTypeInfo = pTI;
655 ITypeInfo_AddRef(pTypeInfo);
656 guid = typeattr->guid;
657 }
658
659 if(typeattr->typekind != TKIND_RECORD) {
660 WARN("typekind != TKIND_RECORD\n");
661 ITypeInfo_ReleaseTypeAttr(pTypeInfo, typeattr);
662 ITypeInfo_Release(pTypeInfo);
663 return E_INVALIDARG;
664 }
665
666 ret = calloc(1, sizeof(*ret));
667 ret->IRecordInfo_iface.lpVtbl = &IRecordInfoImplVtbl;
668 ret->ref = 1;
669 ret->pTypeInfo = pTypeInfo;
670 ret->n_vars = typeattr->cVars;
671 ret->size = typeattr->cbSizeInstance;
672 ITypeInfo_ReleaseTypeAttr(pTypeInfo, typeattr);
673
674 ret->guid = guid;
675
676 /* NOTE: Windows implementation calls ITypeInfo::GetCantainingTypeLib and
677 * ITypeLib::GetLibAttr, but we currently don't need this.
678 */
679
680 hres = ITypeInfo_GetDocumentation(pTypeInfo, MEMBERID_NIL, &ret->name, NULL, NULL, NULL);
681 if(FAILED(hres)) {
682 WARN("ITypeInfo::GetDocumentation failed\n");
683 ret->name = NULL;
684 }
685
686 ret->fields = calloc(ret->n_vars, sizeof(fieldstr));
687 for(i = 0; i<ret->n_vars; i++) {
688 VARDESC *vardesc;
689 hres = ITypeInfo_GetVarDesc(pTypeInfo, i, &vardesc);
690 if(FAILED(hres)) {
691 WARN("GetVarDesc failed\n");
692 continue;
693 }
694 ret->fields[i].vt = vardesc->elemdescVar.tdesc.vt;
695 ret->fields[i].varkind = vardesc->varkind;
696 ret->fields[i].offset = vardesc->oInst;
697 hres = ITypeInfo_GetDocumentation(pTypeInfo, vardesc->memid, &ret->fields[i].name,
698 NULL, NULL, NULL);
699 if(FAILED(hres))
700 WARN("GetDocumentation failed: %#lx.\n", hres);
701 TRACE("field=%s, offset=%ld\n", debugstr_w(ret->fields[i].name), ret->fields[i].offset);
702 ITypeInfo_ReleaseVarDesc(pTypeInfo, vardesc);
703 }
704
705 *ppRecInfo = &ret->IRecordInfo_iface;
706
707 return S_OK;
708}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define NULL
Definition: types.h:112
GUID guid
Definition: version.c:147
return ret
Definition: mutex.c:146
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
Definition: glfuncs.h:248
#define debugstr_w
Definition: kernel32.h:32
#define MEMBERID_NIL
Definition: oleauto.h:1003
static const IRecordInfoVtbl IRecordInfoImplVtbl
Definition: recinfo.c:560
#define calloc
Definition: rosglue.h:14
@ TKIND_RECORD
Definition: widltypes.h:235
@ TKIND_ALIAS
Definition: widltypes.h:240

Referenced by GetRecordInfoFromGuids(), and test_recinfo().

◆ impl_from_IRecordInfo()

◆ IRecordInfoImpl_AddRef()

static ULONG WINAPI IRecordInfoImpl_AddRef ( IRecordInfo iface)
static

Definition at line 160 of file recinfo.c.

161{
164 TRACE("%p, refcount %lu.\n", iface, ref);
165 return ref;
166}
#define InterlockedIncrement
Definition: armddk.h:53
static IRecordInfoImpl * impl_from_IRecordInfo(IRecordInfo *iface)
Definition: recinfo.c:53
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ IRecordInfoImpl_GetField()

static HRESULT WINAPI IRecordInfoImpl_GetField ( IRecordInfo iface,
PVOID  pvData,
LPCOLESTR  szFieldName,
VARIANT pvarField 
)
static

Definition at line 390 of file recinfo.c.

392{
394 int i;
395
396 TRACE("(%p)->(%p %s %p)\n", This, pvData, debugstr_w(szFieldName), pvarField);
397
398 if(!pvData || !szFieldName || !pvarField)
399 return E_INVALIDARG;
400
401 for(i=0; i<This->n_vars; i++)
402 if(!wcscmp(This->fields[i].name, szFieldName))
403 break;
404 if(i == This->n_vars)
406
407 VariantClear(pvarField);
408 return copy_to_variant(((PBYTE)pvData)+This->fields[i].offset, pvarField,
409 This->fields[i].vt);
410}
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
BYTE * PBYTE
Definition: pedump.c:66
static HRESULT copy_to_variant(void *src, VARIANT *pvar, enum VARENUM vt)
Definition: recinfo.c:58
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
#define TYPE_E_FIELDNOTFOUND
Definition: winerror.h:3633

◆ IRecordInfoImpl_GetFieldNames()

static HRESULT WINAPI IRecordInfoImpl_GetFieldNames ( IRecordInfo iface,
ULONG pcNames,
BSTR rgBstrNames 
)
static

Definition at line 484 of file recinfo.c.

486{
488 ULONG n = This->n_vars, i;
489
490 TRACE("(%p)->(%p %p)\n", This, pcNames, rgBstrNames);
491
492 if(!pcNames)
493 return E_INVALIDARG;
494
495 if(*pcNames < n)
496 n = *pcNames;
497
498 if(rgBstrNames) {
499 for(i=0; i<n; i++)
500 rgBstrNames[i] = SysAllocString(This->fields[i].name);
501 }
502
503 *pcNames = n;
504 return S_OK;
505}
GLdouble n
Definition: glext.h:7729
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240

◆ IRecordInfoImpl_GetFieldNoCopy()

static HRESULT WINAPI IRecordInfoImpl_GetFieldNoCopy ( IRecordInfo iface,
PVOID  pvData,
LPCOLESTR  szFieldName,
VARIANT pvarField,
PVOID ppvDataCArray 
)
static

Definition at line 412 of file recinfo.c.

414{
416 int i;
417
418 TRACE("(%p)->(%p %s %p %p)\n", This, pvData, debugstr_w(szFieldName), pvarField, ppvDataCArray);
419
420 if(!pvData || !szFieldName || !pvarField)
421 return E_INVALIDARG;
422
423 for(i=0; i<This->n_vars; i++)
424 if(!wcscmp(This->fields[i].name, szFieldName))
425 break;
426 if(i == This->n_vars)
428
429 VariantClear(pvarField);
430 V_VT(pvarField) = VT_BYREF|This->fields[i].vt;
431 V_BYREF(pvarField) = ((PBYTE)pvData)+This->fields[i].offset;
432 *ppvDataCArray = NULL;
433 return S_OK;
434}
@ VT_BYREF
Definition: compat.h:2342
#define V_BYREF(A)
Definition: oleauto.h:228

◆ IRecordInfoImpl_GetGuid()

static HRESULT WINAPI IRecordInfoImpl_GetGuid ( IRecordInfo iface,
GUID pguid 
)
static

Definition at line 336 of file recinfo.c.

337{
339
340 TRACE("(%p)->(%p)\n", This, pguid);
341
342 if(!pguid)
343 return E_INVALIDARG;
344
345 *pguid = This->guid;
346 return S_OK;
347}

◆ IRecordInfoImpl_GetName()

static HRESULT WINAPI IRecordInfoImpl_GetName ( IRecordInfo iface,
BSTR pbstrName 
)
static

Definition at line 349 of file recinfo.c.

350{
352
353 TRACE("(%p)->(%p)\n", This, pbstrName);
354
355 if(!pbstrName)
356 return E_INVALIDARG;
357
358 *pbstrName = SysAllocString(This->name);
359 return S_OK;
360}

◆ IRecordInfoImpl_GetSize()

static HRESULT WINAPI IRecordInfoImpl_GetSize ( IRecordInfo iface,
ULONG pcbSize 
)
static

Definition at line 362 of file recinfo.c.

363{
365
366 TRACE("(%p)->(%p)\n", This, pcbSize);
367
368 if(!pcbSize)
369 return E_INVALIDARG;
370
371 *pcbSize = This->size;
372 return S_OK;
373}

◆ IRecordInfoImpl_GetTypeInfo()

static HRESULT WINAPI IRecordInfoImpl_GetTypeInfo ( IRecordInfo iface,
ITypeInfo **  ppTypeInfo 
)
static

Definition at line 375 of file recinfo.c.

376{
378
379 TRACE("(%p)->(%p)\n", This, ppTypeInfo);
380
381 if(!ppTypeInfo)
382 return E_INVALIDARG;
383
384 ITypeInfo_AddRef(This->pTypeInfo);
385 *ppTypeInfo = This->pTypeInfo;
386
387 return S_OK;
388}

◆ IRecordInfoImpl_IsMatchingType()

static BOOL WINAPI IRecordInfoImpl_IsMatchingType ( IRecordInfo iface,
IRecordInfo info2 
)
static

Definition at line 507 of file recinfo.c.

508{
510 GUID guid2;
511
512 TRACE( "(%p)->(%p)\n", This, info2 );
513
514 IRecordInfo_GetGuid( info2, &guid2 );
515 return IsEqualGUID( &This->guid, &guid2 );
516}
static GUID guid2
Definition: devinst.c:42
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147

◆ IRecordInfoImpl_PutField()

static HRESULT WINAPI IRecordInfoImpl_PutField ( IRecordInfo iface,
ULONG  wFlags,
PVOID  pvData,
LPCOLESTR  szFieldName,
VARIANT pvarField 
)
static

Definition at line 436 of file recinfo.c.

438{
440 int i;
441
442 TRACE("%p, %#lx, %p, %s, %p.\n", iface, wFlags, pvData, debugstr_w(szFieldName), pvarField);
443
444 if(!pvData || !szFieldName || !pvarField
445 || (wFlags != INVOKE_PROPERTYPUTREF && wFlags != INVOKE_PROPERTYPUT))
446 return E_INVALIDARG;
447
448 if(wFlags == INVOKE_PROPERTYPUTREF) {
449 FIXME("wFlag == INVOKE_PROPERTYPUTREF not supported\n");
450 return E_NOTIMPL;
451 }
452
453 for(i=0; i<This->n_vars; i++)
454 if(!wcscmp(This->fields[i].name, szFieldName))
455 break;
456 if(i == This->n_vars)
458
459 return copy_from_variant(pvarField, ((PBYTE)pvData)+This->fields[i].offset,
460 This->fields[i].vt);
461}
static HRESULT copy_from_variant(VARIANT *src, void *dest, enum VARENUM vt)
Definition: recinfo.c:98
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337

◆ IRecordInfoImpl_PutFieldNoCopy()

static HRESULT WINAPI IRecordInfoImpl_PutFieldNoCopy ( IRecordInfo iface,
ULONG  wFlags,
PVOID  pvData,
LPCOLESTR  szFieldName,
VARIANT pvarField 
)
static

Definition at line 463 of file recinfo.c.

465{
467 int i;
468
469 FIXME("%p, %#lx, %p, %s, %p stub\n", iface, wFlags, pvData, debugstr_w(szFieldName), pvarField);
470
471 if(!pvData || !szFieldName || !pvarField
472 || (wFlags != INVOKE_PROPERTYPUTREF && wFlags != INVOKE_PROPERTYPUT))
473 return E_INVALIDARG;
474
475 for(i=0; i<This->n_vars; i++)
476 if(!wcscmp(This->fields[i].name, szFieldName))
477 break;
478 if(i == This->n_vars)
480
481 return E_NOTIMPL;
482}

◆ IRecordInfoImpl_QueryInterface()

static HRESULT WINAPI IRecordInfoImpl_QueryInterface ( IRecordInfo iface,
REFIID  riid,
void **  ppvObject 
)
static

Definition at line 143 of file recinfo.c.

145{
146 TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppvObject);
147
148 *ppvObject = NULL;
149
150 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IRecordInfo, riid)) {
151 *ppvObject = iface;
152 IRecordInfo_AddRef(iface);
153 return S_OK;
154 }
155
156 FIXME("Not supported interface: %s\n", debugstr_guid(riid));
157 return E_NOINTERFACE;
158}
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ IRecordInfoImpl_RecordClear()

static HRESULT WINAPI IRecordInfoImpl_RecordClear ( IRecordInfo iface,
PVOID  pvExisting 
)
static

Definition at line 199 of file recinfo.c.

200{
202 int i;
203 PVOID var;
204
205 TRACE("(%p)->(%p)\n", This, pvExisting);
206
207 if(!pvExisting)
208 return E_INVALIDARG;
209
210 for(i=0; i<This->n_vars; i++) {
211 if(This->fields[i].varkind != VAR_PERINSTANCE) {
212 ERR("varkind != VAR_PERINSTANCE\n");
213 continue;
214 }
215 var = ((PBYTE)pvExisting)+This->fields[i].offset;
216 switch(This->fields[i].vt) {
217 case VT_BSTR:
219 *(BSTR*)var = NULL;
220 break;
221 case VT_I2:
222 case VT_I4:
223 case VT_R4:
224 case VT_R8:
225 case VT_CY:
226 case VT_DATE:
227 case VT_ERROR:
228 case VT_BOOL:
229 case VT_DECIMAL:
230 case VT_I1:
231 case VT_UI1:
232 case VT_UI2:
233 case VT_UI4:
234 case VT_I8:
235 case VT_UI8:
236 case VT_INT:
237 case VT_UINT:
238 case VT_HRESULT:
239 break;
240 case VT_INT_PTR:
241 case VT_UINT_PTR:
242 *(void**)var = NULL;
243 break;
244 case VT_SAFEARRAY:
246 break;
247 case VT_UNKNOWN:
248 case VT_DISPATCH:
249 {
250 IUnknown *unk = *(IUnknown**)var;
251 if (unk)
252 IUnknown_Release(unk);
253 *(void**)var = NULL;
254 break;
255 }
256 default:
257 FIXME("Not supported vt = %d\n", This->fields[i].vt);
258 break;
259 }
260 }
261
262 return S_OK;
263}
#define ERR(fmt,...)
Definition: precomp.h:57
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_INT
Definition: compat.h:2316
@ VT_R4
Definition: compat.h:2299
@ VT_UINT_PTR
Definition: compat.h:2328
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_UI2
Definition: compat.h:2312
@ VT_DECIMAL
Definition: compat.h:2309
@ VT_ERROR
Definition: compat.h:2305
@ VT_SAFEARRAY
Definition: compat.h:2321
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_I8
Definition: compat.h:2314
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_HRESULT
Definition: compat.h:2319
@ VT_INT_PTR
Definition: compat.h:2327
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_UINT
Definition: compat.h:2317
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273

◆ IRecordInfoImpl_RecordCopy()

static HRESULT WINAPI IRecordInfoImpl_RecordCopy ( IRecordInfo iface,
void src_rec,
void dest_rec 
)
static

Definition at line 265 of file recinfo.c.

266{
268 HRESULT hr = S_OK;
269 int i;
270
271 TRACE("(%p)->(%p %p)\n", This, src_rec, dest_rec);
272
273 if(!src_rec || !dest_rec)
274 return E_INVALIDARG;
275
276 /* release already stored data */
277 IRecordInfo_RecordClear(iface, dest_rec);
278
279 for (i = 0; i < This->n_vars; i++)
280 {
281 void *src, *dest;
282
283 if (This->fields[i].varkind != VAR_PERINSTANCE) {
284 ERR("varkind != VAR_PERINSTANCE\n");
285 continue;
286 }
287
288 src = ((BYTE*)src_rec) + This->fields[i].offset;
289 dest = ((BYTE*)dest_rec) + This->fields[i].offset;
290 switch (This->fields[i].vt)
291 {
292 case VT_BSTR:
293 {
294 BSTR src_str = *(BSTR*)src;
295
296 if (src_str)
297 {
299 if (!str) hr = E_OUTOFMEMORY;
300
301 *(BSTR*)dest = str;
302 }
303 else
304 *(BSTR*)dest = NULL;
305 break;
306 }
307 case VT_UNKNOWN:
308 case VT_DISPATCH:
309 {
310 IUnknown *unk = *(IUnknown**)src;
311 *(IUnknown**)dest = unk;
312 if (unk) IUnknown_AddRef(unk);
313 break;
314 }
315 case VT_SAFEARRAY:
317 break;
318 default:
319 {
320 /* copy directly for types that don't need deep copy */
321 int len = get_type_size(NULL, This->fields[i].vt);
322 memcpy(dest, src, len);
323 break;
324 }
325 }
326
327 if (FAILED(hr)) break;
328 }
329
330 if (FAILED(hr))
331 IRecordInfo_RecordClear(iface, dest_rec);
332
333 return hr;
334}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT hr
Definition: delayimp.cpp:582
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
Definition: safearray.c:1379
unsigned int get_type_size(ULONG *pFlags, VARTYPE vt)
Definition: usrmarshal.c:207
GLenum GLsizei len
Definition: glext.h:6722
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
const WCHAR * str
unsigned char BYTE
Definition: xxhash.c:193

◆ IRecordInfoImpl_RecordCreate()

static PVOID WINAPI IRecordInfoImpl_RecordCreate ( IRecordInfo iface)
static

Definition at line 518 of file recinfo.c.

519{
521 void *record;
522
523 TRACE("(%p)\n", This);
524
525 record = CoTaskMemAlloc(This->size);
526 IRecordInfo_RecordInit(iface, record);
527 TRACE("created record at %p\n", record);
528 return record;
529}
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381

◆ IRecordInfoImpl_RecordCreateCopy()

static HRESULT WINAPI IRecordInfoImpl_RecordCreateCopy ( IRecordInfo iface,
PVOID  pvSource,
PVOID ppvDest 
)
static

Definition at line 531 of file recinfo.c.

533{
535
536 TRACE("(%p)->(%p %p)\n", This, pvSource, ppvDest);
537
538 if(!pvSource || !ppvDest)
539 return E_INVALIDARG;
540
541 *ppvDest = IRecordInfo_RecordCreate(iface);
542 return IRecordInfo_RecordCopy(iface, pvSource, *ppvDest);
543}

◆ IRecordInfoImpl_RecordDestroy()

static HRESULT WINAPI IRecordInfoImpl_RecordDestroy ( IRecordInfo iface,
PVOID  pvRecord 
)
static

Definition at line 545 of file recinfo.c.

546{
549
550 TRACE("(%p)->(%p)\n", This, pvRecord);
551
552 hres = IRecordInfo_RecordClear(iface, pvRecord);
553 if(FAILED(hres))
554 return hres;
555
556 CoTaskMemFree(pvRecord);
557 return S_OK;
558}
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389

◆ IRecordInfoImpl_RecordInit()

static HRESULT WINAPI IRecordInfoImpl_RecordInit ( IRecordInfo iface,
PVOID  pvNew 
)
static

Definition at line 187 of file recinfo.c.

188{
190 TRACE("(%p)->(%p)\n", This, pvNew);
191
192 if(!pvNew)
193 return E_INVALIDARG;
194
195 memset(pvNew, 0, This->size);
196 return S_OK;
197}
#define memset(x, y, z)
Definition: compat.h:39

◆ IRecordInfoImpl_Release()

static ULONG WINAPI IRecordInfoImpl_Release ( IRecordInfo iface)
static

Definition at line 168 of file recinfo.c.

169{
172
173 TRACE("%p, refcount %lu.\n", iface, ref);
174
175 if(!ref) {
176 int i;
177 for(i=0; i<This->n_vars; i++)
178 SysFreeString(This->fields[i].name);
179 SysFreeString(This->name);
180 free(This->fields);
181 ITypeInfo_Release(This->pTypeInfo);
182 free(This);
183 }
184 return ref;
185}
#define InterlockedDecrement
Definition: armddk.h:52
#define free
Definition: debug_ros.c:5

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( ole  )

Variable Documentation

◆ IRecordInfoImplVtbl

const IRecordInfoVtbl IRecordInfoImplVtbl
static
Initial value:
= {
}
static HRESULT WINAPI IRecordInfoImpl_QueryInterface(IRecordInfo *iface, REFIID riid, void **ppvObject)
Definition: recinfo.c:143
static HRESULT WINAPI IRecordInfoImpl_GetName(IRecordInfo *iface, BSTR *pbstrName)
Definition: recinfo.c:349
static HRESULT WINAPI IRecordInfoImpl_GetTypeInfo(IRecordInfo *iface, ITypeInfo **ppTypeInfo)
Definition: recinfo.c:375
static HRESULT WINAPI IRecordInfoImpl_GetFieldNoCopy(IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField, PVOID *ppvDataCArray)
Definition: recinfo.c:412
static HRESULT WINAPI IRecordInfoImpl_RecordCopy(IRecordInfo *iface, void *src_rec, void *dest_rec)
Definition: recinfo.c:265
static HRESULT WINAPI IRecordInfoImpl_PutField(IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: recinfo.c:436
static HRESULT WINAPI IRecordInfoImpl_GetSize(IRecordInfo *iface, ULONG *pcbSize)
Definition: recinfo.c:362
static HRESULT WINAPI IRecordInfoImpl_GetFieldNames(IRecordInfo *iface, ULONG *pcNames, BSTR *rgBstrNames)
Definition: recinfo.c:484
static ULONG WINAPI IRecordInfoImpl_AddRef(IRecordInfo *iface)
Definition: recinfo.c:160
static HRESULT WINAPI IRecordInfoImpl_GetField(IRecordInfo *iface, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: recinfo.c:390
static HRESULT WINAPI IRecordInfoImpl_GetGuid(IRecordInfo *iface, GUID *pguid)
Definition: recinfo.c:336
static ULONG WINAPI IRecordInfoImpl_Release(IRecordInfo *iface)
Definition: recinfo.c:168
static HRESULT WINAPI IRecordInfoImpl_RecordClear(IRecordInfo *iface, PVOID pvExisting)
Definition: recinfo.c:199
static PVOID WINAPI IRecordInfoImpl_RecordCreate(IRecordInfo *iface)
Definition: recinfo.c:518
static BOOL WINAPI IRecordInfoImpl_IsMatchingType(IRecordInfo *iface, IRecordInfo *info2)
Definition: recinfo.c:507
static HRESULT WINAPI IRecordInfoImpl_PutFieldNoCopy(IRecordInfo *iface, ULONG wFlags, PVOID pvData, LPCOLESTR szFieldName, VARIANT *pvarField)
Definition: recinfo.c:463
static HRESULT WINAPI IRecordInfoImpl_RecordInit(IRecordInfo *iface, PVOID pvNew)
Definition: recinfo.c:187
static HRESULT WINAPI IRecordInfoImpl_RecordDestroy(IRecordInfo *iface, PVOID pvRecord)
Definition: recinfo.c:545
static HRESULT WINAPI IRecordInfoImpl_RecordCreateCopy(IRecordInfo *iface, PVOID pvSource, PVOID *ppvDest)
Definition: recinfo.c:531

Definition at line 560 of file recinfo.c.

Referenced by GetRecordInfoFromTypeInfo().