James Hawkins : msi: Handle the CompLocator table in the AppSearch action.
Alexandre Julliard
julliard at winehq.org
Sat Dec 8 13:43:38 CST 2007
Module: wine
Branch: master
Commit: e6431cd06e2efcbca33becacbd0d74b491d25ddd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e6431cd06e2efcbca33becacbd0d74b491d25ddd
Author: James Hawkins <truiken at gmail.com>
Date: Fri Dec 7 14:51:17 2007 -0600
msi: Handle the CompLocator table in the AppSearch action.
---
dlls/msi/appsearch.c | 70 ++++++++++++++++++++++++++++++++++++++-------
dlls/msi/tests/package.c | 20 ++----------
2 files changed, 63 insertions(+), 27 deletions(-)
diff --git a/dlls/msi/appsearch.c b/dlls/msi/appsearch.c
index 64b2d48..5f5bba8 100644
--- a/dlls/msi/appsearch.c
+++ b/dlls/msi/appsearch.c
@@ -28,6 +28,7 @@
#include "msiquery.h"
#include "msidefs.h"
#include "winver.h"
+#include "shlwapi.h"
#include "wine/unicode.h"
#include "wine/debug.h"
#include "msipriv.h"
@@ -157,30 +158,77 @@ static void ACTION_FreeSignature(MSISIGNATURE *sig)
static UINT ACTION_AppSearchComponents(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATURE *sig)
{
static const WCHAR query[] = {
- 's','e','l','e','c','t',' ','*',' ',
- 'f','r','o','m',' ',
- 'C','o','m','p','L','o','c','a','t','o','r',' ',
- 'w','h','e','r','e',' ','S','i','g','n','a','t','u','r','e','_',' ','=',' ',
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'F','R','O','M',' ',
+ '`','C','o','m','p','L','o','c','a','t','o','r','`',' ',
+ 'W','H','E','R','E',' ','`','S','i','g','n','a','t','u','r','e','_','`',' ','=',' ',
'\'','%','s','\'',0};
- MSIRECORD *row;
- LPWSTR guid;
+ static const WCHAR sigquery[] = {
+ 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+ '`','S','i','g','n','a','t','u','r','e','`',' ',
+ 'W','H','E','R','E',' ','`','S','i','g','n','a','t','u','r','e','`',' ','=',' ',
+ '\'','%','s','\'',0};
+
+ MSIRECORD *row, *rec;
+ LPCWSTR signature, guid;
+ BOOL sigpresent = TRUE;
+ BOOL isdir;
+ UINT type;
+ WCHAR path[MAX_PATH];
+ DWORD size = MAX_PATH;
+ LPWSTR ptr;
+ DWORD attr;
TRACE("%s\n", debugstr_w(sig->Name));
*appValue = NULL;
- row = MSI_QueryGetRecord( package->db, query, sig->Name );
+ row = MSI_QueryGetRecord(package->db, query, sig->Name);
if (!row)
{
TRACE("failed to query CompLocator for %s\n", debugstr_w(sig->Name));
return ERROR_SUCCESS;
}
- guid = msi_dup_record_field( row, 2 );
- FIXME("AppSearch CompLocator (%s) unimplemented\n", debugstr_w(guid));
- msi_free( guid );
- msiobj_release( &row->hdr );
+ signature = MSI_RecordGetString(row, 1);
+ guid = MSI_RecordGetString(row, 2);
+ type = MSI_RecordGetInteger(row, 3);
+
+ rec = MSI_QueryGetRecord(package->db, sigquery, signature);
+ if (!rec)
+ sigpresent = FALSE;
+
+ *path = '\0';
+ MsiLocateComponentW(guid, path, &size);
+ if (!*path)
+ goto done;
+
+ attr = GetFileAttributesW(path);
+ if (attr == INVALID_FILE_ATTRIBUTES)
+ goto done;
+ isdir = (attr & FILE_ATTRIBUTE_DIRECTORY);
+
+ if (type != msidbLocatorTypeDirectory && sigpresent && !isdir)
+ {
+ *appValue = strdupW(path);
+ }
+ else if (!sigpresent && (type != msidbLocatorTypeDirectory || isdir))
+ {
+ if (type == msidbLocatorTypeFileName)
+ {
+ ptr = strrchrW(path, '\\');
+ *(ptr + 1) = '\0';
+ }
+ else
+ PathAddBackslashW(path);
+
+ *appValue = strdupW(path);
+ }
+
+done:
+ if (rec) msiobj_release(&rec->hdr);
+ msiobj_release(&row->hdr);
return ERROR_SUCCESS;
}
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index e4ba8e5..b52aab8 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -5228,10 +5228,7 @@ static void test_complocator(void)
lstrcpyA(expected, CURR_DIR);
lstrcatA(expected, "\\abelisaurus");
- todo_wine
- {
- ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
- }
+ ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
size = MAX_PATH;
r = MsiGetPropertyA(hpkg, "BACTROSAURUS", prop, &size);
@@ -5254,10 +5251,7 @@ static void test_complocator(void)
lstrcpyA(expected, CURR_DIR);
lstrcatA(expected, "\\");
- todo_wine
- {
- ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
- }
+ ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
size = MAX_PATH;
r = MsiGetPropertyA(hpkg, "FALCARIUS", prop, &size);
@@ -5300,10 +5294,7 @@ static void test_complocator(void)
lstrcpyA(expected, CURR_DIR);
lstrcatA(expected, "\\");
- todo_wine
- {
- ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
- }
+ ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
size = MAX_PATH;
r = MsiGetPropertyA(hpkg, "NEOSODON", prop, &size);
@@ -5311,10 +5302,7 @@ static void test_complocator(void)
lstrcpyA(expected, CURR_DIR);
lstrcatA(expected, "\\neosodon\\");
- todo_wine
- {
- ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
- }
+ ok(!lstrcmpA(prop, expected), "Expected %s, got %s\n", expected, prop);
size = MAX_PATH;
r = MsiGetPropertyA(hpkg, "OLOROTITAN", prop, &size);
More information about the wine-cvs
mailing list