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