Hans Leidekker : setupapi: Add a partial implementation for SetupScanFileQueue{A, W}.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 18 08:03:58 CDT 2007


Module: wine
Branch: master
Commit: 6cc0b4e88e34ac61cf45c7caac6a0be8b5cfec9e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6cc0b4e88e34ac61cf45c7caac6a0be8b5cfec9e

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Fri May 18 11:39:04 2007 +0200

setupapi: Add a partial implementation for SetupScanFileQueue{A, W}.

---

 dlls/setupapi/queue.c |   77 +++++++++++++++++++++++++++++++++++++++++++------
 include/setupapi.h    |    7 ++++
 2 files changed, 75 insertions(+), 9 deletions(-)

diff --git a/dlls/setupapi/queue.c b/dlls/setupapi/queue.c
index 0014a54..f9647ef 100644
--- a/dlls/setupapi/queue.c
+++ b/dlls/setupapi/queue.c
@@ -216,6 +216,7 @@ UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification,
     case SPFILENOTIFY_RENAMEERROR:
     case SPFILENOTIFY_STARTCOPY:
     case SPFILENOTIFY_ENDCOPY:
+    case SPFILENOTIFY_QUEUESCAN_EX:
         {
             FILEPATHS_W *pathsW = (FILEPATHS_W *)param1;
             FILEPATHS_A pathsA;
@@ -249,8 +250,18 @@ UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification,
         }
         break;
 
-    case SPFILENOTIFY_NEEDMEDIA:
     case SPFILENOTIFY_QUEUESCAN:
+        {
+            LPWSTR targetW = (LPWSTR)param1;
+            LPSTR target = strdupWtoA( targetW );
+
+            ret = callback_ctx->orig_handler( callback_ctx->orig_context, notification,
+                                              (UINT_PTR)target, param2 );
+            HeapFree( GetProcessHeap(), 0, target );
+        }
+        break;
+
+    case SPFILENOTIFY_NEEDMEDIA:
         FIXME("mapping for %d not implemented\n",notification);
     case SPFILENOTIFY_STARTQUEUE:
     case SPFILENOTIFY_ENDQUEUE:
@@ -1203,22 +1214,70 @@ BOOL WINAPI SetupCommitFileQueueW( HWND owner, HSPFILEQ handle, PSP_FILE_CALLBAC
 /***********************************************************************
  *            SetupScanFileQueueA   (SETUPAPI.@)
  */
-BOOL WINAPI SetupScanFileQueueA( HSPFILEQ queue, DWORD flags, HWND window,
-                                 PSP_FILE_CALLBACK_A callback, PVOID context, PDWORD result )
+BOOL WINAPI SetupScanFileQueueA( HSPFILEQ handle, DWORD flags, HWND window,
+                                 PSP_FILE_CALLBACK_A handler, PVOID context, PDWORD result )
 {
-    FIXME("stub\n");
-    return FALSE;
+    struct callback_WtoA_context ctx;
+
+    TRACE("%p %x %p %p %p %p\n", handle, flags, window, handler, context, result);
+
+    ctx.orig_context = context;
+    ctx.orig_handler = handler;
+
+    return SetupScanFileQueueW( handle, flags, window, QUEUE_callback_WtoA, &ctx, result );
 }
 
 
 /***********************************************************************
  *            SetupScanFileQueueW   (SETUPAPI.@)
  */
-BOOL WINAPI SetupScanFileQueueW( HSPFILEQ queue, DWORD flags, HWND window,
-                                 PSP_FILE_CALLBACK_W callback, PVOID context, PDWORD result )
+BOOL WINAPI SetupScanFileQueueW( HSPFILEQ handle, DWORD flags, HWND window,
+                                 PSP_FILE_CALLBACK_W handler, PVOID context, PDWORD result )
 {
-    FIXME("stub\n");
-    return FALSE;
+    struct file_queue *queue = handle;
+    struct file_op *op;
+    FILEPATHS_W paths;
+    UINT notification = 0;
+    BOOL ret = FALSE;
+
+    TRACE("%p %x %p %p %p %p\n", handle, flags, window, handler, context, result);
+
+    if (!queue->copy_queue.count) return TRUE;
+
+    if (flags & SPQ_SCAN_USE_CALLBACK)        notification = SPFILENOTIFY_QUEUESCAN;
+    else if (flags & SPQ_SCAN_USE_CALLBACKEX) notification = SPFILENOTIFY_QUEUESCAN_EX;
+
+    if (flags & ~(SPQ_SCAN_USE_CALLBACK | SPQ_SCAN_USE_CALLBACKEX))
+    {
+        FIXME("flags %x not fully implemented\n", flags);
+    }
+
+    paths.Source = paths.Target = NULL;
+
+    for (op = queue->copy_queue.head; op; op = op->next)
+    {
+        build_filepathsW( op, &paths );
+        switch (notification)
+        {
+        case SPFILENOTIFY_QUEUESCAN:
+            /* FIXME: handle delay flag */
+            if (handler( context,  notification, (UINT_PTR)paths.Target, 0 )) goto done;
+            break;
+        case SPFILENOTIFY_QUEUESCAN_EX:
+            if (handler( context, notification, (UINT_PTR)&paths, 0 )) goto done;
+            break;
+        default:
+            ret = TRUE; goto done;
+        }
+    }
+
+    ret = TRUE;
+
+ done:
+    if (result) *result = 0;
+    HeapFree( GetProcessHeap(), 0, (void *)paths.Source );
+    HeapFree( GetProcessHeap(), 0, (void *)paths.Target );
+    return ret;
 }
 
 
diff --git a/include/setupapi.h b/include/setupapi.h
index 475ad75..2434639 100644
--- a/include/setupapi.h
+++ b/include/setupapi.h
@@ -437,6 +437,13 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PSP_ORIGINAL_FILE_INFO)
 #define SPOST_URL   2
 #define SPOST_MAX   3
 
+#define SPQ_SCAN_FILE_PRESENCE            0x00000001
+#define SPQ_SCAN_FILE_VALIDITY            0x00000002
+#define SPQ_SCAN_USE_CALLBACK             0x00000004
+#define SPQ_SCAN_USE_CALLBACKEX           0x00000008
+#define SPQ_SCAN_INFORM_USER              0x00000010
+#define SPQ_SCAN_PRUNE_COPY_QUEUE         0x00000020
+
 #define FLG_ADDREG_DELREG_BIT             0x00008000
 #define FLG_ADDREG_BINVALUETYPE           0x00000001
 #define FLG_ADDREG_NOCLOBBER              0x00000002




More information about the wine-cvs mailing list