ReactOS  0.4.15-dev-5137-g826bd41
record.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winerror.h"
#include "wine/debug.h"
#include "msi.h"
#include "msiquery.h"
#include "msipriv.h"
#include "objidl.h"
#include "winnls.h"
#include "ole2.h"
#include "winreg.h"
#include "shlwapi.h"
#include "query.h"
Include dependency graph for record.c:

Go to the source code of this file.

Macros

#define COBJMACROS
 
#define MSIFIELD_NULL   0
 
#define MSIFIELD_INT   1
 
#define MSIFIELD_WSTR   3
 
#define MSIFIELD_STREAM   4
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (msidb)
 
static void MSI_FreeField (MSIFIELD *field)
 
void MSI_CloseRecord (MSIOBJECTHDR *arg)
 
MSIRECORDMSI_CreateRecord (UINT cParams)
 
MSIHANDLE WINAPI MsiCreateRecord (UINT cParams)
 
UINT MSI_RecordGetFieldCount (const MSIRECORD *rec)
 
UINT WINAPI MsiRecordGetFieldCount (MSIHANDLE handle)
 
static BOOL string2intW (LPCWSTR str, int *out)
 
WCHARmsi_strdupW (const WCHAR *value, int len)
 
UINT MSI_RecordCopyField (MSIRECORD *in_rec, UINT in_n, MSIRECORD *out_rec, UINT out_n)
 
int MSI_RecordGetInteger (MSIRECORD *rec, UINT iField)
 
int WINAPI MsiRecordGetInteger (MSIHANDLE handle, UINT iField)
 
UINT WINAPI MsiRecordClearData (MSIHANDLE handle)
 
UINT MSI_RecordSetInteger (MSIRECORD *rec, UINT iField, int iVal)
 
UINT WINAPI MsiRecordSetInteger (MSIHANDLE handle, UINT iField, int iVal)
 
BOOL MSI_RecordIsNull (MSIRECORD *rec, UINT iField)
 
BOOL WINAPI MsiRecordIsNull (MSIHANDLE handle, UINT iField)
 
UINT MSI_RecordGetStringA (MSIRECORD *rec, UINT iField, LPSTR szValue, LPDWORD pcchValue)
 
UINT WINAPI MsiRecordGetStringA (MSIHANDLE handle, UINT iField, char *szValue, DWORD *pcchValue)
 
const WCHARmsi_record_get_string (const MSIRECORD *rec, UINT field, int *len)
 
const WCHARMSI_RecordGetString (const MSIRECORD *rec, UINT iField)
 
UINT MSI_RecordGetStringW (MSIRECORD *rec, UINT iField, WCHAR *szValue, DWORD *pcchValue)
 
UINT WINAPI MsiRecordGetStringW (MSIHANDLE handle, UINT iField, WCHAR *szValue, DWORD *pcchValue)
 
static UINT msi_get_stream_size (IStream *stm)
 
static UINT MSI_RecordDataSize (MSIRECORD *rec, UINT iField)
 
UINT WINAPI MsiRecordDataSize (MSIHANDLE handle, UINT iField)
 
UINT WINAPI MsiRecordSetStringA (MSIHANDLE handle, UINT iField, const char *szValue)
 
UINT msi_record_set_string (MSIRECORD *rec, UINT field, const WCHAR *value, int len)
 
UINT MSI_RecordSetStringW (MSIRECORD *rec, UINT iField, LPCWSTR szValue)
 
UINT WINAPI MsiRecordSetStringW (MSIHANDLE handle, UINT iField, const WCHAR *szValue)
 
static UINT RECORD_StreamFromFile (LPCWSTR szFile, IStream **pstm)
 
UINT MSI_RecordSetStream (MSIRECORD *rec, UINT iField, IStream *stream)
 
UINT MSI_RecordSetStreamFromFileW (MSIRECORD *rec, UINT iField, LPCWSTR szFilename)
 
UINT WINAPI MsiRecordSetStreamA (MSIHANDLE hRecord, UINT iField, const char *szFilename)
 
UINT WINAPI MsiRecordSetStreamW (MSIHANDLE handle, UINT iField, const WCHAR *szFilename)
 
UINT MSI_RecordReadStream (MSIRECORD *rec, UINT iField, char *buf, LPDWORD sz)
 
UINT WINAPI MsiRecordReadStream (MSIHANDLE handle, UINT iField, char *buf, DWORD *sz)
 
UINT MSI_RecordSetIStream (MSIRECORD *rec, UINT iField, IStream *stm)
 
UINT MSI_RecordGetIStream (MSIRECORD *rec, UINT iField, IStream **pstm)
 
static UINT msi_dump_stream_to_file (IStream *stm, LPCWSTR name)
 
UINT MSI_RecordStreamToFile (MSIRECORD *rec, UINT iField, LPCWSTR name)
 
MSIRECORDMSI_CloneRecord (MSIRECORD *rec)
 
BOOL MSI_RecordsAreFieldsEqual (MSIRECORD *a, MSIRECORD *b, UINT field)
 
BOOL MSI_RecordsAreEqual (MSIRECORD *a, MSIRECORD *b)
 
WCHARmsi_dup_record_field (MSIRECORD *rec, INT field)
 
void dump_record (MSIRECORD *rec)
 
UINT copy_remote_record (const struct wire_record *in, MSIHANDLE out)
 
UINT unmarshal_record (const struct wire_record *in, MSIHANDLE *out)
 
struct wire_recordmarshal_record (MSIHANDLE handle)
 
void free_remote_record (struct wire_record *rec)
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 23 of file record.c.

◆ MSIFIELD_INT

#define MSIFIELD_INT   1

Definition at line 45 of file record.c.

◆ MSIFIELD_NULL

#define MSIFIELD_NULL   0

Definition at line 44 of file record.c.

◆ MSIFIELD_STREAM

#define MSIFIELD_STREAM   4

Definition at line 47 of file record.c.

◆ MSIFIELD_WSTR

#define MSIFIELD_WSTR   3

Definition at line 46 of file record.c.

Function Documentation

◆ copy_remote_record()

UINT copy_remote_record ( const struct wire_record in,
MSIHANDLE  out 
)

Definition at line 1052 of file record.c.

1053 {
1054  MSIRECORD *rec;
1055  unsigned int i;
1056  UINT r = ERROR_SUCCESS;
1057 
1059  return ERROR_INVALID_HANDLE;
1060 
1061  rec->cookie = in->cookie;
1062  for (i = 0; i <= in->count; i++)
1063  {
1064  switch (in->fields[i].type)
1065  {
1066  case MSIFIELD_NULL:
1067  MSI_FreeField(&rec->fields[i]);
1068  rec->fields[i].type = MSIFIELD_NULL;
1069  break;
1070  case MSIFIELD_INT:
1071  r = MSI_RecordSetInteger(rec, i, in->fields[i].u.iVal);
1072  break;
1073  case MSIFIELD_WSTR:
1074  r = MSI_RecordSetStringW(rec, i, in->fields[i].u.szwVal);
1075  break;
1076  case MSIFIELD_STREAM:
1077  r = MSI_RecordSetIStream(rec, i, in->fields[i].u.stream);
1078  break;
1079  default:
1080  ERR("invalid field type %d\n", in->fields[i].type);
1081  break;
1082  }
1083 
1084  if (r)
1085  {
1086  msiobj_release(&rec->hdr);
1087  return r;
1088  }
1089  }
1090 
1091  msiobj_release(&rec->hdr);
1092  return ERROR_SUCCESS;
1093 }
#define ERROR_SUCCESS
Definition: deptool.c:10
MSIOBJECTHDR hdr
Definition: msipriv.h:151
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
UINT64 cookie
Definition: msipriv.h:153
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
UINT MSI_RecordSetInteger(MSIRECORD *rec, UINT iField, int iVal)
Definition: record.c:280
#define MSIFIELD_STREAM
Definition: record.c:47
#define MSIFIELD_WSTR
Definition: record.c:46
static void MSI_FreeField(MSIFIELD *field)
Definition: record.c:49
static FILE * out
Definition: regtests2xml.c:44
#define MSIFIELD_NULL
Definition: record.c:44
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
UINT MSI_RecordSetStringW(MSIRECORD *rec, UINT iField, LPCWSTR szValue)
Definition: record.c:597
#define ERR(fmt,...)
Definition: debug.h:110
GLuint in
Definition: glext.h:9616
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
UINT MSI_RecordSetIStream(MSIRECORD *rec, UINT iField, IStream *stm)
Definition: record.c:836
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158
UINT type
Definition: msipriv.h:139

Referenced by MsiViewModify(), and unmarshal_record().

◆ dump_record()

void dump_record ( MSIRECORD rec)

Definition at line 1028 of file record.c.

1029 {
1030  int i;
1031  if (!rec)
1032  {
1033  TRACE("(null)\n");
1034  return;
1035  }
1036 
1037  TRACE("[");
1038  for (i = 0; i <= rec->count; i++)
1039  {
1040  switch(rec->fields[i].type)
1041  {
1042  case MSIFIELD_NULL: TRACE("(null)"); break;
1043  case MSIFIELD_INT: TRACE("%d", rec->fields[i].u.iVal); break;
1044  case MSIFIELD_WSTR: TRACE("%s", debugstr_w(rec->fields[i].u.szwVal)); break;
1045  case MSIFIELD_STREAM: TRACE("%p", rec->fields[i].u.stream); break;
1046  }
1047  if (i < rec->count) TRACE(", ");
1048  }
1049  TRACE("]\n");
1050 }
union tagMSIFIELD::@486 u
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define debugstr_w
Definition: kernel32.h:32
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
#define MSIFIELD_STREAM
Definition: record.c:47
#define TRACE(s)
Definition: solgame.cpp:4
#define MSIFIELD_WSTR
Definition: record.c:46
#define MSIFIELD_NULL
Definition: record.c:44
INT iVal
Definition: msipriv.h:142
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
IStream * stream
Definition: msipriv.h:144
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
UINT type
Definition: msipriv.h:139

Referenced by MSI_FormatRecordW(), MSI_ProcessMessageVerbatim(), and msi_table_load_transform().

◆ free_remote_record()

void free_remote_record ( struct wire_record rec)

Definition at line 1149 of file record.c.

1150 {
1151  int i;
1152 
1153  for (i = 0; i <= rec->count; i++)
1154  {
1155  if (rec->fields[i].type == MSIFIELD_WSTR)
1156  midl_user_free(rec->fields[i].u.szwVal);
1157  else if (rec->fields[i].type == MSIFIELD_STREAM)
1158  IStream_Release(rec->fields[i].u.stream);
1159  }
1160 
1161  midl_user_free(rec);
1162 }
#define midl_user_free
Definition: rpc.h:45
#define MSIFIELD_STREAM
Definition: record.c:47
#define MSIFIELD_WSTR
Definition: record.c:46
struct wire_field fields[]
Definition: winemsi.idl:59
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
unsigned int count
Definition: winemsi.idl:57

