Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
cd73576e
Commit
cd73576e
authored
Mar 25, 2015
by
Hans Leidekker
Committed by
Alexandre Julliard
Mar 25, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msi: Avoid allocating a database handle only to retrieve the summary information.
parent
052b3a74
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
102 additions
and
109 deletions
+102
-109
msipriv.h
dlls/msi/msipriv.h
+1
-0
package.c
dlls/msi/package.c
+1
-69
suminfo.c
dlls/msi/suminfo.c
+100
-40
No files found.
dlls/msi/msipriv.h
View file @
cd73576e
...
@@ -958,6 +958,7 @@ extern INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty ) DECLSPEC
...
@@ -958,6 +958,7 @@ extern INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty ) DECLSPEC
extern
LPWSTR
msi_get_suminfo_product
(
IStorage
*
stg
)
DECLSPEC_HIDDEN
;
extern
LPWSTR
msi_get_suminfo_product
(
IStorage
*
stg
)
DECLSPEC_HIDDEN
;
extern
UINT
msi_add_suminfo
(
MSIDATABASE
*
db
,
LPWSTR
**
records
,
int
num_records
,
int
num_columns
)
DECLSPEC_HIDDEN
;
extern
UINT
msi_add_suminfo
(
MSIDATABASE
*
db
,
LPWSTR
**
records
,
int
num_records
,
int
num_columns
)
DECLSPEC_HIDDEN
;
extern
enum
platform
parse_platform
(
const
WCHAR
*
str
)
DECLSPEC_HIDDEN
;
extern
enum
platform
parse_platform
(
const
WCHAR
*
str
)
DECLSPEC_HIDDEN
;
extern
UINT
msi_load_suminfo_properties
(
MSIPACKAGE
*
package
)
DECLSPEC_HIDDEN
;
/* undocumented functions */
/* undocumented functions */
UINT
WINAPI
MsiCreateAndVerifyInstallerDirectory
(
DWORD
);
UINT
WINAPI
MsiCreateAndVerifyInstallerDirectory
(
DWORD
);
...
...
dlls/msi/package.c
View file @
cd73576e
...
@@ -1027,74 +1027,6 @@ static VOID set_installer_properties(MSIPACKAGE *package)
...
@@ -1027,74 +1027,6 @@ static VOID set_installer_properties(MSIPACKAGE *package)
msi_set_property
(
package
->
db
,
szBrowseProperty
,
szInstallDir
,
-
1
);
msi_set_property
(
package
->
db
,
szBrowseProperty
,
szInstallDir
,
-
1
);
}
}
static
UINT
msi_load_summary_properties
(
MSIPACKAGE
*
package
)
{
UINT
rc
;
MSIHANDLE
suminfo
;
MSIHANDLE
hdb
=
alloc_msihandle
(
&
package
->
db
->
hdr
);
INT
count
;
DWORD
len
;
LPWSTR
package_code
;
static
const
WCHAR
szPackageCode
[]
=
{
'P'
,
'a'
,
'c'
,
'k'
,
'a'
,
'g'
,
'e'
,
'C'
,
'o'
,
'd'
,
'e'
,
0
};
if
(
!
hdb
)
{
ERR
(
"Unable to allocate handle
\n
"
);
return
ERROR_OUTOFMEMORY
;
}
rc
=
MsiGetSummaryInformationW
(
hdb
,
NULL
,
0
,
&
suminfo
);
MsiCloseHandle
(
hdb
);
if
(
rc
!=
ERROR_SUCCESS
)
{
ERR
(
"Unable to open Summary Information
\n
"
);
return
rc
;
}
rc
=
MsiSummaryInfoGetPropertyW
(
suminfo
,
PID_PAGECOUNT
,
NULL
,
&
count
,
NULL
,
NULL
,
NULL
);
if
(
rc
!=
ERROR_SUCCESS
)
{
WARN
(
"Unable to query page count: %d
\n
"
,
rc
);
goto
done
;
}
/* load package code property */
len
=
0
;
rc
=
MsiSummaryInfoGetPropertyW
(
suminfo
,
PID_REVNUMBER
,
NULL
,
NULL
,
NULL
,
NULL
,
&
len
);
if
(
rc
!=
ERROR_MORE_DATA
)
{
WARN
(
"Unable to query revision number: %d
\n
"
,
rc
);
rc
=
ERROR_FUNCTION_FAILED
;
goto
done
;
}
len
++
;
package_code
=
msi_alloc
(
len
*
sizeof
(
WCHAR
)
);
rc
=
MsiSummaryInfoGetPropertyW
(
suminfo
,
PID_REVNUMBER
,
NULL
,
NULL
,
NULL
,
package_code
,
&
len
);
if
(
rc
!=
ERROR_SUCCESS
)
{
WARN
(
"Unable to query rev number: %d
\n
"
,
rc
);
msi_free
(
package_code
);
goto
done
;
}
msi_set_property
(
package
->
db
,
szPackageCode
,
package_code
,
len
);
msi_free
(
package_code
);
/* load package attributes */
count
=
0
;
MsiSummaryInfoGetPropertyW
(
suminfo
,
PID_WORDCOUNT
,
NULL
,
&
count
,
NULL
,
NULL
,
NULL
);
package
->
WordCount
=
count
;
done:
MsiCloseHandle
(
suminfo
);
return
rc
;
}
static
MSIPACKAGE
*
msi_alloc_package
(
void
)
static
MSIPACKAGE
*
msi_alloc_package
(
void
)
{
{
MSIPACKAGE
*
package
;
MSIPACKAGE
*
package
;
...
@@ -1187,7 +1119,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
...
@@ -1187,7 +1119,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
len
=
sprintfW
(
uilevel
,
fmtW
,
gUILevel
&
INSTALLUILEVEL_MASK
);
len
=
sprintfW
(
uilevel
,
fmtW
,
gUILevel
&
INSTALLUILEVEL_MASK
);
msi_set_property
(
package
->
db
,
szUILevel
,
uilevel
,
len
);
msi_set_property
(
package
->
db
,
szUILevel
,
uilevel
,
len
);
r
=
msi_load_sum
mary
_properties
(
package
);
r
=
msi_load_sum
info
_properties
(
package
);
if
(
r
!=
ERROR_SUCCESS
)
if
(
r
!=
ERROR_SUCCESS
)
{
{
msiobj_release
(
&
package
->
hdr
);
msiobj_release
(
&
package
->
hdr
);
...
...
dlls/msi/suminfo.c
View file @
cd73576e
...
@@ -608,26 +608,12 @@ UINT WINAPI MsiSummaryInfoGetPropertyCount(MSIHANDLE hSummaryInfo, PUINT pCount)
...
@@ -608,26 +608,12 @@ UINT WINAPI MsiSummaryInfoGetPropertyCount(MSIHANDLE hSummaryInfo, PUINT pCount)
return
ERROR_SUCCESS
;
return
ERROR_SUCCESS
;
}
}
static
UINT
get_prop
(
MSI
HANDLE
handle
,
UINT
uiProperty
,
UINT
*
puiDataTyp
e
,
static
UINT
get_prop
(
MSI
SUMMARYINFO
*
si
,
UINT
uiProperty
,
UINT
*
puiDataType
,
INT
*
piValu
e
,
INT
*
piValue
,
FILETIME
*
pftValue
,
awstring
*
str
,
DWORD
*
pcchValueBuf
)
FILETIME
*
pftValue
,
awstring
*
str
,
DWORD
*
pcchValueBuf
)
{
{
MSISUMMARYINFO
*
si
;
PROPVARIANT
*
prop
;
PROPVARIANT
*
prop
;
UINT
ret
=
ERROR_SUCCESS
;
UINT
ret
=
ERROR_SUCCESS
;
TRACE
(
"%d %d %p %p %p %p %p
\n
"
,
handle
,
uiProperty
,
puiDataType
,
piValue
,
pftValue
,
str
,
pcchValueBuf
);
if
(
uiProperty
>=
MSI_MAX_PROPS
)
{
if
(
puiDataType
)
*
puiDataType
=
VT_EMPTY
;
return
ERROR_UNKNOWN_PROPERTY
;
}
si
=
msihandle2msiinfo
(
handle
,
MSIHANDLETYPE_SUMMARYINFO
);
if
(
!
si
)
return
ERROR_INVALID_HANDLE
;
prop
=
&
si
->
property
[
uiProperty
];
prop
=
&
si
->
property
[
uiProperty
];
if
(
puiDataType
)
if
(
puiDataType
)
...
@@ -674,7 +660,6 @@ static UINT get_prop( MSIHANDLE handle, UINT uiProperty, UINT *puiDataType,
...
@@ -674,7 +660,6 @@ static UINT get_prop( MSIHANDLE handle, UINT uiProperty, UINT *puiDataType,
FIXME
(
"Unknown property variant type
\n
"
);
FIXME
(
"Unknown property variant type
\n
"
);
break
;
break
;
}
}
msiobj_release
(
&
si
->
hdr
);
return
ret
;
return
ret
;
}
}
...
@@ -723,42 +708,65 @@ UINT WINAPI MsiSummaryInfoGetPropertyA(
...
@@ -723,42 +708,65 @@ UINT WINAPI MsiSummaryInfoGetPropertyA(
MSIHANDLE
handle
,
UINT
uiProperty
,
PUINT
puiDataType
,
LPINT
piValue
,
MSIHANDLE
handle
,
UINT
uiProperty
,
PUINT
puiDataType
,
LPINT
piValue
,
FILETIME
*
pftValue
,
LPSTR
szValueBuf
,
LPDWORD
pcchValueBuf
)
FILETIME
*
pftValue
,
LPSTR
szValueBuf
,
LPDWORD
pcchValueBuf
)
{
{
MSISUMMARYINFO
*
si
;
awstring
str
;
awstring
str
;
UINT
r
;
TRACE
(
"%
d %d %p %p %p %p
%p
\n
"
,
handle
,
uiProperty
,
puiDataType
,
TRACE
(
"%
u, %u, %p, %p, %p, %p,
%p
\n
"
,
handle
,
uiProperty
,
puiDataType
,
piValue
,
pftValue
,
szValueBuf
,
pcchValueBuf
);
piValue
,
pftValue
,
szValueBuf
,
pcchValueBuf
);
if
(
uiProperty
>=
MSI_MAX_PROPS
)
{
if
(
puiDataType
)
*
puiDataType
=
VT_EMPTY
;
return
ERROR_UNKNOWN_PROPERTY
;
}
if
(
!
(
si
=
msihandle2msiinfo
(
handle
,
MSIHANDLETYPE_SUMMARYINFO
)))
return
ERROR_INVALID_HANDLE
;
str
.
unicode
=
FALSE
;
str
.
unicode
=
FALSE
;
str
.
str
.
a
=
szValueBuf
;
str
.
str
.
a
=
szValueBuf
;
return
get_prop
(
handle
,
uiProperty
,
puiDataType
,
piValue
,
r
=
get_prop
(
si
,
uiProperty
,
puiDataType
,
piValue
,
pftValue
,
&
str
,
pcchValueBuf
);
pftValue
,
&
str
,
pcchValueBuf
);
msiobj_release
(
&
si
->
hdr
);
return
r
;
}
}
UINT
WINAPI
MsiSummaryInfoGetPropertyW
(
UINT
WINAPI
MsiSummaryInfoGetPropertyW
(
MSIHANDLE
handle
,
UINT
uiProperty
,
PUINT
puiDataType
,
LPINT
piValue
,
MSIHANDLE
handle
,
UINT
uiProperty
,
PUINT
puiDataType
,
LPINT
piValue
,
FILETIME
*
pftValue
,
LPWSTR
szValueBuf
,
LPDWORD
pcchValueBuf
)
FILETIME
*
pftValue
,
LPWSTR
szValueBuf
,
LPDWORD
pcchValueBuf
)
{
{
MSISUMMARYINFO
*
si
;
awstring
str
;
awstring
str
;
UINT
r
;
TRACE
(
"%
d %d %p %p %p %p
%p
\n
"
,
handle
,
uiProperty
,
puiDataType
,
TRACE
(
"%
u, %u, %p, %p, %p, %p,
%p
\n
"
,
handle
,
uiProperty
,
puiDataType
,
piValue
,
pftValue
,
szValueBuf
,
pcchValueBuf
);
piValue
,
pftValue
,
szValueBuf
,
pcchValueBuf
);
if
(
uiProperty
>=
MSI_MAX_PROPS
)
{
if
(
puiDataType
)
*
puiDataType
=
VT_EMPTY
;
return
ERROR_UNKNOWN_PROPERTY
;
}
if
(
!
(
si
=
msihandle2msiinfo
(
handle
,
MSIHANDLETYPE_SUMMARYINFO
)))
return
ERROR_INVALID_HANDLE
;
str
.
unicode
=
TRUE
;
str
.
unicode
=
TRUE
;
str
.
str
.
w
=
szValueBuf
;
str
.
str
.
w
=
szValueBuf
;
return
get_prop
(
handle
,
uiProperty
,
puiDataType
,
piValue
,
r
=
get_prop
(
si
,
uiProperty
,
puiDataType
,
piValue
,
pftValue
,
&
str
,
pcchValueBuf
);
pftValue
,
&
str
,
pcchValueBuf
);
msiobj_release
(
&
si
->
hdr
);
return
r
;
}
}
static
UINT
set_prop
(
MSISUMMARYINFO
*
si
,
UINT
uiProperty
,
UINT
type
,
static
UINT
set_prop
(
MSISUMMARYINFO
*
si
,
UINT
uiProperty
,
UINT
type
,
INT
iValue
,
FILETIME
*
pftValue
,
awcstring
*
str
)
INT
iValue
,
FILETIME
*
pftValue
,
awcstring
*
str
)
{
{
PROPVARIANT
*
prop
;
PROPVARIANT
*
prop
;
UINT
len
;
UINT
len
;
TRACE
(
"%p %u %u %i %p %p
\n
"
,
si
,
uiProperty
,
type
,
iValue
,
TRACE
(
"%p, %u, %u, %d, %p, %p
\n
"
,
si
,
uiProperty
,
type
,
iValue
,
pftValue
,
str
);
pftValue
,
str
);
prop
=
&
si
->
property
[
uiProperty
];
prop
=
&
si
->
property
[
uiProperty
];
...
@@ -806,15 +814,15 @@ static UINT set_prop( MSISUMMARYINFO *si, UINT uiProperty, UINT type,
...
@@ -806,15 +814,15 @@ static UINT set_prop( MSISUMMARYINFO *si, UINT uiProperty, UINT type,
return
ERROR_SUCCESS
;
return
ERROR_SUCCESS
;
}
}
UINT
WINAPI
MsiSummaryInfoSetPropertyW
(
MSIHANDLE
handle
,
UINT
uiProperty
,
UINT
WINAPI
MsiSummaryInfoSetPropertyW
(
MSIHANDLE
handle
,
UINT
uiProperty
,
UINT
uiDataType
,
UINT
uiDataType
,
INT
iValue
,
FILETIME
*
pftValue
,
LPCWSTR
szValue
)
INT
iValue
,
FILETIME
*
pftValue
,
LPCWSTR
szValue
)
{
{
awcstring
str
;
awcstring
str
;
MSISUMMARYINFO
*
si
;
MSISUMMARYINFO
*
si
;
UINT
type
,
ret
;
UINT
type
,
ret
;
TRACE
(
"%
d %u %u %i %p %s
\n
"
,
handle
,
uiProperty
,
uiDataTyp
e
,
TRACE
(
"%
u, %u, %u, %d, %p, %s
\n
"
,
handle
,
uiProperty
,
uiDataType
,
iValue
,
pftValu
e
,
iValue
,
pftValue
,
debugstr_w
(
szValue
)
);
debugstr_w
(
szValue
)
);
type
=
get_type
(
uiProperty
);
type
=
get_type
(
uiProperty
);
if
(
type
==
VT_EMPTY
||
type
!=
uiDataType
)
if
(
type
==
VT_EMPTY
||
type
!=
uiDataType
)
...
@@ -826,27 +834,26 @@ UINT WINAPI MsiSummaryInfoSetPropertyW( MSIHANDLE handle, UINT uiProperty,
...
@@ -826,27 +834,26 @@ UINT WINAPI MsiSummaryInfoSetPropertyW( MSIHANDLE handle, UINT uiProperty,
if
(
uiDataType
==
VT_FILETIME
&&
!
pftValue
)
if
(
uiDataType
==
VT_FILETIME
&&
!
pftValue
)
return
ERROR_INVALID_PARAMETER
;
return
ERROR_INVALID_PARAMETER
;
si
=
msihandle2msiinfo
(
handle
,
MSIHANDLETYPE_SUMMARYINFO
);
if
(
!
(
si
=
msihandle2msiinfo
(
handle
,
MSIHANDLETYPE_SUMMARYINFO
)))
if
(
!
si
)
return
ERROR_INVALID_HANDLE
;
return
ERROR_INVALID_HANDLE
;
str
.
unicode
=
TRUE
;
str
.
unicode
=
TRUE
;
str
.
str
.
w
=
szValue
;
str
.
str
.
w
=
szValue
;
ret
=
set_prop
(
si
,
uiProperty
,
type
,
iValue
,
pftValue
,
&
str
);
ret
=
set_prop
(
si
,
uiProperty
,
type
,
iValue
,
pftValue
,
&
str
);
msiobj_release
(
&
si
->
hdr
);
msiobj_release
(
&
si
->
hdr
);
return
ret
;
return
ret
;
}
}
UINT
WINAPI
MsiSummaryInfoSetPropertyA
(
MSIHANDLE
handle
,
UINT
uiProperty
,
UINT
WINAPI
MsiSummaryInfoSetPropertyA
(
MSIHANDLE
handle
,
UINT
uiProperty
,
UINT
uiDataType
,
UINT
uiDataType
,
INT
iValue
,
FILETIME
*
pftValue
,
LPCSTR
szValue
)
INT
iValue
,
FILETIME
*
pftValue
,
LPCSTR
szValue
)
{
{
awcstring
str
;
awcstring
str
;
MSISUMMARYINFO
*
si
;
MSISUMMARYINFO
*
si
;
UINT
type
,
ret
;
UINT
type
,
ret
;
TRACE
(
"%
d %u %u %i %p %s
\n
"
,
handle
,
uiProperty
,
uiDataTyp
e
,
TRACE
(
"%
u, %u, %u, %d, %p, %s
\n
"
,
handle
,
uiProperty
,
uiDataType
,
iValue
,
pftValu
e
,
iValue
,
pftValue
,
debugstr_a
(
szValue
)
);
debugstr_a
(
szValue
)
);
type
=
get_type
(
uiProperty
);
type
=
get_type
(
uiProperty
);
if
(
type
==
VT_EMPTY
||
type
!=
uiDataType
)
if
(
type
==
VT_EMPTY
||
type
!=
uiDataType
)
...
@@ -858,14 +865,13 @@ UINT WINAPI MsiSummaryInfoSetPropertyA( MSIHANDLE handle, UINT uiProperty,
...
@@ -858,14 +865,13 @@ UINT WINAPI MsiSummaryInfoSetPropertyA( MSIHANDLE handle, UINT uiProperty,
if
(
uiDataType
==
VT_FILETIME
&&
!
pftValue
)
if
(
uiDataType
==
VT_FILETIME
&&
!
pftValue
)
return
ERROR_INVALID_PARAMETER
;
return
ERROR_INVALID_PARAMETER
;
si
=
msihandle2msiinfo
(
handle
,
MSIHANDLETYPE_SUMMARYINFO
);
if
(
!
(
si
=
msihandle2msiinfo
(
handle
,
MSIHANDLETYPE_SUMMARYINFO
)))
if
(
!
si
)
return
ERROR_INVALID_HANDLE
;
return
ERROR_INVALID_HANDLE
;
str
.
unicode
=
FALSE
;
str
.
unicode
=
FALSE
;
str
.
str
.
a
=
szValue
;
str
.
str
.
a
=
szValue
;
ret
=
set_prop
(
si
,
uiProperty
,
uiDataType
,
iValue
,
pftValue
,
&
str
);
ret
=
set_prop
(
si
,
uiProperty
,
uiDataType
,
iValue
,
pftValue
,
&
str
);
msiobj_release
(
&
si
->
hdr
);
msiobj_release
(
&
si
->
hdr
);
return
ret
;
return
ret
;
}
}
...
@@ -1046,3 +1052,57 @@ UINT WINAPI MsiCreateTransformSummaryInfoW( MSIHANDLE db, MSIHANDLE db_ref, LPCW
...
@@ -1046,3 +1052,57 @@ UINT WINAPI MsiCreateTransformSummaryInfoW( MSIHANDLE db, MSIHANDLE db_ref, LPCW
FIXME
(
"%u, %u, %s, %d, %d
\n
"
,
db
,
db_ref
,
debugstr_w
(
transform
),
error
,
validation
);
FIXME
(
"%u, %u, %s, %d, %d
\n
"
,
db
,
db_ref
,
debugstr_w
(
transform
),
error
,
validation
);
return
ERROR_FUNCTION_FAILED
;
return
ERROR_FUNCTION_FAILED
;
}
}
UINT
msi_load_suminfo_properties
(
MSIPACKAGE
*
package
)
{
static
const
WCHAR
packagecodeW
[]
=
{
'P'
,
'a'
,
'c'
,
'k'
,
'a'
,
'g'
,
'e'
,
'C'
,
'o'
,
'd'
,
'e'
,
0
};
MSISUMMARYINFO
*
si
;
WCHAR
*
package_code
;
UINT
r
,
len
;
awstring
str
;
INT
count
;
r
=
msi_get_suminfo
(
package
->
db
->
storage
,
0
,
&
si
);
if
(
r
!=
ERROR_SUCCESS
)
{
r
=
msi_get_db_suminfo
(
package
->
db
,
0
,
&
si
);
if
(
r
!=
ERROR_SUCCESS
)
{
ERR
(
"Unable to open summary information stream %u
\n
"
,
r
);
return
r
;
}
}
str
.
unicode
=
TRUE
;
str
.
str
.
w
=
NULL
;
len
=
0
;
r
=
get_prop
(
si
,
PID_REVNUMBER
,
NULL
,
NULL
,
NULL
,
&
str
,
&
len
);
if
(
r
!=
ERROR_MORE_DATA
)
{
WARN
(
"Unable to query revision number %u
\n
"
,
r
);
msiobj_release
(
&
si
->
hdr
);
return
ERROR_FUNCTION_FAILED
;
}
len
++
;
if
(
!
(
package_code
=
msi_alloc
(
len
*
sizeof
(
WCHAR
)
)))
return
ERROR_OUTOFMEMORY
;
str
.
str
.
w
=
package_code
;
r
=
get_prop
(
si
,
PID_REVNUMBER
,
NULL
,
NULL
,
NULL
,
&
str
,
&
len
);
if
(
r
!=
ERROR_SUCCESS
)
{
msi_free
(
package_code
);
msiobj_release
(
&
si
->
hdr
);
return
r
;
}
r
=
msi_set_property
(
package
->
db
,
packagecodeW
,
package_code
,
len
);
msi_free
(
package_code
);
count
=
0
;
get_prop
(
si
,
PID_WORDCOUNT
,
NULL
,
&
count
,
NULL
,
NULL
,
NULL
);
package
->
WordCount
=
count
;
msiobj_release
(
&
si
->
hdr
);
return
r
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment