Module: wine Branch: master Commit: b7fe5e0aa587f450e6d70f2994be92ecf85fc809 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7fe5e0aa587f450e6d70f2994...
Author: Vincent Povirk vincent@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 */