Referenced by MsiDatabaseGetPrimaryKeysW(), MsiViewFetch(), MsiViewGetColumnInfo(), and MsiViewModify().

◆ marshal_record()

struct wire_record* marshal_record ( MSIHANDLE  handle)

Definition at line 1109 of file record.c.

1110 {
1111  struct wire_record *ret;
1112  unsigned int i;
1113  MSIRECORD *rec;
1114 
1116  return NULL;
1117 
1118  ret = midl_user_allocate(sizeof(*ret) + rec->count * sizeof(ret->fields[0]));
1119  ret->count = rec->count;
1120  ret->cookie = rec->cookie;
1121 
1122  for (i = 0; i <= rec->count; i++)
1123  {
1124  switch (rec->fields[i].type)
1125  {
1126  case MSIFIELD_NULL:
1127  break;
1128  case MSIFIELD_INT:
1129  ret->fields[i].u.iVal = rec->fields[i].u.iVal;
1130  break;
1131  case MSIFIELD_WSTR:
1132  ret->fields[i].u.szwVal = strdupW(rec->fields[i].u.szwVal);
1133  break;
1134  case MSIFIELD_STREAM:
1135  IStream_AddRef(rec->fields[i].u.stream);
1136  ret->fields[i].u.stream = rec->fields[i].u.stream;
1137  break;
1138  default:
1139  ERR("invalid field type %d\n", rec->fields[i].type);
1140  break;
1141  }
1142  ret->fields[i].type = rec->fields[i].type;
1143  }
1144 
1145  msiobj_release(&rec->hdr);
1146  return ret;
1147 }
union tagMSIFIELD::@486 u
#define midl_user_allocate
Definition: rpc.h:44
static WCHAR * strdupW(const WCHAR *src)
Definition: main.c:92
MSIOBJECTHDR hdr
Definition: msipriv.h:151
UINT64 cookie
Definition: msipriv.h:153
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
#define MSIFIELD_STREAM
Definition: record.c:47
#define MSIFIELD_WSTR
Definition: record.c:46
#define MSIFIELD_NULL
Definition: record.c:44
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
INT iVal
Definition: msipriv.h:142
#define ERR(fmt,...)
Definition: debug.h:110
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
IStream * stream
Definition: msipriv.h:144
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
#define NULL
Definition: types.h:112
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158
UINT type
Definition: msipriv.h:139

Referenced by s_remote_DatabaseGetPrimaryKeys(), s_remote_ViewFetch(), s_remote_ViewGetColumnInfo(), and s_remote_ViewModify().

◆ MSI_CloneRecord()

MSIRECORD* MSI_CloneRecord ( MSIRECORD rec)

Definition at line 921 of file record.c.

922 {
923  MSIRECORD *clone;
924  UINT r, i, count;
925 
927  clone = MSI_CreateRecord(count);
928  if (!clone)
929  return NULL;
930 
931  for (i = 0; i <= count; i++)
932  {
933  if (rec->fields[i].type == MSIFIELD_STREAM)
934  {
935  if (FAILED(IStream_Clone(rec->fields[i].u.stream,
936  &clone->fields[i].u.stream)))
937  {
938  msiobj_release(&clone->hdr);
939  return NULL;
940  }
941  clone->fields[i].type = MSIFIELD_STREAM;
942  }
943  else
944  {
945  r = MSI_RecordCopyField(rec, i, clone, i);
946  if (r != ERROR_SUCCESS)
947  {
948  msiobj_release(&clone->hdr);
949  return NULL;
950  }
951  }
952  }
953 
954  return clone;
955 }
union tagMSIFIELD::@486 u
UINT MSI_RecordGetFieldCount(const MSIRECORD *rec)
Definition: record.c:108
#define ERROR_SUCCESS
Definition: deptool.c:10
MSIOBJECTHDR hdr
Definition: msipriv.h:151
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint GLuint GLsizei count
Definition: gl.h:1545
UINT MSI_RecordCopyField(MSIRECORD *in_rec, UINT in_n, MSIRECORD *out_rec, UINT out_n)
Definition: record.c:166
MSIRECORD * MSI_CreateRecord(UINT cParams)
Definition: record.c:76
#define MSIFIELD_STREAM
Definition: record.c:47
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
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
IStream * stream
Definition: msipriv.h:144
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
UINT type
Definition: msipriv.h:139

Referenced by iterate_properties(), merge_diff_row(), and MSI_FormatRecordW().

◆ MSI_CloseRecord()

void MSI_CloseRecord ( MSIOBJECTHDR arg)

Definition at line 67 of file record.c.

68 {
69  MSIRECORD *rec = (MSIRECORD *) arg;
70  UINT i;
71 
72  for( i=0; i<=rec->count; i++ )
73  MSI_FreeField( &rec->fields[i] );
74 }
UINT count
Definition: msipriv.h:152
static void MSI_FreeField(MSIFIELD *field)
Definition: record.c:49
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
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int UINT
Definition: ndis.h:50

Referenced by MSI_CreateRecord(), and msi_refresh_record().

◆ MSI_CreateRecord()

MSIRECORD* MSI_CreateRecord ( UINT  cParams)

Definition at line 76 of file record.c.

77 {
78  MSIRECORD *rec;
79 
80  TRACE("%d\n", cParams);
81 
82  if( cParams>65535 )
83  return NULL;
84 
87  if( rec )
88  rec->count = cParams;
89  return rec;
90 }
void MSI_CloseRecord(MSIOBJECTHDR *arg)
Definition: record.c:67
void * alloc_msiobject(UINT type, UINT size, msihandledestructor destroy)
Definition: handle.c:201
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
UINT count
Definition: msipriv.h:152
#define TRACE(s)
Definition: solgame.cpp:4
struct wire_field fields[]
Definition: winemsi.idl:59
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NULL
Definition: types.h:112

Referenced by ACTION_AllocateRegistrySpace(), ACTION_ExecuteAction(), ACTION_MsiPublishAssemblies(), ACTION_MsiUnpublishAssemblies(), ACTION_ProcessComponents(), ACTION_PublishFeatures(), ACTION_PublishProduct(), ACTION_RegisterClassInfo(), ACTION_RegisterExtensionInfo(), ACTION_RegisterMIMEInfo(), ACTION_RegisterProduct(), ACTION_RegisterProgIdInfo(), ACTION_RegisterUser(), ACTION_RemoveFiles(), ACTION_ResolveSource(), ACTION_ShowDialog(), ACTION_UnregisterClassInfo(), ACTION_UnregisterExtensionInfo(), ACTION_UnregisterMIMEInfo(), ACTION_UnregisterProgIdInfo(), add_stream(), construct_record(), deformat_string(), dialog_create(), event_set_target_path(), internal_ui_handler(), ITERATE_AppSearch(), ITERATE_CreateFolders(), ITERATE_DeleteService(), ITERATE_DuplicateFiles(), ITERATE_FindRelatedProducts(), ITERATE_InstallODBCDataSource(), ITERATE_InstallODBCDriver(), ITERATE_InstallODBCTranslator(), ITERATE_MoveFiles(), ITERATE_PublishComponent(), ITERATE_RegisterFonts(), ITERATE_RemoveDuplicateFiles(), ITERATE_RemoveEnvironmentString(), ITERATE_RemoveFiles(), ITERATE_RemoveFolders(), ITERATE_RemoveIniValuesOnInstall(), ITERATE_RemoveIniValuesOnUninstall(), ITERATE_RemoveODBCDataSource(), ITERATE_RemoveODBCDriver(), ITERATE_RemoveODBCTranslator(), ITERATE_RemoveRegistryValuesOnInstall(), ITERATE_RemoveRegistryValuesOnUninstall(), ITERATE_SelfRegModules(), ITERATE_SelfUnregModules(), ITERATE_StartService(), ITERATE_StopService(), ITERATE_UnpublishComponent(), ITERATE_UnregisterFonts(), ITERATE_WriteEnvironmentString(), ITERATE_WriteIniValues(), ITERATE_WriteRegistryValues(), msi_arrange_record(), msi_change_media(), msi_clone_properties(), MSI_CloneRecord(), msi_create_table(), MSI_DatabaseGetPrimaryKeys(), msi_dialog_seltree_handler(), msi_file_update_ui(), msi_get_property_row(), msi_get_transform_record(), MSI_OpenPackageW(), msi_query_merge_record(), msi_set_property(), msi_ui_progress(), msi_unpublish_feature(), msi_view_get_row(), MSI_ViewGetColumnInfo(), MsiCreateRecord(), patch_add_media(), patch_offset_get_filepatches(), patch_offset_get_files(), patch_offset_modify_db(), patch_update_filepatch_sequence(), SELECT_set_row(), TABLE_add_column(), TABLE_drop(), TABLE_remove_column(), translate_record(), ui_actioninfo(), ui_actionstart(), UPDATE_execute(), and WHERE_set_row().

◆ msi_dump_stream_to_file()

static UINT msi_dump_stream_to_file ( IStream stm,
LPCWSTR  name 
)
static

Definition at line 868 of file record.c.

869 {
872  IStream *out;
873  DWORD stgm;
874  HRESULT r;
875 
877  r = SHCreateStreamOnFileW( name, stgm, &out );
878  if( FAILED( r ) )
879  return ERROR_FUNCTION_FAILED;
880 
881  pos.QuadPart = 0;
882  r = IStream_Seek( stm, pos, STREAM_SEEK_END, &size );
883  if( FAILED( r ) )
884  goto end;
885 
886  pos.QuadPart = 0;
887  r = IStream_Seek( stm, pos, STREAM_SEEK_SET, NULL );
888  if( FAILED( r ) )
889  goto end;
890 
891  r = IStream_CopyTo( stm, out, size, NULL, NULL );
892 
893 end:
894  IStream_Release( out );
895  if( FAILED( r ) )
896  return ERROR_FUNCTION_FAILED;
897  return ERROR_SUCCESS;
898 }
#define ERROR_SUCCESS
Definition: deptool.c:10
#define STGM_SHARE_EXCLUSIVE
Definition: objbase.h:923
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
#define STGM_FAILIFTHERE
Definition: objbase.h:928
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
GLsizeiptr size
Definition: glext.h:5919
LONG HRESULT
Definition: typedefs.h:79
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint end
Definition: gl.h:1545
#define STGM_READWRITE
Definition: objbase.h:919
#define NULL
Definition: types.h:112
Definition: name.c:38
HRESULT WINAPI SHCreateStreamOnFileW(LPCWSTR lpszPath, DWORD dwMode, IStream **lppStream)
Definition: istream.c:484

