setupapi: Implement FLG_PROFITEM_GROUP.

This commit is contained in:
Vincent Povirk 2008-11-13 10:33:09 -06:00 committed by Alexandre Julliard
parent 273357264a
commit b7fe5e0aa5
3 changed files with 74 additions and 53 deletions

View File

@ -787,9 +787,6 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
LPWSTR cmdline=NULL, lnkpath_end; LPWSTR cmdline=NULL, lnkpath_end;
unsigned int name_size; unsigned int name_size;
INFCONTEXT name_context, context; INFCONTEXT name_context, context;
IShellLinkW* shelllink=NULL;
IPersistFile* persistfile=NULL;
HRESULT initresult=E_FAIL;
int attrs=0; int attrs=0;
static const WCHAR dotlnk[] = {'.','l','n','k',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 )) if (SetupFindFirstLineW( hinf, field, Name, &name_context ))
{ {
SetupGetIntField( &name_context, 2, &attrs ); 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; else return TRUE;
@ -808,7 +805,7 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
lnkpath_end = lnkpath + strlenW(lnkpath); lnkpath_end = lnkpath + strlenW(lnkpath);
if (lnkpath_end[-1] != '\\') *lnkpath_end++ = '\\'; 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; unsigned int subdir_size;
@ -823,6 +820,17 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
return TRUE; return TRUE;
lnkpath_end += name_size - 1; lnkpath_end += name_size - 1;
if (attrs & FLG_PROFITEM_GROUP)
{
SHPathPrepareForWriteW( NULL, NULL, lnkpath, SHPPFW_DIRCREATE );
}
else
{
IShellLinkW* shelllink=NULL;
IPersistFile* persistfile=NULL;
HRESULT initresult=E_FAIL;
if (lnkpath+MAX_PATH < lnkpath_end + 5) return TRUE; if (lnkpath+MAX_PATH < lnkpath_end + 5) return TRUE;
strcpyW( lnkpath_end, dotlnk ); strcpyW( lnkpath_end, dotlnk );
@ -884,6 +892,8 @@ static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg )
done: done:
if (SUCCEEDED(initresult)) CoUninitialize(); if (SUCCEEDED(initresult)) CoUninitialize();
HeapFree( GetProcessHeap(), 0, cmdline ); HeapFree( GetProcessHeap(), 0, cmdline );
}
return TRUE; return TRUE;
} }

View File

@ -393,7 +393,7 @@ static void test_profile_items(void)
"[Version]\n" "[Version]\n"
"Signature=\"$Chicago$\"\n" "Signature=\"$Chicago$\"\n"
"[DefaultInstall]\n" "[DefaultInstall]\n"
"ProfileItems=TestItem,TestItem2\n" "ProfileItems=TestItem,TestItem2,TestGroup\n"
"[TestItem]\n" "[TestItem]\n"
"Name=TestItem\n" "Name=TestItem\n"
"CmdLine=11,,notepad.exe\n" "CmdLine=11,,notepad.exe\n"
@ -401,6 +401,8 @@ static void test_profile_items(void)
"Name=TestItem2\n" "Name=TestItem2\n"
"CmdLine=11,,notepad.exe\n" "CmdLine=11,,notepad.exe\n"
"SubDir=TestDir\n" "SubDir=TestDir\n"
"[TestGroup]\n"
"Name=TestGroup,4\n"
; ;
hShell32 = LoadLibraryA("shell32"); hShell32 = LoadLibraryA("shell32");
@ -432,6 +434,8 @@ static void test_profile_items(void)
ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "directory not created\n"); ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "directory not created\n");
snprintf(path, MAX_PATH, "%s\\TestDir\\TestItem2.lnk", commonprogs); snprintf(path, MAX_PATH, "%s\\TestDir\\TestItem2.lnk", commonprogs);
ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "link not created\n"); 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); snprintf(path, MAX_PATH, "%s\\TestItem.lnk", commonprogs);
@ -442,6 +446,8 @@ static void test_profile_items(void)
DeleteFile(path); DeleteFile(path);
snprintf(path, MAX_PATH, "%s\\TestDir", commonprogs); snprintf(path, MAX_PATH, "%s\\TestDir", commonprogs);
RemoveDirectory(path); RemoveDirectory(path);
snprintf(path, MAX_PATH, "%s\\TestGroup", commonprogs);
RemoveDirectory(path);
cleanup: cleanup:
if (hShell32) FreeLibrary(hShell32); if (hShell32) FreeLibrary(hShell32);

View File

@ -1054,6 +1054,11 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PSP_INF_SIGNER_INFO)
#define FLG_REGSVR_DLLREGISTER 0x00000001 #define FLG_REGSVR_DLLREGISTER 0x00000001
#define FLG_REGSVR_DLLINSTALL 0x00000002 #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 #define DI_NOVCP 0x00000008
/* Class installer function codes */ /* Class installer function codes */