Vincent Povirk : setupapi: Implement FLG_PROFITEM_GROUP.

Alexandre Julliard julliard at winehq.org
Mon Nov 24 09:17:14 CST 2008


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Nov 13 10:33:09 2008 -0600

setupapi: Implement FLG_PROFITEM_GROUP.

---

 dlls/setupapi/install.c       |  106 ++++++++++++++++++++++------------------
 dlls/setupapi/tests/install.c |    8 +++-
 include/setupapi.h            |    5 ++
 3 files changed, 70 insertions(+), 49 deletions(-)

diff --git a/dlls/setupapi/install.c b/dlls/setupapi/install.c
index 133fb33..b68aa0b 100644
--- a/dlls/setupapi/install.c
+++ b/dlls/setupapi/install.c
@@ -787,9 +787,6 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
     LPWSTR cmdline=NULL, lnkpath_end;
     unsigned int name_size;
     INFCONTEXT name_context, context;
-    IShellLinkW* shelllink=NULL;
-    IPersistFile* persistfile=NULL;
-    HRESULT initresult=E_FAIL;
     int attrs=0;
 
     static const WCHAR dotlnk[] = {'.','l','n','k',0};
@@ -799,7 +796,7 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
     if (SetupFindFirstLineW( hinf, field, Name, &name_context ))
     {
         SetupGetIntField( &name_context, 2, &attrs );
-        if (attrs) FIXME( "unhandled attributes: %x\n", attrs );
+        if (attrs & ~FLG_PROFITEM_GROUP) FIXME( "unhandled attributes: %x\n", attrs );
     }
     else return TRUE;
 
@@ -808,7 +805,7 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
     lnkpath_end = lnkpath + strlenW(lnkpath);
     if (lnkpath_end[-1] != '\\') *lnkpath_end++ = '\\';
 
-    if (SetupFindFirstLineW( hinf, field, SubDir, &context ))
+    if (!(attrs & FLG_PROFITEM_GROUP) && SetupFindFirstLineW( hinf, field, SubDir, &context ))
     {
         unsigned int subdir_size;
 
@@ -823,67 +820,80 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
         return TRUE;
 
     lnkpath_end += name_size - 1;
-    if (lnkpath+MAX_PATH < lnkpath_end + 5) return TRUE;
-    strcpyW( lnkpath_end, dotlnk );
 
-    TRACE( "link path: %s\n", debugstr_w(lnkpath) );
-
-    /* calculate command line */
-    if (SetupFindFirstLineW( hinf, field, CmdLine, &context ))
+    if (attrs & FLG_PROFITEM_GROUP)
     {
-        unsigned int dir_len=0, subdir_size=0, filename_size=0;
-        int dirid=0;
-        LPCWSTR dir;
-        LPWSTR cmdline_end;
-
-        SetupGetIntField( &context, 1, &dirid );
-        dir = DIRID_get_string( dirid );
+        SHPathPrepareForWriteW( NULL, NULL, lnkpath, SHPPFW_DIRCREATE );
+    }
+    else
+    {
+        IShellLinkW* shelllink=NULL;
+        IPersistFile* persistfile=NULL;
+        HRESULT initresult=E_FAIL;
 
-        if (dir) dir_len = strlenW(dir);
+        if (lnkpath+MAX_PATH < lnkpath_end + 5) return TRUE;
+        strcpyW( lnkpath_end, dotlnk );
 
-        SetupGetStringFieldW( &context, 2, NULL, 0, &subdir_size );
-        SetupGetStringFieldW( &context, 3, NULL, 0, &filename_size );
+        TRACE( "link path: %s\n", debugstr_w(lnkpath) );
 
-        if (dir_len && filename_size)
+        /* calculate command line */
+        if (SetupFindFirstLineW( hinf, field, CmdLine, &context ))
         {
-            cmdline = cmdline_end = HeapAlloc( GetProcessHeap(), 0, sizeof(WCHAR) * (dir_len+subdir_size+filename_size+1) );
+            unsigned int dir_len=0, subdir_size=0, filename_size=0;
+            int dirid=0;
+            LPCWSTR dir;
+            LPWSTR cmdline_end;
 
-            strcpyW( cmdline_end, dir );
-            cmdline_end += dir_len;
-            if (cmdline_end[-1] != '\\') *cmdline_end++ = '\\';
+            SetupGetIntField( &context, 1, &dirid );
+            dir = DIRID_get_string( dirid );
 
-            if (subdir_size)
+            if (dir) dir_len = strlenW(dir);
+
+            SetupGetStringFieldW( &context, 2, NULL, 0, &subdir_size );
+            SetupGetStringFieldW( &context, 3, NULL, 0, &filename_size );
+
+            if (dir_len && filename_size)
             {
-                SetupGetStringFieldW( &context, 2, cmdline_end, subdir_size, NULL );
-                cmdline_end += subdir_size-1;
+                cmdline = cmdline_end = HeapAlloc( GetProcessHeap(), 0, sizeof(WCHAR) * (dir_len+subdir_size+filename_size+1) );
+
+                strcpyW( cmdline_end, dir );
+                cmdline_end += dir_len;
                 if (cmdline_end[-1] != '\\') *cmdline_end++ = '\\';
+
+                if (subdir_size)
+                {
+                    SetupGetStringFieldW( &context, 2, cmdline_end, subdir_size, NULL );
+                    cmdline_end += subdir_size-1;
+                    if (cmdline_end[-1] != '\\') *cmdline_end++ = '\\';
+                }
+                SetupGetStringFieldW( &context, 3, cmdline_end, filename_size, NULL );
+                TRACE( "cmdline: %s\n", debugstr_w(cmdline));
             }
-            SetupGetStringFieldW( &context, 3, cmdline_end, filename_size, NULL );
-            TRACE( "cmdline: %s\n", debugstr_w(cmdline));
         }
-    }
 
-    if (!cmdline) return TRUE;
+        if (!cmdline) return TRUE;
 
-    initresult = CoInitialize(NULL);
+        initresult = CoInitialize(NULL);
 
-    if (!SUCCEEDED(CoCreateInstance( &CLSID_ShellLink, NULL,
-                                     CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID*)&shelllink)))
-        goto done;
+        if (!SUCCEEDED(CoCreateInstance( &CLSID_ShellLink, NULL,
+                                         CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID*)&shelllink)))
+            goto done;
 
-    IShellLinkW_SetPath( shelllink, cmdline );
-    SHPathPrepareForWriteW( NULL, NULL, lnkpath, SHPPFW_DIRCREATE|SHPPFW_IGNOREFILENAME );
-    if (SUCCEEDED(IShellLinkW_QueryInterface( shelllink, &IID_IPersistFile, (LPVOID*)&persistfile)))
-    {
-        TRACE( "writing link: %s\n", debugstr_w(lnkpath) );
-        IPersistFile_Save( persistfile, lnkpath, FALSE );
-        IPersistFile_Release( persistfile );
+        IShellLinkW_SetPath( shelllink, cmdline );
+        SHPathPrepareForWriteW( NULL, NULL, lnkpath, SHPPFW_DIRCREATE|SHPPFW_IGNOREFILENAME );
+        if (SUCCEEDED(IShellLinkW_QueryInterface( shelllink, &IID_IPersistFile, (LPVOID*)&persistfile)))
+        {
+            TRACE( "writing link: %s\n", debugstr_w(lnkpath) );
+            IPersistFile_Save( persistfile, lnkpath, FALSE );
+            IPersistFile_Release( persistfile );
+        }
+        IShellLinkW_Release( shelllink );
+
+    done:
+        if (SUCCEEDED(initresult)) CoUninitialize();
+        HeapFree( GetProcessHeap(), 0, cmdline );
     }
-    IShellLinkW_Release( shelllink );
 
-done:
-    if (SUCCEEDED(initresult)) CoUninitialize();
-    HeapFree( GetProcessHeap(), 0, cmdline );
     return TRUE;
 }
 
diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c
index 9be46fe..981dce3 100644
--- a/dlls/setupapi/tests/install.c
+++ b/dlls/setupapi/tests/install.c
@@ -393,7 +393,7 @@ static void test_profile_items(void)
         "[Version]\n"
         "Signature=\"$Chicago$\"\n"
         "[DefaultInstall]\n"
-        "ProfileItems=TestItem,TestItem2\n"
+        "ProfileItems=TestItem,TestItem2,TestGroup\n"
         "[TestItem]\n"
         "Name=TestItem\n"
         "CmdLine=11,,notepad.exe\n"
@@ -401,6 +401,8 @@ static void test_profile_items(void)
         "Name=TestItem2\n"
         "CmdLine=11,,notepad.exe\n"
         "SubDir=TestDir\n"
+        "[TestGroup]\n"
+        "Name=TestGroup,4\n"
         ;
 
     hShell32 = LoadLibraryA("shell32");
@@ -432,6 +434,8 @@ static void test_profile_items(void)
         ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "directory not created\n");
         snprintf(path, MAX_PATH, "%s\\TestDir\\TestItem2.lnk", commonprogs);
         ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "link not created\n");
+        snprintf(path, MAX_PATH, "%s\\TestGroup", commonprogs);
+        ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "group not created\n");
     }
 
     snprintf(path, MAX_PATH, "%s\\TestItem.lnk", commonprogs);
@@ -442,6 +446,8 @@ static void test_profile_items(void)
     DeleteFile(path);
     snprintf(path, MAX_PATH, "%s\\TestDir", commonprogs);
     RemoveDirectory(path);
+    snprintf(path, MAX_PATH, "%s\\TestGroup", commonprogs);
+    RemoveDirectory(path);
 
 cleanup:
     if (hShell32) FreeLibrary(hShell32);
diff --git a/include/setupapi.h b/include/setupapi.h
index cb680d2..88c35eb 100644
--- a/include/setupapi.h
+++ b/include/setupapi.h
@@ -1054,6 +1054,11 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PSP_INF_SIGNER_INFO)
 #define FLG_REGSVR_DLLREGISTER           0x00000001
 #define FLG_REGSVR_DLLINSTALL            0x00000002
 
+#define FLG_PROFITEM_CURRENTUSER         0x00000001
+#define FLG_PROFITEM_DELETE              0x00000002
+#define FLG_PROFITEM_GROUP               0x00000004
+#define FLG_PROFITEM_CSIDL               0x00000008
+
 #define DI_NOVCP 0x00000008
 
 /* Class installer function codes */




More information about the wine-cvs mailing list