Referenced by MSI_RecordStreamToFile().

◆ msi_dup_record_field()

WCHAR* msi_dup_record_field ( MSIRECORD rec,
INT  field 
)

Definition at line 1002 of file record.c.

1003 {
1004  DWORD sz = 0;
1005  WCHAR *str;
1006  UINT r;
1007 
1008  if (MSI_RecordIsNull( rec, field )) return NULL;
1009 
1010  r = MSI_RecordGetStringW( rec, field, NULL, &sz );
1011  if (r != ERROR_SUCCESS)
1012  return NULL;
1013 
1014  sz++;
1015  str = msi_alloc( sz * sizeof(WCHAR) );
1016  if (!str) return NULL;
1017  str[0] = 0;
1018  r = MSI_RecordGetStringW( rec, field, str, &sz );
1019  if (r != ERROR_SUCCESS)
1020  {
1021  ERR("failed to get string!\n");
1022  msi_free( str );
1023  return NULL;
1024  }
1025  return str;
1026 }
#define ERROR_SUCCESS
Definition: deptool.c:10
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static void msi_free(void *mem)
Definition: msipriv.h:1159
const WCHAR * str
__wchar_t WCHAR
Definition: xmlstorage.h:180
Definition: parser.c:43
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ERR(fmt,...)
Definition: debug.h:110
BOOL MSI_RecordIsNull(MSIRECORD *rec, UINT iField)
Definition: record.c:321
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142
UINT MSI_RecordGetStringW(MSIRECORD *rec, UINT iField, WCHAR *szValue, DWORD *pcchValue)
Definition: record.c:438

Referenced by get_ini_file_name(), get_key_value(), get_link_file(), get_signature(), internal_ui_handler(), iterate_load_verb(), ITERATE_RegisterFonts(), ITERATE_UnregisterFonts(), load_appid(), load_class(), load_component(), load_extension(), load_feature(), load_file(), load_folder(), load_mime(), load_progid(), MSI_FormatRecordW(), msi_get_error_message(), MSI_ProcessMessage(), patch_add_media(), patch_offset_get_filepatches(), patch_offset_get_files(), and search_ini().

◆ MSI_FreeField()

static void MSI_FreeField ( MSIFIELD field)
static

Definition at line 49 of file record.c.

50 {
51  switch( field->type )
52  {
53  case MSIFIELD_NULL:
54  case MSIFIELD_INT:
55  break;
56  case MSIFIELD_WSTR:
57  msi_free( field->u.szwVal);
58  break;
59  case MSIFIELD_STREAM:
60  IStream_Release( field->u.stream );
61  break;
62  default:
63  ERR("Invalid field type %d\n", field->type);
64  }
65 }
static void msi_free(void *mem)
Definition: msipriv.h:1159
#define MSIFIELD_STREAM
Definition: record.c:47
Definition: parser.c:43
#define MSIFIELD_WSTR
Definition: record.c:46
union field::@572 u
#define MSIFIELD_NULL
Definition: record.c:44
#define ERR(fmt,...)
Definition: debug.h:110
#define MSIFIELD_INT
Definition: record.c:45

Referenced by copy_remote_record(), MSI_CloseRecord(), msi_record_set_string(), MSI_RecordSetInteger(), MSI_RecordSetIStream(), MSI_RecordSetStream(), and MsiRecordClearData().

◆ msi_get_stream_size()

static UINT msi_get_stream_size ( IStream stm)
static

Definition at line 500 of file record.c.

501 {
502  STATSTG stat;
503  HRESULT r;
504 
505  r = IStream_Stat( stm, &stat, STATFLAG_NONAME );
506  if( FAILED(r) )
507  return 0;
508  return stat.cbSize.QuadPart;
509 }
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
LONG HRESULT
Definition: typedefs.h:79
Definition: stat.h:55
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345

Referenced by MSI_RecordDataSize().

◆ msi_record_get_string()

const WCHAR* msi_record_get_string ( const MSIRECORD rec,
UINT  field,
int len 
)

Definition at line 420 of file record.c.

421 {
422  if (field > rec->count)
423  return NULL;
424 
425  if (rec->fields[field].type != MSIFIELD_WSTR)
426  return NULL;
427 
428  if (len) *len = rec->fields[field].len;
429 
430  return rec->fields[field].u.szwVal;
431 }
union tagMSIFIELD::@486 u
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
Definition: parser.c:43
#define MSIFIELD_WSTR
Definition: record.c:46
GLenum GLsizei len
Definition: glext.h:6722
MSIFIELD fields[1]
Definition: msipriv.h:154
#define NULL
Definition: types.h:112
UINT type
Definition: msipriv.h:139

Referenced by get_table_value_from_record(), ITERATE_WriteRegistryValues(), msi_record_to_row(), MSI_RecordGetString(), msi_select_update(), MsiGetPropertyA(), MsiGetPropertyW(), TABLE_set_row(), table_validate_new(), TransformView_Create(), and TransformView_create_table().

◆ msi_record_set_string()

UINT msi_record_set_string ( MSIRECORD rec,
UINT  field,
const WCHAR value,
int  len 
)

Definition at line 573 of file record.c.

574 {
575  if (field > rec->count)
576  return ERROR_INVALID_FIELD;
577 
578  MSI_FreeField( &rec->fields[field] );
579 
580  if (value && len < 0) len = lstrlenW( value );
581 
582  if (value && len)
583  {
584  rec->fields[field].type = MSIFIELD_WSTR;
585  rec->fields[field].u.szwVal = msi_strdupW( value, len );
586  rec->fields[field].len = len;
587  }
588  else
589  {
590  rec->fields[field].type = MSIFIELD_NULL;
591  rec->fields[field].u.szwVal = NULL;
592  rec->fields[field].len = 0;
593  }
594  return 0;
595 }
union tagMSIFIELD::@486 u
Definition: pdh_main.c:93
WCHAR * msi_strdupW(const WCHAR *value, int len)
Definition: record.c:155
#define lstrlenW
Definition: compat.h:609
#define ERROR_INVALID_FIELD
Definition: winerror.h:974
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
Definition: parser.c:43
#define MSIFIELD_WSTR
Definition: record.c:46
static void MSI_FreeField(MSIFIELD *field)
Definition: record.c:49
#define MSIFIELD_NULL
Definition: record.c:44
GLenum GLsizei len
Definition: glext.h:6722
MSIFIELD fields[1]
Definition: msipriv.h:154
#define NULL
Definition: types.h:112
UINT type
Definition: msipriv.h:139

Referenced by msi_get_transform_record(), MSI_RecordSetStringW(), msi_set_property(), and msi_view_refresh_row().

◆ MSI_RecordCopyField()

UINT MSI_RecordCopyField ( MSIRECORD in_rec,
UINT  in_n,
MSIRECORD out_rec,
UINT  out_n 
)

Definition at line 166 of file record.c.

