MSI: enable asynchronous dll custom action calls

Mike McCormack mike at codeweavers.com
Fri Dec 24 00:41:55 CST 2004


ChangeLog:
<aric at codeweavers.com>
* enable asynchronous dll custom action calls
-------------- next part --------------
Index: dlls/msi/action.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/action.c,v
retrieving revision 1.47
diff -u -r1.47 action.c
--- dlls/msi/action.c	23 Dec 2004 11:20:50 -0000	1.47
+++ dlls/msi/action.c	24 Dec 2004 06:30:28 -0000
@@ -1266,11 +1266,10 @@
 typedef struct 
 {
         MSIPACKAGE *package;
-        WCHAR target[MAX_PATH];
-        WCHAR source[MAX_PATH];
+        WCHAR *target;
+        WCHAR *source;
 } thread_struct;
 
-#if 0
 static DWORD WINAPI DllThread(LPVOID info)
 {
     HANDLE DLL;
@@ -1309,10 +1308,11 @@
     else
         ERR("Unable to load library\n");
     msiobj_release( &stuff->package->hdr );
-    HeapFree( GetProcessHeap(), 0, info );
+    HeapFree(GetProcessHeap(),0,stuff->source);
+    HeapFree(GetProcessHeap(),0,stuff->target);
+    HeapFree(GetProcessHeap(), 0, stuff);
     return 0;
 }
-#endif
 
 static UINT HANDLE_CustomType1(MSIPACKAGE *package, const LPWSTR source, 
                                 const LPWSTR target, const INT type)
@@ -1335,18 +1335,16 @@
 
     if (type & 0xc0)
     {
-        /* DWORD ThreadId; */
+        DWORD ThreadId;
         thread_struct *info = HeapAlloc( GetProcessHeap(), 0, sizeof(*info) );
 
-        /* msiobj_addref( &package->hdr ); */
+        msiobj_addref( &package->hdr );
         info->package = package;
-        strcpyW(info->target,target);
-        strcpyW(info->source,tmp_file);
-        TRACE("Start Asynchronous execution\n");
-        FIXME("DATABASE NOT THREADSAFE... not starting\n");
-        /* CreateThread(NULL,0,DllThread,(LPVOID)&info,0,&ThreadId); */
+        info->target = dupstrW(target);
+        info->source = dupstrW(tmp_file);
+        TRACE("Start Asynchronous execution of dll\n");
+        CreateThread(NULL,0,DllThread,(LPVOID)info,0,&ThreadId);
         /* FIXME: release the package if the CreateThread fails */
-        HeapFree( GetProcessHeap(), 0, info );
         return ERROR_SUCCESS;
     }
  
@@ -2866,6 +2864,11 @@
                     DeleteFileW(file->SourcePath);
                     rc = 0;
                 }
+                else if (rc == ERROR_FILE_NOT_FOUND)
+                {
+                    ERR("Source File Not Found!  Continueing\n");
+                    rc = 0;
+                }
                 else
                     break;
             }
@@ -3303,6 +3306,12 @@
     DWORD sz;
     UINT rc;
 
+    if (ptr==NULL)
+    {
+        TRACE("Deformatting NULL string\n");
+        *data = NULL;
+        return 0;
+    }
     /* scan for special characters */
     if (!strchrW(ptr,'[') || (strchrW(ptr,'[') && !strchrW(ptr,']')))
     {


More information about the wine-patches mailing list