wine/dlls/msi helpers.c

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 28 04:59:22 CST 2005


ChangeSet ID:	21444
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/28 04:59:22

Modified files:
	dlls/msi       : helpers.c 

Log message:
	Mike McCormack <mike at codeweavers.com>
	If a source directory doesn't exist, use the install root instead.

Patch: http://cvs.winehq.org/patch.py?id=21444

Old revision  New revision  Changes     Path
 1.37          1.38          +69 -38     wine/dlls/msi/helpers.c

Index: wine/dlls/msi/helpers.c
diff -u -p wine/dlls/msi/helpers.c:1.37 wine/dlls/msi/helpers.c:1.38
--- wine/dlls/msi/helpers.c:1.37	28 Nov 2005 10:59:22 -0000
+++ wine/dlls/msi/helpers.c	28 Nov 2005 10:59:22 -0000
@@ -210,6 +210,24 @@ MSIFOLDER *get_loaded_folder( MSIPACKAGE
     return NULL;
 }
 
+static LPWSTR get_source_root( MSIPACKAGE *package )
+{
+    LPWSTR path, p;
+
+    path = msi_dup_property( package, cszSourceDir );
+    if (path)
+        return path;
+
+    path = msi_dup_property( package, cszDatabase );
+    if (path)
+    {
+        p = strrchrW(path,'\\');
+        if (p)
+            *(p+1) = 0;
+    }
+    return path;
+}
+
 LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source, 
                       BOOL set_prop, MSIFOLDER **folder)
 {
@@ -221,42 +239,28 @@ LPWSTR resolve_folder(MSIPACKAGE *packag
     if (!name)
         return NULL;
 
-    /* source directories appear to always be at the root */
-    if (source)
+    /* special resolving for Target and Source root dir */
+    if (strcmpW(name,cszTargetDir)==0 || strcmpW(name,cszSourceDir)==0)
     {
-        path = msi_dup_property( package, cszSourceDir );
-        if (!path)
+        if (!source)
         {
-            path = msi_dup_property( package, cszDatabase );
-            if (path)
+            LPWSTR check_path;
+            check_path = msi_dup_property( package, cszTargetDir );
+            if (!check_path)
             {
-                p = strrchrW(path,'\\');
-                if (p)
-                    *(p+1) = 0;
+                check_path = msi_dup_property( package, cszRootDrive );
+                if (set_prop)
+                    MSI_SetPropertyW(package,cszTargetDir,check_path);
             }
-        }
-        if (folder)
-            *folder = get_loaded_folder( package, name );
-        return path;
-    }
 
-    /* special resolving for Target and Source root dir */
-    if (strcmpW(name,cszTargetDir)==0 || strcmpW(name,cszSourceDir)==0)
-    {
-        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);
+            if (strcmpiW(path,check_path)!=0)
+                MSI_SetPropertyW(package,cszTargetDir,path);
+            msi_free(check_path);
         }
-
-        /* correct misbuilt target dir */
-        path = build_directory_name(2, check_path, NULL);
-        if (strcmpiW(path,check_path)!=0)
-            MSI_SetPropertyW(package,cszTargetDir,path);
-        msi_free(check_path);
+        else
+            path = get_source_root( package );
         if (folder)
             *folder = get_loaded_folder( package, name );
         return path;
@@ -269,13 +273,19 @@ LPWSTR resolve_folder(MSIPACKAGE *packag
     if (folder)
         *folder = f;
 
-    if (f->ResolvedTarget)
+    if (!source && f->ResolvedTarget)
     {
         path = strdupW( f->ResolvedTarget );
         TRACE("   already resolved to %s\n",debugstr_w(path));
         return path;
     }
-    else if (f->Property)
+    else if (source && f->ResolvedSource)
+    {
+        path = strdupW( f->ResolvedSource );
+        TRACE("   (source)already resolved to %s\n",debugstr_w(path));
+        return path;
+    }
+    else if (!source && f->Property)
     {
         path = build_directory_name( 2, f->Property, NULL );
                     
@@ -292,13 +302,34 @@ LPWSTR resolve_folder(MSIPACKAGE *packag
         TRACE(" ! Parent is %s\n", debugstr_w(parent));
 
         p = resolve_folder(package, parent, source, set_prop, NULL);
-        TRACE("   TargetDefault = %s\n", debugstr_w(f->TargetDefault));
+        if (!source)
+        {
+            TRACE("   TargetDefault = %s\n", debugstr_w(f->TargetDefault));
 
-        path = build_directory_name( 3, p, f->TargetDefault, NULL );
-        f->ResolvedTarget = strdupW( path );
-        TRACE("   resolved into %s\n",debugstr_w(path));
-        if (set_prop)
-            MSI_SetPropertyW(package,name,path);
+            path = build_directory_name( 3, p, f->TargetDefault, NULL );
+            f->ResolvedTarget = strdupW( path );
+            TRACE("target -> %s\n", debugstr_w(path));
+            if (set_prop)
+                MSI_SetPropertyW(package,name,path);
+        }
+        else 
+        {
+            if (f->SourceDefault && f->SourceDefault[0]!='.')
+                path = build_directory_name( 3, p, f->SourceDefault, NULL );
+            else
+                path = strdupW(p);
+            TRACE("source -> %s\n", debugstr_w(path));
+
+            /* if the directory doesn't exist, use the root */
+            if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW( path ))
+            {
+                msi_free( path );
+                path = get_source_root( package );
+                TRACE("defaulting to %s\n", debugstr_w(path));
+            }
+            else
+                f->ResolvedSource = strdupW( path );
+        }
         msi_free(p);
     }
     return path;



More information about the wine-cvs mailing list