168 {
169  UINT r = ERROR_SUCCESS;
170 
171  msiobj_lock( &in_rec->hdr );
172 
173  if ( in_n > in_rec->count || out_n > out_rec->count )
175  else if ( in_rec != out_rec || in_n != out_n )
176  {
177  LPWSTR str;
178  MSIFIELD *in, *out;
179 
180  in = &in_rec->fields[in_n];
181  out = &out_rec->fields[out_n];
182 
183  switch ( in->type )
184  {
185  case MSIFIELD_NULL:
186  break;
187  case MSIFIELD_INT:
188  out->u.iVal = in->u.iVal;
189  break;
190  case MSIFIELD_WSTR:
191  if ((str = msi_strdupW( in->u.szwVal, in->len )))
192  {
193  out->u.szwVal = str;
194  out->len = in->len;
195  }
196  else r = ERROR_OUTOFMEMORY;
197  break;
198  case MSIFIELD_STREAM:
199  IStream_AddRef( in->u.stream );
200  out->u.stream = in->u.stream;
201  break;
202  default:
203  ERR("invalid field type %d\n", in->type);
204  }
205  if (r == ERROR_SUCCESS)
206  out->type = in->type;
207  }
208 
209  msiobj_unlock( &in_rec->hdr );
210  return r;
211 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
#define ERROR_SUCCESS
Definition: deptool.c:10
MSIOBJECTHDR hdr
Definition: msipriv.h:151
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
WCHAR * msi_strdupW(const WCHAR *value, int len)
Definition: record.c:155
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
const WCHAR * str
UINT count
Definition: msipriv.h:152
#define MSIFIELD_STREAM
Definition: record.c:47
#define MSIFIELD_WSTR
Definition: record.c:46
static FILE * out
Definition: regtests2xml.c:44
#define MSIFIELD_NULL
Definition: record.c:44
#define ERR(fmt,...)
Definition: debug.h:110
GLuint in
Definition: glext.h:9616
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int UINT
Definition: ndis.h:50
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13

Referenced by msi_arrange_record(), msi_clone_properties(), MSI_CloneRecord(), msi_query_merge_record(), msi_refresh_record(), SELECT_set_row(), translate_record(), UPDATE_execute(), and WHERE_set_row().

◆ MSI_RecordDataSize()

static UINT MSI_RecordDataSize ( MSIRECORD rec,
UINT  iField 
)
static

Definition at line 511 of file record.c.

512 {
513  TRACE("%p %d\n", rec, iField);
514 
515  if( iField > rec->count )
516  return 0;
517 
518  switch( rec->fields[iField].type )
519  {
520  case MSIFIELD_INT:
521  return sizeof (INT);
522  case MSIFIELD_WSTR:
523  return rec->fields[iField].len;
524  case MSIFIELD_NULL:
525  break;
526  case MSIFIELD_STREAM:
527  return msi_get_stream_size( rec->fields[iField].u.stream );
528  }
529  return 0;
530 }
union tagMSIFIELD::@486 u
#define INT
Definition: polytest.cpp:20
static UINT msi_get_stream_size(IStream *stm)
Definition: record.c:500
UINT count
Definition: msipriv.h:152
#define MSIFIELD_STREAM
Definition: record.c:47
#define TRACE(s)
Definition: solgame.cpp:4
#define MSIFIELD_WSTR
Definition: record.c:46
#define MSIFIELD_NULL
Definition: record.c:44
IStream * stream
Definition: msipriv.h:144
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
UINT type
Definition: msipriv.h:139

Referenced by MsiRecordDataSize().

◆ MSI_RecordGetFieldCount()

◆ MSI_RecordGetInteger()

int MSI_RecordGetInteger ( MSIRECORD rec,
UINT  iField 
)

Definition at line 213 of file record.c.

214 {
215  int ret = 0;
216 
217  TRACE("%p %d\n", rec, iField );
218 
219  if( iField > rec->count )
220  return MSI_NULL_INTEGER;
221 
222  switch( rec->fields[iField].type )
223  {
224  case MSIFIELD_INT:
225  return rec->fields[iField].u.iVal;
226  case MSIFIELD_WSTR:
227  if( string2intW( rec->fields[iField].u.szwVal, &ret ) )
228  return ret;
229  return MSI_NULL_INTEGER;
230  default:
231  break;
232  }
233 
234  return MSI_NULL_INTEGER;
235 }
union tagMSIFIELD::@486 u
#define MSI_NULL_INTEGER
Definition: msiquery.h:32
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
#define TRACE(s)
Definition: solgame.cpp:4
#define MSIFIELD_WSTR
Definition: record.c:46
int ret
INT iVal
Definition: msipriv.h:142
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
static BOOL string2intW(LPCWSTR str, int *out)
Definition: record.c:132
UINT type
Definition: msipriv.h:139

Referenced by ACTION_CustomAction(), ACTION_ProcessComponents(), dialog_create(), dialog_create_window(), dialog_handle_event(), get_signature(), get_table_value_from_record(), internal_ui_handler(), ITERATE_CostFinalizeConditions(), ITERATE_CreateShortcuts(), ITERATE_DeleteService(), ITERATE_FindRelatedProducts(), ITERATE_InstallODBCDataSource(), ITERATE_InstallService(), iterate_load_verb(), ITERATE_MigrateFeatureStates(), ITERATE_MoveFiles(), ITERATE_RemoveExistingProducts(), ITERATE_RemoveFiles(), ITERATE_RemoveIniValuesOnInstall(), ITERATE_RemoveIniValuesOnUninstall(), ITERATE_RemoveODBCDataSource(), ITERATE_RemoveRegistryValuesOnInstall(), ITERATE_RemoveRegistryValuesOnUninstall(), ITERATE_StartService(), ITERATE_StopService(), ITERATE_UnregisterTypeLibraries(), ITERATE_WriteIniValues(), ITERATE_WriteRegistryValues(), load_class(), load_component(), load_feature(), load_file(), load_file_disk_id(), load_file_hash(), load_media(), load_patch(), load_patch_disk_id(), load_progid(), msi_dialog_add_control(), msi_dialog_add_font(), msi_dialog_adjust_dialog_pos(), msi_dialog_bitmap_control(), msi_dialog_button_control(), msi_dialog_combo_control(), msi_dialog_directory_combo(), msi_dialog_directory_list(), msi_dialog_hyperlink(), msi_dialog_icon_control(), msi_dialog_line_control(), msi_dialog_list_box(), msi_dialog_listview(), msi_dialog_oncreate(), msi_dialog_pathedit_control(), msi_dialog_progress_bar(), msi_dialog_radiogroup_control(), msi_dialog_selection_tree(), msi_dialog_text_control(), msi_dialog_volumeselect_combo(), msi_load_assembly(), msi_load_media_info(), msi_primary_key_iterator(), MSI_ProcessMessage(), msi_record_to_row(), msi_select_update(), msi_table_load_transform(), MsiRecordGetInteger(), patch_add_media(), patch_offset_get_filepatches(), patch_offset_get_files(), patch_set_offsets(), patch_update_file_sequence(), patch_update_filepatch_sequence(), resolve_keypath(), search_components(), search_dr(), search_ini(), search_reg(), table_validate_new(), and WHERE_evaluate().

◆ MSI_RecordGetIStream()

UINT MSI_RecordGetIStream ( MSIRECORD rec,
UINT  iField,
IStream **  pstm 
)

Definition at line 852 of file record.c.

853 {
854  TRACE("%p %d %p\n", rec, iField, pstm);
855 
856  if( iField > rec->count )
857  return ERROR_INVALID_FIELD;
858 
859  if( rec->fields[iField].type != MSIFIELD_STREAM )
860  return ERROR_INVALID_FIELD;
861 
862  *pstm = rec->fields[iField].u.stream;
863  IStream_AddRef( *pstm );
864 
865  return ERROR_SUCCESS;
866 }
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
#define ERROR_INVALID_FIELD
Definition: winerror.h:974
UINT count
Definition: msipriv.h:152
#define MSIFIELD_STREAM
Definition: record.c:47
#define TRACE(s)
Definition: solgame.cpp:4
IStream * stream
Definition: msipriv.h:144
MSIFIELD fields[1]
Definition: msipriv.h:154
UINT type
Definition: msipriv.h:139

Referenced by msi_load_picture(), MSI_RecordStreamToFile(), msi_select_update(), STORAGES_set_row(), STREAMS_set_row(), and TABLE_set_row().

◆ MSI_RecordGetString()

const WCHAR* MSI_RecordGetString ( const MSIRECORD rec,
UINT  iField 
)

Definition at line 433 of file record.c.

434 {
435  return msi_record_get_string( rec, iField, NULL );
436 }
const WCHAR * msi_record_get_string(const MSIRECORD *rec, UINT field, int *len)
Definition: record.c:420
#define NULL
Definition: types.h:112

Referenced by ACTION_CustomAction(), ACTION_PerformActionSequence(), create_diff_row_query(), dialog_create(), dialog_create_window(), dialog_handle_event(), find_feature_children(), find_folder_children(), get_assembly_name_attribute(), get_assembly_record(), get_duplicate_filename(), get_ini_file_name(), get_key_value(), get_link_file(), get_property(), HANDLE_CustomType19(), internal_ui_handler(), is_uninstallable(), ITERATE_Actions(), iterate_all_classes(), iterate_all_extensions(), iterate_all_mimes(), iterate_all_progids(), ITERATE_AppSearch(), ITERATE_BindImage(), ITERATE_CCPSearch(), ITERATE_CostFinalizeConditions(), ITERATE_CreateFolders(), ITERATE_CreateShortcuts(), ITERATE_DeleteService(), ITERATE_DuplicateFiles(), ITERATE_FindRelatedProducts(), ITERATE_InstallODBCDataSource(), ITERATE_InstallODBCDriver(), ITERATE_InstallODBCTranslator(), ITERATE_InstallService(), ITERATE_LaunchConditions(), iterate_load_featurecomponents(), iterate_load_verb(), ITERATE_MigrateFeatureStates(), ITERATE_MoveFiles(), iterate_patched_component(), ITERATE_PublishComponent(), ITERATE_PublishIcon(), ITERATE_RegisterFonts(), ITERATE_RegisterTypeLibraries(), ITERATE_RemoveDuplicateFiles(), ITERATE_RemoveEnvironmentString(), ITERATE_RemoveExistingProducts(), ITERATE_RemoveFiles(), ITERATE_RemoveFolders(), ITERATE_RemoveIniValuesOnInstall(), ITERATE_RemoveIniValuesOnUninstall(), ITERATE_RemoveODBCDataSource(), ITERATE_RemoveODBCDriver(), ITERATE_RemoveODBCTranslator(), ITERATE_RemoveRegistryValuesOnInstall(), ITERATE_RemoveRegistryValuesOnUninstall(), ITERATE_RemoveShortcuts(), ITERATE_SelfRegModules(), ITERATE_SelfUnregModules(), ITERATE_StartService(), ITERATE_StopService(), ITERATE_UnpublishComponent(), ITERATE_UnpublishIcon(), ITERATE_UnregisterFonts(), ITERATE_UnregisterTypeLibraries(), ITERATE_WriteEnvironmentString(), ITERATE_WriteIniValues(), ITERATE_WriteRegistryValues(), join_find_row(), load_appid(), load_class(), load_extension(), load_file(), load_media(), load_mime(), load_patch(), load_progid(), map_event(), merge_diff_tables(), merge_verify_colnames(), merge_verify_primary_keys(), msi_combobox_add_item(), msi_dialog_add_control(), msi_dialog_add_font(), msi_dialog_checkbox_control(), msi_dialog_combo_control(), msi_dialog_control_event(), msi_dialog_create_controls(), msi_dialog_create_radiobutton(), msi_dialog_directory_combo(), msi_dialog_directory_list(), msi_dialog_edit_control(), msi_dialog_get_uitext(), msi_dialog_hyperlink(), msi_dialog_line_control(), msi_dialog_list_box(), msi_dialog_listview(), msi_dialog_maskedit_control(), msi_dialog_oncreate(), msi_dialog_pathedit_control(), msi_dialog_radiogroup_control(), msi_dialog_scrolltext_control(), msi_dialog_selection_tree(), msi_dialog_seltree_handler(), msi_dialog_set_control_condition(), msi_dialog_text_control(), msi_dialog_vcl_add_columns(), msi_dialog_volumeselect_combo(), MSI_FormatRecordW(), msi_get_deformatted_field(), msi_get_query_columns(), msi_get_query_types(), msi_get_table_labels(), msi_listbox_add_item(), msi_listview_add_item(), msi_load_assembly(), msi_load_media_info(), msi_media_get_disk_info(), msi_primary_key_iterator(), MsiGetProductPropertyW(), patch_set_media_source_prop(), patch_update_file_sequence(), patch_update_filepatch_sequence(), resolve_keypath(), search_components(), search_dr(), search_reg(), storages_find_row(), STORAGES_set_row(), streams_find_row(), STREAMS_set_row(), STRING_evaluate(), and ui_actionstart().

◆ MSI_RecordGetStringA()

UINT MSI_RecordGetStringA ( MSIRECORD rec,
UINT  iField,
LPSTR  szValue,
LPDWORD  pcchValue 
)

Definition at line 351 of file record.c.

353 {
354  UINT len = 0, ret = ERROR_SUCCESS;
355  CHAR buffer[16];
356 
357  TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue);
358 
359  if( iField > rec->count )
360  {
361  if ( szValue && *pcchValue > 0 )
362  szValue[0] = 0;
363 
364  *pcchValue = 0;
365  return ERROR_SUCCESS;
366  }
367 
368  switch( rec->fields[iField].type )
369  {
370  case MSIFIELD_INT:
371  wsprintfA(buffer, "%d", rec->fields[iField].u.iVal);
372  len = lstrlenA( buffer );
373  if (szValue)
374  lstrcpynA(szValue, buffer, *pcchValue);
375  break;
376  case MSIFIELD_WSTR:
377  len = WideCharToMultiByte( CP_ACP, 0, rec->fields[iField].u.szwVal,
378  rec->fields[iField].len + 1, NULL, 0 , NULL, NULL );
379  if (szValue)
380  WideCharToMultiByte( CP_ACP, 0, rec->fields[iField].u.szwVal,
381  rec->fields[iField].len + 1, szValue, *pcchValue, NULL, NULL );
382  if( szValue && *pcchValue && len>*pcchValue )
383  szValue[*pcchValue-1] = 0;
384  if( len )
385  len--;
386  break;
387  case MSIFIELD_NULL:
388  if( szValue && *pcchValue > 0 )
389  szValue[0] = 0;
390  break;
391  default:
393  break;
394  }
395 
396  if( szValue && *pcchValue <= len )
398  *pcchValue = len;
399 
400  return ret;
401 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
#define WideCharToMultiByte
Definition: compat.h:111
#define CP_ACP
Definition: compat.h:109
char CHAR
Definition: xmlstorage.h:175
GLuint buffer
Definition: glext.h:5915
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
#define TRACE(s)
Definition: solgame.cpp:4
#define MSIFIELD_WSTR
Definition: record.c:46
#define MSIFIELD_NULL
Definition: record.c:44
int ret
GLenum GLsizei len
Definition: glext.h:6722
INT iVal
Definition: msipriv.h:142
#define ERROR_MORE_DATA
Definition: dderror.h:13
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define lstrcpynA
Definition: compat.h:610
UINT type
Definition: msipriv.h:139

Referenced by msi_export_field(), and MsiRecordGetStringA().

◆ MSI_RecordGetStringW()

UINT MSI_RecordGetStringW ( MSIRECORD rec,
UINT  iField,
WCHAR szValue,
DWORD pcchValue 
)

Definition at line 438 of file record.c.

439 {
440  UINT len = 0, ret = ERROR_SUCCESS;
441  WCHAR buffer[16];
442 
443  TRACE( "%p, %u, %p, %p\n", rec, iField, szValue, pcchValue );
444 
445  if( iField > rec->count )
446  {
447  if ( szValue && *pcchValue > 0 )
448  szValue[0] = 0;
449 
450  *pcchValue = 0;
451  return ERROR_SUCCESS;
452  }
453 
454  switch( rec->fields[iField].type )
455  {
456  case MSIFIELD_INT:
457  wsprintfW(buffer, L"%d", rec->fields[iField].u.iVal);
458  len = lstrlenW( buffer );
459  if (szValue)
460  lstrcpynW(szValue, buffer, *pcchValue);
461  break;
462  case MSIFIELD_WSTR:
463  len = rec->fields[iField].len;
464  if (szValue)
465  memcpy( szValue, rec->fields[iField].u.szwVal, min(len + 1, *pcchValue) * sizeof(WCHAR) );
466  break;
467  case MSIFIELD_NULL:
468  if( szValue && *pcchValue > 0 )
469  szValue[0] = 0;
470  break;
471  default:
472  break;
473  }
474 
475  if( szValue && *pcchValue <= len )
477  *pcchValue = len;
478 
479  return ret;
480 }
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
GLuint buffer
Definition: glext.h:5915
#define lstrlenW
Definition: compat.h:609
#define lstrcpynW
Definition: compat.h:597
#define L(x)
Definition: ntvdm.h:50
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MSIFIELD_WSTR
Definition: record.c:46
#define MSIFIELD_NULL
Definition: record.c:44
int ret
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
INT iVal
Definition: msipriv.h:142
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
UINT type
Definition: msipriv.h:139

Referenced by msi_dup_record_field(), and MsiRecordGetStringW().

◆ MSI_RecordIsNull()

BOOL MSI_RecordIsNull ( MSIRECORD rec,
UINT  iField 
)

Definition at line 321 of file record.c.

322 {
323  BOOL r = TRUE;
324 
325  TRACE("%p %d\n", rec, iField );
326 
327  r = ( iField > rec->count ) ||
328  ( rec->fields[iField].type == MSIFIELD_NULL );
329 
330  return r;
331 }
#define TRUE
Definition: types.h:120
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
unsigned int BOOL
Definition: ntddk_ex.h:94
UINT count
Definition: msipriv.h:152
#define TRACE(s)
Definition: solgame.cpp:4
#define MSIFIELD_NULL
Definition: record.c:44
MSIFIELD fields[1]
Definition: msipriv.h:154
UINT type
Definition: msipriv.h:139

Referenced by deformat_index(), get_duplicate_filename(), get_table_value_from_record(), ITERATE_CreateShortcuts(), ITERATE_MoveFiles(), ITERATE_RegisterFonts(), ITERATE_RemoveRegistryValuesOnUninstall(), ITERATE_UnregisterFonts(), ITERATE_WriteRegistryValues(), load_appid(), load_class(), load_feature(), load_progid(), msi_dup_record_field(), MSI_ProcessMessage(), MsiRecordIsNull(), row_has_null_primary_keys(), search_dr(), and TABLE_set_row().

◆ MSI_RecordReadStream()

UINT MSI_RecordReadStream ( MSIRECORD rec,
UINT  iField,
char buf,
LPDWORD  sz 
)

Definition at line 761 of file record.c.

762 {
763  ULONG count;
764  HRESULT r;
765  IStream *stm;
766 
767  TRACE("%p %d %p %p\n", rec, iField, buf, sz);
768 
769  if( !sz )
771 
772  if( iField > rec->count)
774 
775  if ( rec->fields[iField].type == MSIFIELD_NULL )
776  {
777  *sz = 0;
778  return ERROR_INVALID_DATA;
779  }
780 
781  if( rec->fields[iField].type != MSIFIELD_STREAM )
782  return ERROR_INVALID_DATATYPE;
783 
784  stm = rec->fields[iField].u.stream;
785  if( !stm )
787 
788  /* if there's no buffer pointer, calculate the length to the end */
789  if( !buf )
790  {
791  LARGE_INTEGER ofs;
793 
794  ofs.QuadPart = cur.QuadPart = 0;
795  end.QuadPart = 0;
796  IStream_Seek( stm, ofs, STREAM_SEEK_SET, &cur );
797  IStream_Seek( stm, ofs, STREAM_SEEK_END, &end );
798  ofs.QuadPart = cur.QuadPart;
799  IStream_Seek( stm, ofs, STREAM_SEEK_SET, &cur );
800  *sz = end.QuadPart - cur.QuadPart;
801 
802  return ERROR_SUCCESS;
803  }
804 
805  /* read the data */
806  count = 0;
807  r = IStream_Read( stm, buf, *sz, &count );
808  if( FAILED( r ) )
809  {
810  *sz = 0;
811  return ERROR_FUNCTION_FAILED;
812  }
813 
814  *sz = count;
815 
816  return ERROR_SUCCESS;
817 }
#define ERROR_INVALID_DATATYPE
Definition: winerror.h:1111
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
UINT count
Definition: msipriv.h:152
#define MSIFIELD_STREAM
Definition: record.c:47
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
#define MSIFIELD_NULL
Definition: record.c:44
GLuint GLuint end
Definition: gl.h:1545
FxCollectionEntry * cur
#define ERROR_INVALID_DATA
Definition: winerror.h:116
IStream * stream
Definition: msipriv.h:144
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int ULONG
Definition: retypes.h:1
UINT type
Definition: msipriv.h:139
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by create_temp_binary(), HANDLE_CustomType5_6(), ITERATE_PublishIcon(), msi_export_stream(), and MsiRecordReadStream().

◆ MSI_RecordsAreEqual()

BOOL MSI_RecordsAreEqual ( MSIRECORD a,
MSIRECORD b 
)

Definition at line 986 of file record.c.

987 {
988  UINT i;
989 
990  if (a->count != b->count)
991  return FALSE;
992 
993  for (i = 0; i <= a->count; i++)
994  {
995  if (!MSI_RecordsAreFieldsEqual( a, b, i ))
996  return FALSE;
997  }
998 
999  return TRUE;
1000 }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
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
unsigned int UINT
Definition: ndis.h:50
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
BOOL MSI_RecordsAreFieldsEqual(MSIRECORD *a, MSIRECORD *b, UINT field)
Definition: record.c:957

Referenced by merge_diff_row().

◆ MSI_RecordsAreFieldsEqual()

BOOL MSI_RecordsAreFieldsEqual ( MSIRECORD a,
MSIRECORD b,
UINT  field 
)

Definition at line 957 of file record.c.

958 {
959  if (a->fields[field].type != b->fields[field].type)
960  return FALSE;
961 
962  switch (a->fields[field].type)
963  {
964  case MSIFIELD_NULL:
965  break;
966 
967  case MSIFIELD_INT:
968  if (a->fields[field].u.iVal != b->fields[field].u.iVal)
969  return FALSE;
970  break;
971 
972  case MSIFIELD_WSTR:
973  if (a->fields[field].len != b->fields[field].len) return FALSE;
974  if (memcmp( a->fields[field].u.szwVal, b->fields[field].u.szwVal,
975  a->fields[field].len * sizeof(WCHAR) )) return FALSE;
976  break;
977 
978  case MSIFIELD_STREAM:
979  default:
980  return FALSE;
981  }
982  return TRUE;
983 }
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define MSIFIELD_STREAM
Definition: record.c:47
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
__wchar_t WCHAR
Definition: xmlstorage.h:180
Definition: parser.c:43
#define MSIFIELD_WSTR
Definition: record.c:46
#define MSIFIELD_NULL
Definition: record.c:44
#define MSIFIELD_INT
Definition: record.c:45
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204

Referenced by join_modify_update(), and MSI_RecordsAreEqual().

◆ MSI_RecordSetInteger()

UINT MSI_RecordSetInteger ( MSIRECORD rec,
UINT  iField,
int  iVal 
)

Definition at line 280 of file record.c.

281 {
282  TRACE("%p %u %d\n", rec, iField, iVal);
283 
284  if( iField > rec->count )
286 
287  MSI_FreeField( &rec->fields[iField] );
288 
289  if (iVal == MSI_NULL_INTEGER)
290  {
291  rec->fields[iField].type = MSIFIELD_NULL;
292  rec->fields[iField].u.szwVal = NULL;
293  }
294  else
295  {
296  rec->fields[iField].type = MSIFIELD_INT;
297  rec->fields[iField].u.iVal = iVal;
298  }
299 
300  return ERROR_SUCCESS;
301 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
#define MSI_NULL_INTEGER
Definition: msiquery.h:32
UINT count
Definition: msipriv.h:152
LPWSTR szwVal
Definition: msipriv.h:143
#define TRACE(s)
Definition: solgame.cpp:4
static void MSI_FreeField(MSIFIELD *field)
Definition: record.c:49
#define MSIFIELD_NULL
Definition: record.c:44
INT iVal
Definition: msipriv.h:142
#define MSIFIELD_INT
Definition: record.c:45
MSIFIELD fields[1]
Definition: msipriv.h:154
#define NULL
Definition: types.h:112
UINT type
Definition: msipriv.h:139

Referenced by ACTION_AllocateRegistrySpace(), ACTION_ExecuteAction(), ACTION_ResolveSource(), ACTION_ShowDialog(), construct_record(), copy_remote_record(), internal_ui_handler(), ITERATE_DuplicateFiles(), ITERATE_InstallODBCDataSource(), ITERATE_MoveFiles(), ITERATE_RemoveEnvironmentString(), ITERATE_RemoveODBCDataSource(), ITERATE_WriteEnvironmentString(), msi_change_media(), msi_create_table(), msi_file_update_ui(), msi_get_transform_record(), MSI_OpenPackageW(), msi_query_merge_record(), msi_table_load_transform(), msi_ui_progress(), msi_view_refresh_row(), MSI_ViewFetch(), MsiRecordSetInteger(), patch_add_media(), patch_offset_get_filepatches(), patch_offset_get_files(), patch_offset_modify_db(), patch_set_offsets(), patch_update_file_sequence(), patch_update_filepatch_sequence(), TABLE_add_column(), TABLE_remove_column(), and ui_actioninfo().

◆ MSI_RecordSetIStream()

UINT MSI_RecordSetIStream ( MSIRECORD rec,
UINT  iField,
IStream stm 
)

Definition at line 836 of file record.c.

837 {
838  TRACE("%p %d %p\n", rec, iField, stm);
839 
840  if( iField > rec->count )
841  return ERROR_INVALID_FIELD;
842 
843  MSI_FreeField( &rec->fields[iField] );
844 
845  rec->fields[iField].type = MSIFIELD_STREAM;
846  rec->fields[iField].u.stream = stm;
847  IStream_AddRef( stm );
848 
849  return ERROR_SUCCESS;
850 }
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
#define ERROR_INVALID_FIELD
Definition: winerror.h:974
UINT count
Definition: msipriv.h:152
#define MSIFIELD_STREAM
Definition: record.c:47
#define TRACE(s)
Definition: solgame.cpp:4
static void MSI_FreeField(MSIFIELD *field)
Definition: record.c:49
IStream * stream
Definition: msipriv.h:144
MSIFIELD fields[1]
Definition: msipriv.h:154
UINT type
Definition: msipriv.h:139

Referenced by add_stream(), copy_remote_record(), and msi_view_refresh_row().

◆ MSI_RecordSetStream()

UINT MSI_RecordSetStream ( MSIRECORD rec,
UINT  iField,
IStream stream 
)

Definition at line 671 of file record.c.

672 {
673  if ( (iField == 0) || (iField > rec->count) )
675 
676  MSI_FreeField( &rec->fields[iField] );
677  rec->fields[iField].type = MSIFIELD_STREAM;
678  rec->fields[iField].u.stream = stream;
679 
680  return ERROR_SUCCESS;
681 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
UINT count
Definition: msipriv.h:152
#define MSIFIELD_STREAM
Definition: record.c:47
static void MSI_FreeField(MSIFIELD *field)
Definition: record.c:49
GLuint GLuint stream
Definition: glext.h:7522
IStream * stream
Definition: msipriv.h:144
MSIFIELD fields[1]
Definition: msipriv.h:154
UINT type
Definition: msipriv.h:139

Referenced by msi_get_transform_record(), and MSI_RecordSetStreamFromFileW().

◆ MSI_RecordSetStreamFromFileW()

UINT MSI_RecordSetStreamFromFileW ( MSIRECORD rec,
UINT  iField,
LPCWSTR  szFilename 
)

Definition at line 683 of file record.c.

684 {
685  IStream *stm = NULL;
686  HRESULT hr;
687  UINT ret;
688 
689  if( (iField == 0) || (iField > rec->count) )
691 
692  /* no filename means we should seek back to the start of the stream */
693  if( !szFilename )
694  {
695  LARGE_INTEGER ofs;
697 
698  if( rec->fields[iField].type != MSIFIELD_STREAM )
699  return ERROR_INVALID_FIELD;
700 
701  stm = rec->fields[iField].u.stream;
702  if( !stm )
703  return ERROR_INVALID_FIELD;
704 
705  ofs.QuadPart = 0;
706  hr = IStream_Seek( stm, ofs, STREAM_SEEK_SET, &cur );
707  if (FAILED( hr ))
708  return ERROR_FUNCTION_FAILED;
709  }
710  else
711  {
712  /* read the file into a stream and save the stream in the record */
713  ret = RECORD_StreamFromFile(szFilename, &stm);
714  if (ret != ERROR_SUCCESS)
715  return ret;
716 
717  /* if all's good, store it in the record */
718  MSI_RecordSetStream(rec, iField, stm);
719  }
720 
721  return ERROR_SUCCESS;
722 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
union tagMSIFIELD::@486 u
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
#define ERROR_INVALID_FIELD
Definition: winerror.h:974
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
UINT count
Definition: msipriv.h:152
static UINT RECORD_StreamFromFile(LPCWSTR szFile, IStream **pstm)
Definition: record.c:623
#define MSIFIELD_STREAM
Definition: record.c:47
LONG HRESULT
Definition: typedefs.h:79
int ret
FxCollectionEntry * cur
IStream * stream
Definition: msipriv.h:144
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
UINT type
Definition: msipriv.h:139
UINT MSI_RecordSetStream(MSIRECORD *rec, UINT iField, IStream *stream)
Definition: record.c:671
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by construct_record(), and MsiRecordSetStreamW().

◆ MSI_RecordSetStringW()

UINT MSI_RecordSetStringW ( MSIRECORD rec,
UINT  iField,
LPCWSTR  szValue 
)

Definition at line 597 of file record.c.

598 {
599  TRACE("%p %d %s\n", rec, iField, debugstr_w(szValue));
600 
601  return msi_record_set_string( rec, iField, szValue, -1 );
602 }
UINT msi_record_set_string(MSIRECORD *rec, UINT field, const WCHAR *value, int len)
Definition: record.c:573
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by ACTION_ExecuteAction(), ACTION_MsiPublishAssemblies(), ACTION_MsiUnpublishAssemblies(), ACTION_ProcessComponents(), ACTION_PublishFeatures(), ACTION_PublishProduct(), ACTION_RegisterClassInfo(), ACTION_RegisterExtensionInfo(), ACTION_RegisterMIMEInfo(), ACTION_RegisterProduct(), ACTION_RegisterProgIdInfo(), ACTION_RegisterUser(), ACTION_RemoveFiles(), ACTION_ResolveSource(), ACTION_ShowDialog(), ACTION_UnregisterClassInfo(), ACTION_UnregisterExtensionInfo(), ACTION_UnregisterMIMEInfo(), ACTION_UnregisterProgIdInfo(), add_stream(), construct_record(), copy_remote_record(), deformat_string(), dialog_create(), event_set_target_path(), internal_ui_handler(), ITERATE_AppSearch(), ITERATE_CreateFolders(), ITERATE_DeleteService(), ITERATE_DuplicateFiles(), ITERATE_FindRelatedProducts(), ITERATE_InstallODBCDataSource(), ITERATE_InstallODBCDriver(), ITERATE_InstallODBCTranslator(), ITERATE_MoveFiles(), iterate_properties(), ITERATE_PublishComponent(), ITERATE_RegisterFonts(), ITERATE_RemoveDuplicateFiles(), ITERATE_RemoveEnvironmentString(), ITERATE_RemoveFiles(), ITERATE_RemoveFolders(), ITERATE_RemoveIniValuesOnInstall(), ITERATE_RemoveIniValuesOnUninstall(), ITERATE_RemoveODBCDataSource(), ITERATE_RemoveODBCDriver(), ITERATE_RemoveODBCTranslator(), ITERATE_RemoveRegistryValuesOnInstall(), ITERATE_RemoveRegistryValuesOnUninstall(), ITERATE_SelfRegModules(), ITERATE_SelfUnregModules(), ITERATE_StartService(), ITERATE_StopService(), ITERATE_UnpublishComponent(), ITERATE_UnregisterFonts(), ITERATE_WriteEnvironmentString(), ITERATE_WriteIniValues(), ITERATE_WriteRegistryValues(), msi_change_media(), msi_create_table(), MSI_DatabaseExport(), msi_dialog_seltree_handler(), msi_file_update_ui(), MSI_FormatRecordW(), msi_get_property_row(), MSI_OpenPackageW(), msi_primary_key_iterator(), MSI_ProcessMessage(), msi_query_merge_record(), msi_set_record_type_string(), msi_unpublish_feature(), MSI_ViewGetColumnInfo(), MsiRecordSetStringA(), MsiRecordSetStringW(), patch_add_media(), patch_update_filepatch_sequence(), TABLE_add_column(), TABLE_drop(), TABLE_remove_column(), ui_actioninfo(), and ui_actionstart().

◆ MSI_RecordStreamToFile()

UINT MSI_RecordStreamToFile ( MSIRECORD rec,
UINT  iField,
LPCWSTR  name 
)

Definition at line 900 of file record.c.

901 {
902  IStream *stm = NULL;
903  UINT r;
904 
905  TRACE("%p %u %s\n", rec, iField, debugstr_w(name));
906 
907  msiobj_lock( &rec->hdr );
908 
909  r = MSI_RecordGetIStream( rec, iField, &stm );
910  if( r == ERROR_SUCCESS )
911  {
912  r = msi_dump_stream_to_file( stm, name );
913  IStream_Release( stm );
914  }
915 
916  msiobj_unlock( &rec->hdr );
917 
918  return r;
919 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
#define ERROR_SUCCESS
Definition: deptool.c:10
MSIOBJECTHDR hdr
Definition: msipriv.h:151
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static UINT msi_dump_stream_to_file(IStream *stm, LPCWSTR name)
Definition: record.c:868
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
UINT MSI_RecordGetIStream(MSIRECORD *rec, UINT iField, IStream **pstm)
Definition: record.c:852
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
Definition: name.c:38

Referenced by msi_load_image().

◆ msi_strdupW()

WCHAR* msi_strdupW ( const WCHAR value,
int  len 
)

Definition at line 155 of file record.c.

156 {
157  WCHAR *ret;
158 
159  if (!value) return NULL;
160  if (!(ret = msi_alloc( (len + 1) * sizeof(WCHAR) ))) return NULL;
161  memcpy( ret, value, len * sizeof(WCHAR) );
162  ret[len] = 0;
163  return ret;
164 }
Definition: pdh_main.c:93
__wchar_t WCHAR
Definition: xmlstorage.h:180
int ret
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
#define NULL
Definition: types.h:112
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142

Referenced by ACTION_ExecuteAction(), msi_record_set_string(), MSI_RecordCopyField(), and parse_value().

◆ MsiCreateRecord()

MSIHANDLE WINAPI MsiCreateRecord ( UINT  cParams)

Definition at line 92 of file record.c.

93 {
94  MSIRECORD *rec;
95  MSIHANDLE ret = 0;
96 
97  TRACE("%d\n", cParams);
98 
99  rec = MSI_CreateRecord( cParams );
100  if( rec )
101  {
102  ret = alloc_msihandle( &rec->hdr );
103  msiobj_release( &rec->hdr );
104  }
105  return ret;
106 }
MSIOBJECTHDR hdr
Definition: msipriv.h:151
MSIRECORD * MSI_CreateRecord(UINT cParams)
Definition: record.c:76
unsigned long MSIHANDLE
Definition: winemsi.idl:24
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
MSIHANDLE alloc_msihandle(MSIOBJECTHDR *obj)
Definition: handle.c:111

Referenced by add_custom_dll(), generate_transform(), InstallerImpl_CreateRecord(), ok_(), query_file_path(), test_binary(), test_customaction1(), test_db(), test_dbmerge(), test_externalui(), test_externalui_message(), test_fieldzero(), test_format_record(), test_formatrecord(), test_formatrecord2(), test_formatrecord_tables(), test_icon_table(), test_markers(), test_msiinsert(), test_msirecord(), test_MsiRecordGetInteger(), test_MsiRecordGetString(), test_select_markers(), test_storages_table(), test_streamtable(), test_stringtable(), test_try_transform(), test_update(), test_view_get_error(), test_viewmodify(), test_viewmodify_assign(), test_viewmodify_delete_temporary(), test_viewmodify_insert(), test_viewmodify_merge(), test_viewmodify_update(), test_where(), test_where_viewmodify(), try_insert_query(), and unmarshal_record().

◆ MsiRecordClearData()

UINT WINAPI MsiRecordClearData ( MSIHANDLE  handle)

Definition at line 256 of file record.c.

257 {
258  MSIRECORD *rec;
259  UINT i;
260 
261  TRACE( "%lu\n", handle );
262 
264  if( !rec )
265  return ERROR_INVALID_HANDLE;
266 
267  msiobj_lock( &rec->hdr );
268  for( i=0; i<=rec->count; i++)
269  {
270  MSI_FreeField( &rec->fields[i] );
271  rec->fields[i].type = MSIFIELD_NULL;
272  rec->fields[i].u.iVal = 0;
273  }
274  msiobj_unlock( &rec->hdr );
275  msiobj_release( &rec->hdr );
276 
277  return ERROR_SUCCESS;
278 }
union tagMSIFIELD::@486 u
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
#define ERROR_SUCCESS
Definition: deptool.c:10
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
UINT count
Definition: msipriv.h:152
#define TRACE(s)
Definition: solgame.cpp:4
static void MSI_FreeField(MSIFIELD *field)
Definition: record.c:49
#define MSIFIELD_NULL
Definition: record.c:44
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
INT iVal
Definition: msipriv.h:142
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
MSIFIELD fields[1]
Definition: msipriv.h:154
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158
UINT type
Definition: msipriv.h:139

Referenced by test_msirecord().

◆ MsiRecordDataSize()

UINT WINAPI MsiRecordDataSize ( MSIHANDLE  handle,
UINT  iField 
)

Definition at line 532 of file record.c.

533 {
534  MSIRECORD *rec;
535  UINT ret;
536 
537  TRACE( "%lu, %u\n", handle, iField );
538 
540  if( !rec )
541  return 0;
542  msiobj_lock( &rec->hdr );
543  ret = MSI_RecordDataSize( rec, iField);
544  msiobj_unlock( &rec->hdr );
545  msiobj_release( &rec->hdr );
546  return ret;
547 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
static UINT MSI_RecordDataSize(MSIRECORD *rec, UINT iField)
Definition: record.c:511
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by test_msirecord().

◆ MsiRecordGetFieldCount()

UINT WINAPI MsiRecordGetFieldCount ( MSIHANDLE  handle)

Definition at line 113 of file record.c.

114 {
115  MSIRECORD *rec;
116  UINT ret;
117 
118  TRACE( "%lu\n", handle );
119 
121  if( !rec )
122  return -1;
123 
124  msiobj_lock( &rec->hdr );
125  ret = MSI_RecordGetFieldCount( rec );
126  msiobj_unlock( &rec->hdr );
127  msiobj_release( &rec->hdr );
128 
129  return ret;
130 }
UINT MSI_RecordGetFieldCount(const MSIRECORD *rec)
Definition: record.c:108
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by check_record_(), externalui_message_callback(), externalui_record_callback(), record_invoke(), test_db(), test_integers(), test_msiinsert(), test_msirecord(), and test_packagecoltypes().

◆ MsiRecordGetInteger()

int WINAPI MsiRecordGetInteger ( MSIHANDLE  handle,
UINT  iField 
)

Definition at line 237 of file record.c.

238 {
239  MSIRECORD *rec;
240  UINT ret;
241 
242  TRACE( "%lu, %u\n", handle, iField );
243 
245  if( !rec )
246  return MSI_NULL_INTEGER;
247 
248  msiobj_lock( &rec->hdr );
249  ret = MSI_RecordGetInteger( rec, iField );
250  msiobj_unlock( &rec->hdr );
251  msiobj_release( &rec->hdr );
252 
253  return ret;
254 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
int MSI_RecordGetInteger(MSIRECORD *rec, UINT iField)
Definition: record.c:213
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define MSI_NULL_INTEGER
Definition: msiquery.h:32
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by externalui_record_callback(), get_columns_table_type(), get_integer(), MsiProcessMessage(), ok_callback(), record_invoke(), test_db(), test_dbmerge(), test_fieldzero(), test_insertorder(), test_integers(), test_msiinsert(), test_msirecord(), test_MsiRecordGetInteger(), test_order(), test_select_with_tablenames(), test_update(), test_viewfetch_wraparound(), test_viewmodify_delete_temporary(), test_viewmodify_update(), and test_where_viewmodify().

◆ MsiRecordGetStringA()

UINT WINAPI MsiRecordGetStringA ( MSIHANDLE  handle,
UINT  iField,
char szValue,
DWORD pcchValue 
)

Definition at line 403 of file record.c.

404 {
405  MSIRECORD *rec;
406  UINT ret;
407 
408  TRACE( "%lu, %d, %p, %p\n", handle, iField, szValue, pcchValue );
409 
411  if( !rec )
412  return ERROR_INVALID_HANDLE;
413  msiobj_lock( &rec->hdr );
414  ret = MSI_RecordGetStringA( rec, iField, szValue, pcchValue);
415  msiobj_unlock( &rec->hdr );
416  msiobj_release( &rec->hdr );
417  return ret;
418 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
UINT MSI_RecordGetStringA(MSIRECORD *rec, UINT iField, LPSTR szValue, LPDWORD pcchValue)
Definition: record.c:351
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by check_record(), check_record_(), externalui_message_callback(), find_prop_in_property(), get_string(), ok_callback(), test_binary(), test_binary_import(), test_collation(), test_createtable(), test_db(), test_embedded_nulls(), test_emptypackage(), test_fieldzero(), test_longstrings(), test_msiinsert(), test_msirecord(), test_MsiRecordGetString(), test_primary_keys(), test_storages_table(), test_streamtable(), and test_try_transform().

◆ MsiRecordGetStringW()

UINT WINAPI MsiRecordGetStringW ( MSIHANDLE  handle,
UINT  iField,
WCHAR szValue,
DWORD pcchValue 
)

Definition at line 482 of file record.c.

483 {
484  MSIRECORD *rec;
485  UINT ret;
486 
487  TRACE( "%lu, %u, %p, %p\n", handle, iField, szValue, pcchValue );
488 
490  if( !rec )
491  return ERROR_INVALID_HANDLE;
492 
493  msiobj_lock( &rec->hdr );
494  ret = MSI_RecordGetStringW( rec, iField, szValue, pcchValue );
495  msiobj_unlock( &rec->hdr );
496  msiobj_release( &rec->hdr );
497  return ret;
498 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158
UINT MSI_RecordGetStringW(MSIRECORD *rec, UINT iField, WCHAR *szValue, DWORD *pcchValue)
Definition: record.c:438

Referenced by record_invoke(), test_collation(), and test_msirecord().

◆ MsiRecordIsNull()

BOOL WINAPI MsiRecordIsNull ( MSIHANDLE  handle,
UINT  iField 
)

Definition at line 333 of file record.c.

334 {
335  MSIRECORD *rec;
336  UINT ret;
337 
338  TRACE( "%lu, %u\n", handle, iField );
339 
341  if( !rec )
342  return FALSE;
343  msiobj_lock( &rec->hdr );
344  ret = MSI_RecordIsNull( rec, iField );
345  msiobj_unlock( &rec->hdr );
346  msiobj_release( &rec->hdr );
347  return ret;
348 
349 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define FALSE
Definition: types.h:117
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
BOOL MSI_RecordIsNull(MSIRECORD *rec, UINT iField)
Definition: record.c:321
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by test_fieldzero(), test_msiinsert(), and test_msirecord().

◆ MsiRecordReadStream()

UINT WINAPI MsiRecordReadStream ( MSIHANDLE  handle,
UINT  iField,
char buf,
DWORD sz 
)

Definition at line 819 of file record.c.

820 {
821  MSIRECORD *rec;
822  UINT ret;
823 
824  TRACE( "%lu, %u, %p, %p\n", handle, iField, buf, sz );
825 
827  if( !rec )
828  return ERROR_INVALID_HANDLE;
829  msiobj_lock( &rec->hdr );
830  ret = MSI_RecordReadStream( rec, iField, buf, sz );
831  msiobj_unlock( &rec->hdr );
832  msiobj_release( &rec->hdr );
833  return ret;
834 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
UINT MSI_RecordReadStream(MSIRECORD *rec, UINT iField, char *buf, LPDWORD sz)
Definition: record.c:761
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by test_binary(), test_binary_import(), test_db(), test_dbmerge(), test_msirecord(), test_storages_table(), test_streamtable(), and test_try_transform().

◆ MsiRecordSetInteger()

UINT WINAPI MsiRecordSetInteger ( MSIHANDLE  handle,
UINT  iField,
int  iVal 
)

Definition at line 303 of file record.c.

304 {
305  MSIRECORD *rec;
306  UINT ret;
307 
308  TRACE( "%lu, %u, %d\n", handle, iField, iVal );
309 
311  if( !rec )
312  return ERROR_INVALID_HANDLE;
313 
314  msiobj_lock( &rec->hdr );
315  ret = MSI_RecordSetInteger( rec, iField, iVal );
316  msiobj_unlock( &rec->hdr );
317  msiobj_release( &rec->hdr );
318  return ret;
319 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
UINT MSI_RecordSetInteger(MSIRECORD *rec, UINT iField, int iVal)
Definition: record.c:280
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by generate_transform(), ok_(), record_invoke(), test_db(), test_externalui(), test_externalui_message(), test_fieldzero(), test_format_record(), test_formatrecord(), test_markers(), test_msiinsert(), test_msirecord(), test_MsiRecordGetString(), test_select_markers(), test_stringtable(), test_try_transform(), test_update(), test_view_get_error(), test_viewmodify(), test_viewmodify_assign(), test_viewmodify_delete(), test_viewmodify_delete_temporary(), test_viewmodify_insert(), test_viewmodify_merge(), test_viewmodify_refresh(), test_viewmodify_update(), and test_where_viewmodify().

◆ MsiRecordSetStreamA()

UINT WINAPI MsiRecordSetStreamA ( MSIHANDLE  hRecord,
UINT  iField,
const char szFilename 
)

Definition at line 724 of file record.c.

725 {
726  WCHAR *wstr = NULL;
727  UINT ret;
728 
729  TRACE( "%lu, %u, %s\n", hRecord, iField, debugstr_a(szFilename) );
730 
731  if( szFilename )
732  {
733  wstr = strdupAtoW( szFilename );
734  if( !wstr )
735  return ERROR_OUTOFMEMORY;
736  }
737  ret = MsiRecordSetStreamW(hRecord, iField, wstr);
738  msi_free(wstr);
739 
740  return ret;
741 }
static void msi_free(void *mem)
Definition: msipriv.h:1159
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define debugstr_a
Definition: kernel32.h:31
int ret
UINT WINAPI MsiRecordSetStreamW(MSIHANDLE handle, UINT iField, const WCHAR *szFilename)
Definition: record.c:743
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static WCHAR * strdupAtoW(const char *str)
Definition: main.c:65
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13

Referenced by add_custom_dll(), generate_transform(), test_binary(), test_customaction1(), test_dbmerge(), test_icon_table(), test_msirecord(), test_storages_table(), test_streamtable(), and test_try_transform().

◆ MsiRecordSetStreamW()

UINT WINAPI MsiRecordSetStreamW ( MSIHANDLE  handle,
UINT  iField,
const WCHAR szFilename 
)

Definition at line 743 of file record.c.

744 {
745  MSIRECORD *rec;
746  UINT ret;
747 
748  TRACE( "%lu, %u, %s\n", handle, iField, debugstr_w(szFilename) );
749 
751  if( !rec )
752  return ERROR_INVALID_HANDLE;
753 
754  msiobj_lock( &rec->hdr );
755  ret = MSI_RecordSetStreamFromFileW( rec, iField, szFilename );
756  msiobj_unlock( &rec->hdr );
757  msiobj_release( &rec->hdr );
758  return ret;
759 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define debugstr_w
Definition: kernel32.h:32
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
UINT MSI_RecordSetStreamFromFileW(MSIRECORD *rec, UINT iField, LPCWSTR szFilename)
Definition: record.c:683
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by MsiRecordSetStreamA().

◆ MsiRecordSetStringA()

UINT WINAPI MsiRecordSetStringA ( MSIHANDLE  handle,
UINT  iField,
const char szValue 
)

Definition at line 549 of file record.c.

550 {
551  WCHAR *valueW = NULL;
552  MSIRECORD *rec;
553  UINT ret;
554 
555  TRACE( "%lu, %u %s\n", handle, iField, debugstr_a(szValue) );
556 
557  if (szValue && !(valueW = strdupAtoW( szValue ))) return ERROR_OUTOFMEMORY;
558 
560  if( !rec )
561  {
562  msi_free( valueW );
563  return ERROR_INVALID_HANDLE;
564  }
565  msiobj_lock( &rec->hdr );
566  ret = MSI_RecordSetStringW( rec, iField, valueW );
567  msiobj_unlock( &rec->hdr );
568  msiobj_release( &rec->hdr );
569  msi_free( valueW );
570  return ret;
571 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
static void msi_free(void *mem)
Definition: msipriv.h:1159
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
static const WCHAR valueW[]
Definition: object.c:48
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define debugstr_a
Definition: kernel32.h:31
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
UINT MSI_RecordSetStringW(MSIRECORD *rec, UINT iField, LPCWSTR szValue)
Definition: record.c:597
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158
static WCHAR * strdupAtoW(const char *str)
Definition: main.c:65
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13

Referenced by ok_(), query_file_path(), test_db(), test_externalui(), test_externalui_message(), test_fieldzero(), test_format_record(), test_formatrecord(), test_formatrecord2(), test_formatrecord_tables(), test_join(), test_markers(), test_msiinsert(), test_msirecord(), test_MsiRecordGetInteger(), test_select_markers(), test_storages_table(), test_streamtable(), test_stringtable(), test_update(), test_viewmodify(), test_viewmodify_refresh(), test_where(), and try_insert_query().

◆ MsiRecordSetStringW()

UINT WINAPI MsiRecordSetStringW ( MSIHANDLE  handle,
UINT  iField,
const WCHAR szValue 
)

Definition at line 604 of file record.c.

605 {
606  MSIRECORD *rec;
607  UINT ret;
608 
609  TRACE( "%lu, %u, %s\n", handle, iField, debugstr_w(szValue) );
610 
612  if( !rec )
613  return ERROR_INVALID_HANDLE;
614 
615  msiobj_lock( &rec->hdr );
616  ret = MSI_RecordSetStringW( rec, iField, szValue );
617  msiobj_unlock( &rec->hdr );
618  msiobj_release( &rec->hdr );
619  return ret;
620 }
void msiobj_lock(MSIOBJECTHDR *info)
Definition: handle.c:231
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
void msiobj_unlock(MSIOBJECTHDR *info)
Definition: handle.c:236
#define debugstr_w
Definition: kernel32.h:32
#define MSIHANDLETYPE_RECORD
Definition: msipriv.h:725
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
int ret
UINT MSI_RecordSetStringW(MSIRECORD *rec, UINT iField, LPCWSTR szValue)
Definition: record.c:597
unsigned int UINT
Definition: ndis.h:50
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
Definition: handle.c:158

Referenced by record_invoke().

◆ RECORD_StreamFromFile()

static UINT RECORD_StreamFromFile ( LPCWSTR  szFile,
IStream **  pstm 
)
static

Definition at line 623 of file record.c.

624 {
625  DWORD sz, szHighWord = 0, read;
626  HANDLE handle;
627  HGLOBAL hGlob = 0;
628  HRESULT hr;
629  ULARGE_INTEGER ulSize;
630 
631  TRACE("reading %s\n", debugstr_w(szFile));
632 
633  /* read the file into memory */
636  return GetLastError();
637  sz = GetFileSize(handle, &szHighWord);
638  if( sz != INVALID_FILE_SIZE && szHighWord == 0 )
639  {
640  hGlob = GlobalAlloc(GMEM_FIXED, sz);
641  if( hGlob )
642  {
643  BOOL r = ReadFile(handle, hGlob, sz, &read, NULL) && read == sz;
644  if( !r )
645  {
646  GlobalFree(hGlob);
647  hGlob = 0;
648  }
649  }
650  }
652  if( !hGlob )
653  return ERROR_FUNCTION_FAILED;
654 
655  /* make a stream out of it, and set the correct file size */
656  hr = CreateStreamOnHGlobal(hGlob, TRUE, pstm);
657  if( FAILED( hr ) )
658  {
659  GlobalFree(hGlob);
660  return ERROR_FUNCTION_FAILED;
661  }
662 
663  /* set the correct size - CreateStreamOnHGlobal screws it up */
664  ulSize.QuadPart = sz;
665  IStream_SetSize(*pstm, ulSize);
666 
667  TRACE( "read %s, %lu bytes into IStream %p\n", debugstr_w(szFile), sz, *pstm );
668  return ERROR_SUCCESS;
669 }
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
#define CloseHandle
Definition: compat.h:598
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
#define TRUE
Definition: types.h:120
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
#define INVALID_FILE_SIZE
Definition: winbase.h:545
#define FILE_SHARE_READ
Definition: compat.h:136
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
Definition: sock.c:82
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
#define OPEN_EXISTING
Definition: compat.h:634
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
#define GMEM_FIXED
Definition: winbase.h:290
#define GENERIC_READ
Definition: compat.h:135
#define ReadFile(a, b, c, d, e)
Definition: compat.h:601
#define NULL
Definition: types.h:112
#define CreateFileW
Definition: compat.h:600
_CRTIMP int __cdecl read(_In_ int _FileHandle, _Out_writes_bytes_(_MaxCharCount) void *_DstBuf, _In_ unsigned int _MaxCharCount)

Referenced by MSI_RecordSetStreamFromFileW().

◆ string2intW()

static BOOL string2intW ( LPCWSTR  str,
int out 
)
static

Definition at line 132 of file record.c.

133 {
134  int x = 0;
135  LPCWSTR p = str;
136 
137  if( *p == '-' ) /* skip the minus sign */
138  p++;
139  while ( *p )
140  {
141  if( (*p < '0') || (*p > '9') )
142  return FALSE;
143  x *= 10;
144  x += (*p - '0');
145  p++;
146  }
147 
148  if( str[0] == '-' ) /* check if it's negative */
149  x = -x;
150  *out = x;
151 
152  return TRUE;
153 }
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define TRUE
Definition: types.h:120
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define FALSE
Definition: types.h:117
const WCHAR * str
static FILE * out
Definition: regtests2xml.c:44
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by MSI_RecordGetInteger().

◆ unmarshal_record()

UINT unmarshal_record ( const struct wire_record in,
MSIHANDLE out 
)

Definition at line 1095 of file record.c.

1096 {
1097  if (!in)
1098  {
1099  *out = 0;
1100  return ERROR_SUCCESS;
1101  }
1102 
1103  *out = MsiCreateRecord(in->count);
1104  if (!*out) return ERROR_OUTOFMEMORY;
1105 
1106  return copy_remote_record(in, *out);
1107 }
MSIHANDLE WINAPI MsiCreateRecord(UINT cParams)
Definition: record.c:92
#define ERROR_SUCCESS
Definition: deptool.c:10
static FILE * out
Definition: regtests2xml.c:44
GLuint in
Definition: glext.h:9616
UINT copy_remote_record(const struct wire_record *in, MSIHANDLE out)
Definition: record.c:1052
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13

Referenced by MsiDatabaseGetPrimaryKeysW(), MsiViewFetch(), MsiViewGetColumnInfo(), s_remote_FormatRecord(), s_remote_ProcessMessage(), s_remote_ViewExecute(), and s_remote_ViewModify().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( msidb  )