Commit 9e558d74 authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

- build a standard Wine list of mime types instead of using an array

- use mime type pointers instead of array indexes
parent c8aedf97
...@@ -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,
......
...@@ -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) {
if (strcmpiW(mt->ContentType,mime)==0)
{ {
TRACE("found mime %s at index %i\n",debugstr_w(mime), i); TRACE("found mime %s (%p)\n",debugstr_w(mime), mt);
return i; 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].MIMEIndex = load_given_mime(package,buffer); package->extensions[index].Mime = 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].MIMEIndex >= 0) if (package->extensions[i].Mime)
{ {
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);
......
...@@ -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 )
{ {
......
...@@ -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;
......
...@@ -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 */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment