Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
9e558d74
Commit
9e558d74
authored
Aug 26, 2005
by
Mike McCormack
Committed by
Alexandre Julliard
Aug 26, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- build a standard Wine list of mime types instead of using an array
- use mime type pointers instead of array indexes
parent
c8aedf97
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
60 additions
and
73 deletions
+60
-73
action.h
dlls/msi/action.h
+6
-3
classes.c
dlls/msi/classes.c
+45
-64
helpers.c
dlls/msi/helpers.c
+7
-4
msipriv.h
dlls/msi/msipriv.h
+1
-2
package.c
dlls/msi/package.c
+1
-0
No files found.
dlls/msi/action.h
View file @
9e558d74
...
@@ -152,13 +152,15 @@ typedef struct tagMSICLASS
...
@@ -152,13 +152,15 @@ typedef struct tagMSICLASS
BOOL
Installed
;
BOOL
Installed
;
}
MSICLASS
;
}
MSICLASS
;
typedef
struct
tagMSIMIME
MSIMIME
;
typedef
struct
tagMSIEXTENSION
typedef
struct
tagMSIEXTENSION
{
{
WCHAR
Extension
[
256
];
/* Primary Key */
WCHAR
Extension
[
256
];
/* Primary Key */
MSICOMPONENT
*
Component
;
MSICOMPONENT
*
Component
;
INT
ProgIDIndex
;
INT
ProgIDIndex
;
LPWSTR
ProgIDText
;
LPWSTR
ProgIDText
;
INT
MIMEIndex
;
MSIMIME
*
Mime
;
MSIFEATURE
*
Feature
;
MSIFEATURE
*
Feature
;
/* not in the table, set during installation */
/* not in the table, set during installation */
BOOL
Installed
;
BOOL
Installed
;
...
@@ -188,15 +190,16 @@ typedef struct tagMSIVERB
...
@@ -188,15 +190,16 @@ typedef struct tagMSIVERB
LPWSTR
Argument
;
LPWSTR
Argument
;
}
MSIVERB
;
}
MSIVERB
;
typedef
struct
tagMSIMIME
struct
tagMSIMIME
{
{
struct
list
entry
;
LPWSTR
ContentType
;
/* Primary Key */
LPWSTR
ContentType
;
/* Primary Key */
INT
ExtensionIndex
;
INT
ExtensionIndex
;
WCHAR
CLSID
[
IDENTIFIER_SIZE
];
WCHAR
CLSID
[
IDENTIFIER_SIZE
];
MSICLASS
*
Class
;
MSICLASS
*
Class
;
/* not in the table, set during installation */
/* not in the table, set during installation */
BOOL
InstallMe
;
BOOL
InstallMe
;
}
MSIMIME
;
};
enum
SCRIPTS
{
enum
SCRIPTS
{
INSTALL_SCRIPT
=
0
,
INSTALL_SCRIPT
=
0
,
...
...
dlls/msi/classes.c
View file @
9e558d74
...
@@ -366,69 +366,62 @@ static MSICLASS *load_given_class(MSIPACKAGE *package, LPCWSTR classid)
...
@@ -366,69 +366,62 @@ static MSICLASS *load_given_class(MSIPACKAGE *package, LPCWSTR classid)
static
INT
load_given_extension
(
MSIPACKAGE
*
package
,
LPCWSTR
extension
);
static
INT
load_given_extension
(
MSIPACKAGE
*
package
,
LPCWSTR
extension
);
static
INT
load_mime
(
MSIPACKAGE
*
package
,
MSIRECORD
*
row
)
static
MSIMIME
*
load_mime
(
MSIPACKAGE
*
package
,
MSIRECORD
*
row
)
{
{
DWORD
index
=
package
->
loaded_mimes
;
DWORD
sz
;
DWORD
sz
;
LPCWSTR
buffer
;
LPCWSTR
buffer
;
MSIMIME
*
mt
;
/* fill in the data */
/* fill in the data */
package
->
loaded_mimes
++
;
mt
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
MSIMIME
)
);
if
(
package
->
loaded_mimes
==
1
)
if
(
!
mt
)
package
->
mimes
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
MSIMIME
));
return
mt
;
else
package
->
mimes
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
package
->
mimes
,
package
->
loaded_mimes
*
sizeof
(
MSIMIME
));
memset
(
&
package
->
mimes
[
index
],
0
,
sizeof
(
MSIMIME
));
package
->
mimes
[
index
].
ContentType
=
load_dynamic_stringW
(
row
,
1
);
mt
->
ContentType
=
load_dynamic_stringW
(
row
,
1
);
TRACE
(
"loading mime %s
\n
"
,
debugstr_w
(
package
->
mimes
[
index
].
ContentType
));
TRACE
(
"loading mime %s
\n
"
,
debugstr_w
(
mt
->
ContentType
));
buffer
=
MSI_RecordGetString
(
row
,
2
);
buffer
=
MSI_RecordGetString
(
row
,
2
);
package
->
mimes
[
index
].
ExtensionIndex
=
load_given_extension
(
package
,
mt
->
ExtensionIndex
=
load_given_extension
(
package
,
buffer
);
buffer
);
sz
=
IDENTIFIER_SIZE
;
sz
=
IDENTIFIER_SIZE
;
MSI_RecordGetStringW
(
row
,
3
,
package
->
mimes
[
index
].
CLSID
,
&
sz
);
MSI_RecordGetStringW
(
row
,
3
,
mt
->
CLSID
,
&
sz
);
package
->
mimes
[
index
].
Class
=
load_given_class
(
package
,
mt
->
Class
=
load_given_class
(
package
,
mt
->
CLSID
);
package
->
mimes
[
index
].
CLSID
);
return
index
;
return
mt
;
}
}
static
INT
load_given_mime
(
MSIPACKAGE
*
package
,
LPCWSTR
mime
)
static
MSIMIME
*
load_given_mime
(
MSIPACKAGE
*
package
,
LPCWSTR
mime
)
{
{
INT
rc
;
MSIRECORD
*
row
;
MSIRECORD
*
row
;
INT
i
;
static
const
WCHAR
ExecSeqQuery
[]
=
static
const
WCHAR
ExecSeqQuery
[]
=
{
'S'
,
'E'
,
'L'
,
'E'
,
'C'
,
'T'
,
' '
,
'*'
,
' '
,
'F'
,
'R'
,
'O'
,
'M'
,
' '
,
{
'S'
,
'E'
,
'L'
,
'E'
,
'C'
,
'T'
,
' '
,
'*'
,
' '
,
'F'
,
'R'
,
'O'
,
'M'
,
' '
,
'`'
,
'M'
,
'I'
,
'M'
,
'E'
,
'`'
,
' '
,
'W'
,
'H'
,
'E'
,
'R'
,
'E'
,
' '
,
'`'
,
'M'
,
'I'
,
'M'
,
'E'
,
'`'
,
' '
,
'W'
,
'H'
,
'E'
,
'R'
,
'E'
,
' '
,
'`'
,
'C'
,
'o'
,
'n'
,
't'
,
'e'
,
'n'
,
't'
,
'T'
,
'y'
,
'p'
,
'e'
,
'`'
,
' '
,
'='
,
' '
,
'`'
,
'C'
,
'o'
,
'n'
,
't'
,
'e'
,
'n'
,
't'
,
'T'
,
'y'
,
'p'
,
'e'
,
'`'
,
' '
,
'='
,
' '
,
'\''
,
'%'
,
's'
,
'\''
,
0
};
'\''
,
'%'
,
's'
,
'\''
,
0
};
MSIMIME
*
mt
;
if
(
!
mime
)
if
(
!
mime
)
return
-
1
;
return
NULL
;
/* check for mime already loaded */
/* check for mime already loaded */
for
(
i
=
0
;
i
<
package
->
loaded_mimes
;
i
++
)
LIST_FOR_EACH_ENTRY
(
mt
,
&
package
->
mimes
,
MSIMIME
,
entry
)
if
(
strcmpiW
(
package
->
mimes
[
i
].
ContentType
,
mime
)
==
0
)
{
{
TRACE
(
"found mime %s at index %i
\n
"
,
debugstr_w
(
mime
),
i
);
if
(
strcmpiW
(
mt
->
ContentType
,
mime
)
==
0
)
return
i
;
{
TRACE
(
"found mime %s (%p)
\n
"
,
debugstr_w
(
mime
),
mt
);
return
mt
;
}
}
}
row
=
MSI_QueryGetRecord
(
package
->
db
,
ExecSeqQuery
,
mime
);
row
=
MSI_QueryGetRecord
(
package
->
db
,
ExecSeqQuery
,
mime
);
if
(
!
row
)
if
(
!
row
)
return
-
1
;
return
NULL
;
rc
=
load_mime
(
package
,
row
);
mt
=
load_mime
(
package
,
row
);
msiobj_release
(
&
row
->
hdr
);
msiobj_release
(
&
row
->
hdr
);
return
rc
;
return
mt
;
}
}
static
INT
load_extension
(
MSIPACKAGE
*
package
,
MSIRECORD
*
row
)
static
INT
load_extension
(
MSIPACKAGE
*
package
,
MSIRECORD
*
row
)
...
@@ -462,7 +455,7 @@ static INT load_extension(MSIPACKAGE* package, MSIRECORD *row)
...
@@ -462,7 +455,7 @@ static INT load_extension(MSIPACKAGE* package, MSIRECORD *row)
package
->
extensions
[
index
].
ProgIDText
);
package
->
extensions
[
index
].
ProgIDText
);
buffer
=
MSI_RecordGetString
(
row
,
4
);
buffer
=
MSI_RecordGetString
(
row
,
4
);
package
->
extensions
[
index
].
M
IMEIndex
=
load_given_mime
(
package
,
buffer
);
package
->
extensions
[
index
].
M
ime
=
load_given_mime
(
package
,
buffer
);
buffer
=
MSI_RecordGetString
(
row
,
5
);
buffer
=
MSI_RecordGetString
(
row
,
5
);
package
->
extensions
[
index
].
Feature
=
get_loaded_feature
(
package
,
buffer
);
package
->
extensions
[
index
].
Feature
=
get_loaded_feature
(
package
,
buffer
);
...
@@ -736,8 +729,8 @@ static void load_classes_and_such(MSIPACKAGE *package)
...
@@ -736,8 +729,8 @@ static void load_classes_and_such(MSIPACKAGE *package)
/* check if already loaded */
/* check if already loaded */
if
(
!
list_empty
(
&
package
->
classes
)
||
if
(
!
list_empty
(
&
package
->
classes
)
||
package
->
extensions
||
package
->
progids
||
!
list_empty
(
&
package
->
mimes
)
||
package
->
verbs
||
package
->
mimes
)
package
->
extensions
||
package
->
progids
||
package
->
verbs
)
return
;
return
;
load_all_classes
(
package
);
load_all_classes
(
package
);
...
@@ -769,18 +762,10 @@ static void mark_progid_for_install(MSIPACKAGE* package, INT index)
...
@@ -769,18 +762,10 @@ static void mark_progid_for_install(MSIPACKAGE* package, INT index)
mark_progid_for_install
(
package
,
i
);
mark_progid_for_install
(
package
,
i
);
}
}
static
void
mark_mime_for_install
(
MSIPACKAGE
*
package
,
INT
index
)
static
void
mark_mime_for_install
(
MSIMIME
*
mime
)
{
{
MSIMIME
*
mime
;
if
(
!
mime
)
if
(
index
<
0
||
index
>=
package
->
loaded_mimes
)
return
;
mime
=
&
package
->
mimes
[
index
];
if
(
mime
->
InstallMe
==
TRUE
)
return
;
return
;
mime
->
InstallMe
=
TRUE
;
mime
->
InstallMe
=
TRUE
;
}
}
...
@@ -1421,8 +1406,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
...
@@ -1421,8 +1406,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
package
->
extensions
[
i
].
VerbCount
>
0
)
package
->
extensions
[
i
].
VerbCount
>
0
)
mark_progid_for_install
(
package
,
package
->
extensions
[
i
].
ProgIDIndex
);
mark_progid_for_install
(
package
,
package
->
extensions
[
i
].
ProgIDIndex
);
if
(
package
->
extensions
[
i
].
MIMEIndex
>=
0
)
mark_mime_for_install
(
package
->
extensions
[
i
].
Mime
);
mark_mime_for_install
(
package
,
package
->
extensions
[
i
].
MIMEIndex
);
extension
[
0
]
=
'.'
;
extension
[
0
]
=
'.'
;
extension
[
1
]
=
0
;
extension
[
1
]
=
0
;
...
@@ -1430,13 +1414,11 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
...
@@ -1430,13 +1414,11 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
RegCreateKeyW
(
HKEY_CLASSES_ROOT
,
extension
,
&
hkey
);
RegCreateKeyW
(
HKEY_CLASSES_ROOT
,
extension
,
&
hkey
);
if
(
package
->
extensions
[
i
].
M
IMEIndex
>=
0
)
if
(
package
->
extensions
[
i
].
M
ime
)
{
{
RegSetValueExW
(
hkey
,
szContentType
,
0
,
REG_SZ
,
RegSetValueExW
(
hkey
,
szContentType
,
0
,
REG_SZ
,
(
LPVOID
)
package
->
mimes
[
package
->
extensions
[
i
].
(
LPBYTE
)
package
->
extensions
[
i
].
Mime
->
ContentType
,
MIMEIndex
].
ContentType
,
(
strlenW
(
package
->
extensions
[
i
].
Mime
->
ContentType
)
+
1
)
*
sizeof
(
WCHAR
));
(
strlenW
(
package
->
mimes
[
package
->
extensions
[
i
].
MIMEIndex
].
ContentType
)
+
1
)
*
sizeof
(
WCHAR
));
}
}
if
(
package
->
extensions
[
i
].
ProgIDIndex
>=
0
||
if
(
package
->
extensions
[
i
].
ProgIDIndex
>=
0
||
...
@@ -1494,15 +1476,15 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
...
@@ -1494,15 +1476,15 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
static
const
WCHAR
szExten
[]
=
static
const
WCHAR
szExten
[]
=
{
'E'
,
'x'
,
't'
,
'e'
,
'n'
,
's'
,
'i'
,
'o'
,
'n'
,
0
};
{
'E'
,
'x'
,
't'
,
'e'
,
'n'
,
's'
,
'i'
,
'o'
,
'n'
,
0
};
HKEY
hkey
;
HKEY
hkey
;
INT
i
;
MSIRECORD
*
uirow
;
MSIRECORD
*
uirow
;
MSIMIME
*
mt
;
if
(
!
package
)
if
(
!
package
)
return
ERROR_INVALID_HANDLE
;
return
ERROR_INVALID_HANDLE
;
load_classes_and_such
(
package
);
load_classes_and_such
(
package
);
for
(
i
=
0
;
i
<
package
->
loaded_mimes
;
i
++
)
LIST_FOR_EACH_ENTRY
(
mt
,
&
package
->
mimes
,
MSIMIME
,
entry
)
{
{
WCHAR
extension
[
257
];
WCHAR
extension
[
257
];
LPCWSTR
exten
;
LPCWSTR
exten
;
...
@@ -1516,21 +1498,20 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
...
@@ -1516,21 +1498,20 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
* check if the MIME is to be installed. Either as requesed by an
* check if the MIME is to be installed. Either as requesed by an
* extension or Class
* extension or Class
*/
*/
package
->
mimes
[
i
].
InstallMe
=
((
package
->
mimes
[
i
].
InstallMe
)
||
mt
->
InstallMe
=
(
mt
->
InstallMe
||
(
package
->
mimes
[
i
].
Class
&&
(
mt
->
Class
&&
mt
->
Class
->
Installed
)
||
package
->
mimes
[
i
].
Class
->
Installed
)
||
(
mt
->
ExtensionIndex
>=
0
&&
(
package
->
mimes
[
i
].
ExtensionIndex
>=
0
&&
package
->
extensions
[
mt
->
ExtensionIndex
].
Installed
));
package
->
extensions
[
package
->
mimes
[
i
].
ExtensionIndex
].
Installed
));
if
(
!
package
->
mimes
[
i
].
InstallMe
)
if
(
!
mt
->
InstallMe
)
{
{
TRACE
(
"MIME %s not scheduled to be installed
\n
"
,
TRACE
(
"MIME %s not scheduled to be installed
\n
"
,
debugstr_w
(
package
->
mimes
[
i
].
ContentType
));
debugstr_w
(
mt
->
ContentType
));
continue
;
continue
;
}
}
mime
=
package
->
mimes
[
i
].
ContentType
;
mime
=
mt
->
ContentType
;
exten
=
package
->
extensions
[
package
->
mimes
[
i
].
ExtensionIndex
].
Extension
;
exten
=
package
->
extensions
[
mt
->
ExtensionIndex
].
Extension
;
extension
[
0
]
=
'.'
;
extension
[
0
]
=
'.'
;
extension
[
1
]
=
0
;
extension
[
1
]
=
0
;
strcatW
(
extension
,
exten
);
strcatW
(
extension
,
exten
);
...
@@ -1544,7 +1525,7 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
...
@@ -1544,7 +1525,7 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
HeapFree
(
GetProcessHeap
(),
0
,
key
);
HeapFree
(
GetProcessHeap
(),
0
,
key
);
if
(
package
->
mimes
[
i
].
CLSID
[
0
])
if
(
mt
->
CLSID
[
0
])
{
{
FIXME
(
"Handle non null for field 3
\n
"
);
FIXME
(
"Handle non null for field 3
\n
"
);
}
}
...
@@ -1552,7 +1533,7 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
...
@@ -1552,7 +1533,7 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
RegCloseKey
(
hkey
);
RegCloseKey
(
hkey
);
uirow
=
MSI_CreateRecord
(
2
);
uirow
=
MSI_CreateRecord
(
2
);
MSI_RecordSetStringW
(
uirow
,
1
,
package
->
mimes
[
i
].
ContentType
);
MSI_RecordSetStringW
(
uirow
,
1
,
mt
->
ContentType
);
MSI_RecordSetStringW
(
uirow
,
2
,
exten
);
MSI_RecordSetStringW
(
uirow
,
2
,
exten
);
ui_actiondata
(
package
,
szRegisterMIMEInfo
,
uirow
);
ui_actiondata
(
package
,
szRegisterMIMEInfo
,
uirow
);
msiobj_release
(
&
uirow
->
hdr
);
msiobj_release
(
&
uirow
->
hdr
);
...
...
dlls/msi/helpers.c
View file @
9e558d74
...
@@ -528,11 +528,14 @@ void ACTION_free_package_structures( MSIPACKAGE* package)
...
@@ -528,11 +528,14 @@ void ACTION_free_package_structures( MSIPACKAGE* package)
if
(
package
->
verbs
&&
package
->
loaded_verbs
>
0
)
if
(
package
->
verbs
&&
package
->
loaded_verbs
>
0
)
HeapFree
(
GetProcessHeap
(),
0
,
package
->
verbs
);
HeapFree
(
GetProcessHeap
(),
0
,
package
->
verbs
);
for
(
i
=
0
;
i
<
package
->
loaded_mimes
;
i
++
)
LIST_FOR_EACH_SAFE
(
item
,
cursor
,
&
package
->
mimes
)
HeapFree
(
GetProcessHeap
(),
0
,
package
->
mimes
[
i
].
ContentType
);
{
MSIMIME
*
mt
=
LIST_ENTRY
(
item
,
MSIMIME
,
entry
);
if
(
package
->
mimes
&&
package
->
loaded_mimes
>
0
)
list_remove
(
&
mt
->
entry
);
HeapFree
(
GetProcessHeap
(),
0
,
package
->
mimes
);
HeapFree
(
GetProcessHeap
(),
0
,
mt
->
ContentType
);
HeapFree
(
GetProcessHeap
(),
0
,
mt
);
}
LIST_FOR_EACH_SAFE
(
item
,
cursor
,
&
package
->
appids
)
LIST_FOR_EACH_SAFE
(
item
,
cursor
,
&
package
->
appids
)
{
{
...
...
dlls/msi/msipriv.h
View file @
9e558d74
...
@@ -199,8 +199,7 @@ typedef struct tagMSIPACKAGE
...
@@ -199,8 +199,7 @@ typedef struct tagMSIPACKAGE
UINT
loaded_progids
;
UINT
loaded_progids
;
struct
tagMSIVERB
*
verbs
;
struct
tagMSIVERB
*
verbs
;
UINT
loaded_verbs
;
UINT
loaded_verbs
;
struct
tagMSIMIME
*
mimes
;
struct
list
mimes
;
UINT
loaded_mimes
;
struct
list
appids
;
struct
list
appids
;
struct
tagMSISCRIPT
*
script
;
struct
tagMSISCRIPT
*
script
;
...
...
dlls/msi/package.c
View file @
9e558d74
...
@@ -388,6 +388,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db )
...
@@ -388,6 +388,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db )
list_init
(
&
package
->
subscriptions
);
list_init
(
&
package
->
subscriptions
);
list_init
(
&
package
->
appids
);
list_init
(
&
package
->
appids
);
list_init
(
&
package
->
classes
);
list_init
(
&
package
->
classes
);
list_init
(
&
package
->
mimes
);
/* OK, here is where we do a slew of things to the database to
/* OK, here is where we do a slew of things to the database to
* prep for all that is to come as a package */
* prep for all that is to come as a package */
...
...
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