msi: Implement the RemoveShortcuts standard action.

This commit is contained in:
Hans Leidekker 2010-02-15 10:20:01 +01:00 committed by Alexandre Julliard
parent e0756602a4
commit 2276c291fc
1 changed files with 107 additions and 57 deletions

View File

@ -3027,19 +3027,47 @@ static UINT ACTION_UnregisterTypeLibraries( MSIPACKAGE *package )
return rc; return rc;
} }
static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
{
static const WCHAR szlnk[] = {'.','l','n','k',0};
LPCWSTR directory, extension;
LPWSTR link_folder, link_file, filename;
directory = MSI_RecordGetString( row, 2 );
link_folder = resolve_folder( package, directory, FALSE, FALSE, TRUE, NULL );
/* may be needed because of a bug somewhere else */
create_full_pathW( link_folder );
filename = msi_dup_record_field( row, 3 );
reduce_to_longfilename( filename );
extension = strchrW( filename, '.' );
if (!extension || strcmpiW( extension, szlnk ))
{
int len = strlenW( filename );
filename = msi_realloc( filename, len * sizeof(WCHAR) + sizeof(szlnk) );
memcpy( filename + len, szlnk, sizeof(szlnk) );
}
link_file = build_directory_name( 2, link_folder, filename );
msi_free( link_folder );
msi_free( filename );
return link_file;
}
static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param) static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
{ {
MSIPACKAGE *package = param; MSIPACKAGE *package = param;
LPWSTR target_file, target_folder, filename; LPWSTR link_file, deformated, path;
LPCWSTR buffer, extension; LPCWSTR component, target;
MSICOMPONENT *comp; MSICOMPONENT *comp;
static const WCHAR szlnk[]={'.','l','n','k',0};
IShellLinkW *sl = NULL; IShellLinkW *sl = NULL;
IPersistFile *pf = NULL; IPersistFile *pf = NULL;
HRESULT res; HRESULT res;
buffer = MSI_RecordGetString(row,4); component = MSI_RecordGetString(row, 4);
comp = get_loaded_component(package,buffer); comp = get_loaded_component(package, component);
if (!comp) if (!comp)
return ERROR_SUCCESS; return ERROR_SUCCESS;
@ -3048,10 +3076,8 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
TRACE("Skipping shortcut creation due to disabled component\n"); TRACE("Skipping shortcut creation due to disabled component\n");
comp->Action = comp->Installed; comp->Action = comp->Installed;
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
comp->Action = INSTALLSTATE_LOCAL; comp->Action = INSTALLSTATE_LOCAL;
ui_actiondata(package,szCreateShortcuts,row); ui_actiondata(package,szCreateShortcuts,row);
@ -3072,31 +3098,10 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
goto err; goto err;
} }
buffer = MSI_RecordGetString(row,2); target = MSI_RecordGetString(row, 5);
target_folder = resolve_folder(package, buffer,FALSE,FALSE,TRUE,NULL); if (strchrW(target, '['))
/* may be needed because of a bug somewhere else */
create_full_pathW(target_folder);
filename = msi_dup_record_field( row, 3 );
reduce_to_longfilename(filename);
extension = strchrW(filename,'.');
if (!extension || strcmpiW(extension,szlnk))
{ {
int len = strlenW(filename); deformat_string(package, target, &deformated);
filename = msi_realloc(filename, len * sizeof(WCHAR) + sizeof(szlnk));
memcpy(filename + len, szlnk, sizeof(szlnk));
}
target_file = build_directory_name(2, target_folder, filename);
msi_free(target_folder);
msi_free(filename);
buffer = MSI_RecordGetString(row,5);
if (strchrW(buffer,'['))
{
LPWSTR deformated;
deformat_string(package,buffer,&deformated);
IShellLinkW_SetPath(sl,deformated); IShellLinkW_SetPath(sl,deformated);
msi_free(deformated); msi_free(deformated);
} }
@ -3108,17 +3113,16 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
if (!MSI_RecordIsNull(row,6)) if (!MSI_RecordIsNull(row,6))
{ {
LPWSTR deformated; LPCWSTR arguments = MSI_RecordGetString(row, 6);
buffer = MSI_RecordGetString(row,6); deformat_string(package, arguments, &deformated);
deformat_string(package,buffer,&deformated);
IShellLinkW_SetArguments(sl,deformated); IShellLinkW_SetArguments(sl,deformated);
msi_free(deformated); msi_free(deformated);
} }
if (!MSI_RecordIsNull(row,7)) if (!MSI_RecordIsNull(row,7))
{ {
buffer = MSI_RecordGetString(row,7); LPCWSTR description = MSI_RecordGetString(row, 7);
IShellLinkW_SetDescription(sl,buffer); IShellLinkW_SetDescription(sl, description);
} }
if (!MSI_RecordIsNull(row,8)) if (!MSI_RecordIsNull(row,8))
@ -3126,20 +3130,18 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
if (!MSI_RecordIsNull(row,9)) if (!MSI_RecordIsNull(row,9))
{ {
LPWSTR Path;
INT index; INT index;
LPCWSTR icon = MSI_RecordGetString(row, 9);
buffer = MSI_RecordGetString(row,9); path = build_icon_path(package, icon);
Path = build_icon_path(package,buffer);
index = MSI_RecordGetInteger(row,10); index = MSI_RecordGetInteger(row,10);
/* no value means 0 */ /* no value means 0 */
if (index == MSI_NULL_INTEGER) if (index == MSI_NULL_INTEGER)
index = 0; index = 0;
IShellLinkW_SetIconLocation(sl,Path,index); IShellLinkW_SetIconLocation(sl, path, index);
msi_free(Path); msi_free(path);
} }
if (!MSI_RecordIsNull(row,11)) if (!MSI_RecordIsNull(row,11))
@ -3147,18 +3149,19 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
if (!MSI_RecordIsNull(row,12)) if (!MSI_RecordIsNull(row,12))
{ {
LPWSTR Path; LPCWSTR wkdir = MSI_RecordGetString(row, 12);
buffer = MSI_RecordGetString(row,12); path = resolve_folder(package, wkdir, FALSE, FALSE, TRUE, NULL);
Path = resolve_folder(package, buffer, FALSE, FALSE, TRUE, NULL); if (path)
if (Path) IShellLinkW_SetWorkingDirectory(sl, path);
IShellLinkW_SetWorkingDirectory(sl,Path); msi_free(path);
msi_free(Path);
} }
TRACE("Writing shortcut to %s\n",debugstr_w(target_file)); link_file = get_link_file(package, row);
IPersistFile_Save(pf,target_file,FALSE);
msi_free(target_file); TRACE("Writing shortcut to %s\n", debugstr_w(link_file));
IPersistFile_Save(pf, link_file, FALSE);
msi_free(link_file);
err: err:
if (pf) if (pf)
@ -3193,6 +3196,59 @@ static UINT ACTION_CreateShortcuts(MSIPACKAGE *package)
return rc; return rc;
} }
static UINT ITERATE_RemoveShortcuts( MSIRECORD *row, LPVOID param )
{
MSIPACKAGE *package = param;
LPWSTR link_file;
LPCWSTR component;
MSICOMPONENT *comp;
component = MSI_RecordGetString( row, 4 );
comp = get_loaded_component( package, component );
if (!comp)
return ERROR_SUCCESS;
if (!ACTION_VerifyComponentForAction( comp, INSTALLSTATE_ABSENT ))
{
TRACE("Skipping, component not scheduled for uninstall\n");
comp->Action = comp->Installed;
return ERROR_SUCCESS;
}
comp->Action = INSTALLSTATE_ABSENT;
ui_actiondata( package, szRemoveShortcuts, row );
link_file = get_link_file( package, row );
TRACE("Removing shortcut file %s\n", debugstr_w( link_file ));
if (!DeleteFileW( link_file ))
{
WARN("Failed to remove shortcut file %u\n", GetLastError());
}
msi_free( link_file );
return ERROR_SUCCESS;
}
static UINT ACTION_RemoveShortcuts( MSIPACKAGE *package )
{
UINT rc;
MSIQUERY *view;
static const WCHAR query[] =
{'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
'`','S','h','o','r','t','c','u','t','`',0};
rc = MSI_DatabaseOpenViewW( package->db, query, &view );
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveShortcuts, package );
msiobj_release( &view->hdr );
return rc;
}
static UINT ITERATE_PublishIcon(MSIRECORD *row, LPVOID param) static UINT ITERATE_PublishIcon(MSIRECORD *row, LPVOID param)
{ {
MSIPACKAGE* package = param; MSIPACKAGE* package = param;
@ -6473,12 +6529,6 @@ static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package )
return msi_unimplemented_action_stub( package, "RemoveRegistryValues", table ); return msi_unimplemented_action_stub( package, "RemoveRegistryValues", table );
} }
static UINT ACTION_RemoveShortcuts( MSIPACKAGE *package )
{
static const WCHAR table[] = { 'S','h','o','r','t','c','u','t',0 };
return msi_unimplemented_action_stub( package, "RemoveShortcuts", table );
}
static UINT ACTION_SetODBCFolders( MSIPACKAGE *package ) static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
{ {
static const WCHAR table[] = { 'D','i','r','e','c','t','o','r','y',0 }; static const WCHAR table[] = { 'D','i','r','e','c','t','o','r','y',0 };