msi: update target file paths on MsiSetTargetPath (for TARGETDIR)

James Hawkins truiken at gmail.com
Fri Sep 22 04:09:29 CDT 2006


On 9/21/06, Andrey Turkin <pancha at mail.nnov.ru> wrote:
> MsiSetTargetPath can be used to change target path for directory after
> CostFinalize, and all affected file paths must be recalculated. James
> Hawkins sent a patch to make Wine's MSI engine do it for most cases;
> this patch fixes one remaining "corner" case with TARGETDIR, and adds
> test for it.
>
> ChangeLog:
>
> msi: Don't treat TargetDir specifically in resolve_folder
>
>
> diff -aur wine-0.9.21/dlls/msi/helpers.c wine-0.9.21-my/dlls/msi/helpers.c
> --- wine-0.9.21/dlls/msi/helpers.c      2006-09-13 23:10:25.000000000 +0400
> +++ wine-0.9.21-my/dlls/msi/helpers.c   2006-09-22 04:26:42.000000000 +0400
> @@ -216,29 +216,13 @@
>      if (!name)
>          return NULL;
>
> -    /* special resolving for Target and Source root dir */
> -    if (strcmpW(name,cszTargetDir)==0 || strcmpW(name,cszSourceDir)==0)
> +    /* special resolving for Source root dir */
> +    if ( strcmpW(name,cszSourceDir)==0)
>      {
> -        if (!source)
> -        {
> -            LPWSTR check_path;
> -            check_path = msi_dup_property( package, cszTargetDir );
> -            if (!check_path)
> -            {
> -                check_path = msi_dup_property( package, cszRootDrive );
> -                if (set_prop)
> -                    MSI_SetPropertyW(package,cszTargetDir,check_path);
> -            }
> -
> -            /* correct misbuilt target dir */
> -            path = build_directory_name(2, check_path, NULL);
> -            clean_spaces_from_path( path );
> -            if (strcmpiW(path,check_path)!=0)
> -                MSI_SetPropertyW(package,cszTargetDir,path);
> -            msi_free(check_path);
> -        }
> -        else
> +        if (source)
>              path = get_source_root( package );
> +        else
> +            path = NULL;
>          if (folder)
>              *folder = get_loaded_folder( package, name );
>          return path;
> @@ -251,6 +235,11 @@
>      if (folder)
>          *folder = f;
>
> +    if (strcmpW(name, cszTargetDir)==0 && !f->ResolvedTarget && !f->Property)
> +    {
> +        f->Property =  msi_dup_property( package, cszRootDrive );
> +    }
> +
>      if (!source && f->ResolvedTarget)
>      {
>          path = strdupW( f->ResolvedTarget );
>

This fix is incorrect.  What happens now when we call
resolve_folder(package, "TARGETDIR", FALSE, TRUE, folder)?  Your
changelog says "Don't treat TargetDir specifically in resolve_folder"
yet you're treating it specifically right here, but without the
functionality that's still needed.  Please resend the tests with
todo_wine around failing tests.

>
> +#define ADD_SLASH(x) do { char *t; if (x[0]) {t=x+strlen(x)-1;if(t[0] != '\\' ) {t[1] ='\\';t[2] ='\0';}}} while (0)
> +

This is a really bad macro.  Please use PathAddBackslash.

-- 
James Hawkins



More information about the wine-devel mailing list