88#define SECT_HDR_SIZE (sizeof(PROPERTYSECTIONHEADER))
104 IStorage_Release( si->
storage );
108#define PID_DICTIONARY_MSI 0
109#define PID_CODEPAGE_MSI 1
110#define PID_SECURITY_MSI 19
118 case PID_CODEPAGE_MSI:
143 case PID_SECURITY_MSI:
171 if (!pPropVariantChangeType)
173 ERR(
"PropVariantChangeType function missing!\n");
200 ERR(
"unknown property ID %lu\n", idofs[
i].propid );
207 ERR(
"propid %lu has unknown type\n", idofs[
i].propid );
219 ERR(
"not enough data\n");
223 property.vt = propdata->
type;
228 str[ propdata->
u.
str.len - 1 ] = 0;
229 property.pszVal =
str;
232 property.filetime = propdata->
u.
ft;
234 property.iVal = propdata->
u.
i2;
236 property.lVal = propdata->
u.
i4;
261 TRACE(
"%p %p\n", si, stm);
265 r = IStream_Read( stm, &set_hdr, sz, &
count );
271 ERR(
"property set not big-endian %04X\n", set_hdr.
wByteOrder);
275 sz =
sizeof format_hdr;
276 r = IStream_Read( stm, &format_hdr, sz, &
count );
286 r = IStream_Seek( stm, ofs, STREAM_SEEK_SET,
NULL );
292 r = IStream_Read( stm, §ion_hdr, sz, &
count );
314 ERR(
"failed to read properties %lu %lu\n",
count, sz );
345 return (7 +
len) & ~3;
389 memset( &set_hdr, 0, sz );
395 r = IStream_Write( stm, &set_hdr, sz, &
count );
400 sz =
sizeof format_hdr;
402 format_hdr.
dwOffset =
sizeof format_hdr +
sizeof set_hdr;
403 r = IStream_Write( stm, &format_hdr, sz, &
count );
408 section_hdr.
cbSection =
sizeof section_hdr;
425 memcpy( &
data[sz], §ion_hdr,
sizeof section_hdr );
426 sz +=
sizeof section_hdr;
451 IStorage_AddRef( stg );
464 TRACE(
"%p, %u\n", stg, uiUpdateCount);
476 IStream_Release( stm );
503 IStream_Release( stm );
521 TRACE(
"%lu, %s, %u, %p\n", hDatabase,
debugstr_w(szDatabase), uiUpdateCount, pHandle );
526 if( szDatabase && szDatabase[0] )
546 ret = remote_DatabaseGetSummaryInformation(remote, uiUpdateCount, &remote_suminfo);
590 TRACE(
"%lu, %s, %u, %p\n", hDatabase,
debugstr_a(szDatabase), uiUpdateCount, pHandle );
610 TRACE(
"%lu, %p\n", hSummaryInfo, pCount );
623 ret = remote_SummaryInfoGetPropertyCount( remote, pCount );
650 *puiDataType = prop->vt;
656 *piValue = prop->iVal;
660 *piValue = prop->lVal;
678 if (
len >= *pcchValueBuf)
685 *pftValue = prop->filetime;
690 FIXME(
"Unknown property variant type\n");
715 if( prop->vt !=
VT_I4 )
729 ERR(
"no summary information!\n");
744 TRACE(
"%lu, %u, %p, %p, %p, %p, %p\n",
handle, uiProperty, puiDataType, piValue, pftValue, szValueBuf,
749 if (puiDataType) *puiDataType =
VT_EMPTY;
763 r = remote_SummaryInfoGetProperty( remote, uiProperty, puiDataType, piValue, pftValue, &
buf );
781 str.str.a = szValueBuf;
783 r =
get_prop( si, uiProperty, puiDataType, piValue, pftValue, &
str, pcchValueBuf );
795 TRACE(
"%lu, %u, %p, %p, %p, %p, %p\n",
handle, uiProperty, puiDataType, piValue, pftValue, szValueBuf,
800 if (puiDataType) *puiDataType =
VT_EMPTY;
814 r = remote_SummaryInfoGetProperty( remote, uiProperty, puiDataType, piValue, pftValue, &
buf );
830 str.str.w = szValueBuf;
832 r =
get_prop( si, uiProperty, puiDataType, piValue, pftValue, &
str, pcchValueBuf );
843 TRACE(
"%p, %u, %u, %d, %p, %p\n", si, uiProperty,
type, iValue, pftValue,
str );
854 else if( prop->vt !=
type )
868 prop->filetime = *pftValue;
914 TRACE(
"%lu, %u, %u, %d, %p, %s\n",
handle, uiProperty, uiDataType, iValue, pftValue,
debugstr_w(szValue) );
922 WARN(
"MsiSummaryInfoSetProperty not allowed during a custom action!\n");
938 FILETIME *pftValue,
const char *szValue )
944 TRACE(
"%lu, %u, %u, %d, %p, %s\n",
handle, uiProperty, uiDataType, iValue, pftValue,
debugstr_a(szValue) );
952 WARN(
"MsiSummaryInfoSetProperty not allowed during a custom action!\n");
975 r = IStorage_CreateStream( si->
storage,
L"\5SummaryInformation", grfMode, 0, 0, &stm );
979 IStream_Release( stm );
990 memset( <, 0,
sizeof(lt) );
997 if (*
end !=
'/')
return;
1001 if (*
end !=
'/')
return;
1005 if (*
end !=
' ')
return;
1011 if (*
end !=
':')
return;
1015 if (*
end !=
':')
return;
1031 case PID_CODEPAGE_MSI:
1038 case PID_SECURITY_MSI:
1066 WARN(
"unhandled prop id %u\n", *
pid);
1087 for (
i = 0;
i < num_records;
i++)
1089 for (
j = 0;
j < num_columns;
j += 2)
1096 r =
parse_prop( records[
i][
j], records[
i][
j + 1], &
pid, &int_value, &ft_value, &str_value );
1116 static const char fmt_systemtime[] =
"%04u/%02u/%02u %02u:%02u:%02u";
1118 static const char fmt_begin[] =
"%u\t";
1119 static const char data_end[] =
"\r\n";
1120 static const char fmt_int[] =
"%u";
1179 FIXME(
"Unknown property variant type\n" );
1265 WCHAR *package_code;
1277 ERR(
"Unable to open summary information stream %u\n",
r);
1288 WARN(
"Unable to query revision number %u\n",
r);
1295 str.str.w = package_code;
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static const CHAR suminfo[]
#define ERROR_NOT_ENOUGH_MEMORY
static const WCHAR empty[]
static WCHAR * strdupAtoW(const char *str)
#define ERROR_INVALID_PARAMETER
#define GetProcAddress(x, y)
#define ERROR_INVALID_HANDLE
#define WideCharToMultiByte
#define MultiByteToWideChar
static DOUBLE utc(DOUBLE time, DateInstance *date)
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
BOOL WINAPI TzSpecificLocalTimeToSystemTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation, LPSYSTEMTIME lpLocalTime, LPSYSTEMTIME lpUniversalTime)
LONG WINAPI rpc_filter(EXCEPTION_POINTERS *eptr)
UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
void * alloc_msiobject(UINT type, UINT size, msihandledestructor destroy)
MSIHANDLE alloc_msihandle(MSIOBJECTHDR *obj)
MSIHANDLE msi_get_remote(MSIHANDLE handle)
MSIHANDLE alloc_msi_remote_handle(MSIHANDLE remote)
int msiobj_release(MSIOBJECTHDR *info)
void * msihandle2msiinfo(MSIHANDLE handle, UINT type)
UINT msi_strncpyW(const WCHAR *str, int len, WCHAR *buf, DWORD *sz)
UINT msi_strncpyWtoA(const WCHAR *str, int lenW, char *buf, DWORD *sz, BOOL remote)
UINT WINAPI MsiSummaryInfoSetPropertyA(MSIHANDLE handle, UINT uiProperty, UINT uiDataType, INT iValue, FILETIME *pftValue, const char *szValue)
UINT msi_get_suminfo(IStorage *stg, UINT uiUpdateCount, MSISUMMARYINFO **ret)
UINT msi_get_db_suminfo(MSIDATABASE *db, UINT uiUpdateCount, MSISUMMARYINFO **ret)
static REFPROPVARIANT propvarSrc
UINT msi_add_suminfo(MSIDATABASE *db, LPWSTR **records, int num_records, int num_columns)
static void read_properties_from_data(PROPVARIANT *prop, LPBYTE data, DWORD sz)
UINT WINAPI MsiSummaryInfoGetPropertyA(MSIHANDLE handle, UINT uiProperty, UINT *puiDataType, INT *piValue, FILETIME *pftValue, char *szValueBuf, DWORD *pcchValueBuf)
UINT WINAPI MsiGetSummaryInformationA(MSIHANDLE hDatabase, const char *szDatabase, UINT uiUpdateCount, MSIHANDLE *pHandle)
static UINT propvar_changetype(PROPVARIANT *changed, PROPVARIANT *property, VARTYPE vt)
static DWORD write_dword(LPBYTE data, DWORD ofs, DWORD val)
static DWORD write_filetime(LPBYTE data, DWORD ofs, const FILETIME *ft)
LPWSTR msi_get_suminfo_product(IStorage *stg)
UINT WINAPI MsiCreateTransformSummaryInfoA(MSIHANDLE db, MSIHANDLE db_ref, const char *transform, int error, int validation)
static UINT load_summary_info(MSISUMMARYINFO *si, IStream *stm)
static UINT save_prop(MSISUMMARYINFO *si, HANDLE handle, UINT row)
UINT msi_load_suminfo_properties(MSIPACKAGE *package)
static UINT parse_prop(LPCWSTR prop, LPCWSTR value, UINT *pid, INT *int_value, FILETIME *ft_value, awcstring *str_value)
static void MSI_CloseSummaryInfo(MSIOBJECTHDR *arg)
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
static UINT get_prop(MSISUMMARYINFO *si, UINT uiProperty, UINT *puiDataType, INT *piValue, FILETIME *pftValue, awstring *str, DWORD *pcchValueBuf)
UINT __cdecl s_remote_SummaryInfoGetPropertyCount(MSIHANDLE suminfo, UINT *count)
static UINT suminfo_persist(MSISUMMARYINFO *si)
UINT WINAPI MsiGetSummaryInformationW(MSIHANDLE hDatabase, const WCHAR *szDatabase, UINT uiUpdateCount, MSIHANDLE *pHandle)
INT msi_suminfo_get_int32(MSISUMMARYINFO *si, UINT uiProperty)
static void free_prop(PROPVARIANT *prop)
static UINT msi_set_prop(MSISUMMARYINFO *si, UINT uiProperty, UINT uiDataType, INT iValue, FILETIME *pftValue, awcstring *str)
UINT msi_export_suminfo(MSIDATABASE *db, HANDLE handle)
static void parse_filetime(LPCWSTR str, FILETIME *ft)
UINT __cdecl s_remote_SummaryInfoGetProperty(MSIHANDLE suminfo, UINT property, UINT *type, INT *value, FILETIME *ft, LPWSTR *buf)
UINT WINAPI MsiSummaryInfoGetPropertyW(MSIHANDLE handle, UINT uiProperty, UINT *puiDataType, INT *piValue, FILETIME *pftValue, WCHAR *szValueBuf, DWORD *pcchValueBuf)
LPWSTR msi_suminfo_dup_string(MSISUMMARYINFO *si, UINT uiProperty)
UINT WINAPI MsiSummaryInfoGetPropertyCount(MSIHANDLE hSummaryInfo, UINT *pCount)
UINT WINAPI MsiSummaryInfoSetPropertyW(MSIHANDLE handle, UINT uiProperty, UINT uiDataType, INT iValue, FILETIME *pftValue, const WCHAR *szValue)
static UINT save_summary_info(const MSISUMMARYINFO *si, IStream *stm)
static MSISUMMARYINFO * create_suminfo(IStorage *stg, UINT update_count)
static DWORD write_string(LPBYTE data, DWORD ofs, LPCSTR str)
static UINT write_property_to_data(const PROPVARIANT *prop, LPBYTE data)
static UINT set_prop(MSISUMMARYINFO *si, UINT uiProperty, UINT type, INT iValue, FILETIME *pftValue, awcstring *str)
static UINT get_property_count(const PROPVARIANT *property)
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS flags
UINT WINAPI MsiSummaryInfoPersist(MSIHANDLE handle)
static UINT get_type(UINT uiProperty)
UINT WINAPI MsiCreateTransformSummaryInfoW(MSIHANDLE db, MSIHANDLE db_ref, const WCHAR *transform, int error, int validation)
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
GLuint GLuint GLsizei GLenum type
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLuint GLenum GLenum transform
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
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 GLint GLint j
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
int JSAMPARRAY int int num_rows
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
int WINAPI lstrlenA(LPCSTR lpString)
struct _FILETIME FILETIME
#define memcpy(s1, s2, n)
#define sprintf(buf, format,...)
UINT msi_set_property(MSIDATABASE *, const WCHAR *, const WCHAR *, int) DECLSPEC_HIDDEN
UINT msi_get_stream(MSIDATABASE *, const WCHAR *, IStream **) DECLSPEC_HIDDEN
static void * msi_alloc_zero(size_t len) __WINE_ALLOC_SIZE(1)
#define MSIHANDLETYPE_DATABASE
static void msi_free(void *mem)
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
#define MSIHANDLETYPE_SUMMARYINFO
#define MSIDBOPEN_TRANSACT
#define MSIDBOPEN_READONLY
_In_ DWORD _In_ DWORD dwOffset
#define STGM_SHARE_EXCLUSIVE
const FMTID FMTID_SummaryInformation
static IPropertySystem propsys
#define IsEqualGUID(rguid1, rguid2)
#define midl_user_allocate
#define GetExceptionCode()
union PROPERTY_DATA::@507 u
union awcstring::@502 str
PROPVARIANT property[MSI_MAX_PROPS]
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
#define ERROR_WRITE_FAULT
#define ERROR_FUNCTION_FAILED
#define ERROR_UNKNOWN_PROPERTY
#define ERROR_DATATYPE_MISMATCH