Implemented RegisterTypeLibraries.

This commit is contained in:
Aric Stewart 2004-07-06 18:51:16 +00:00 committed by Alexandre Julliard
parent b942e18636
commit fcb20c53f7
1 changed files with 138 additions and 8 deletions

View File

@ -142,6 +142,7 @@ static UINT ACTION_CustomAction(MSIHANDLE hPackage,const WCHAR *action);
static UINT ACTION_InstallInitialize(MSIHANDLE hPackage);
static UINT ACTION_InstallValidate(MSIHANDLE hPackage);
static UINT ACTION_ProcessComponents(MSIHANDLE hPackage);
static UINT ACTION_RegisterTypeLibraries(MSIHANDLE hPackage);
static UINT HANDLE_CustomType1(MSIHANDLE hPackage, const LPWSTR source,
const LPWSTR target, const INT type);
@ -189,7 +190,9 @@ const static WCHAR szLaunchConditions[] =
{'L','a','u','n','c','h','C','o','n','d','i','t','i','o','n','s',0};
const static WCHAR szProcessComponents[] =
{'P','r','o','c','e','s','s','C','o','m','p','o','n','e','n','t','s',0};
const static WCHAR szRegisterTypeLibraries[] =
{'R','e','g','i','s','t','e','r','T','y','p','e','L','i','b','r','a','r',
'i','e','s',0};
/********************************************************
* helper functions to get around current HACKS and such
@ -249,6 +252,22 @@ inline static int get_loaded_feature(MSIPACKAGE* package, LPCWSTR Feature )
return rc;
}
inline static int get_loaded_file(MSIPACKAGE* package, LPCWSTR file)
{
INT rc = -1;
INT i;
for (i = 0; i < package->loaded_files; i++)
{
if (strcmpW(file,package->files[i].File)==0)
{
rc = i;
break;
}
}
return rc;
}
static UINT track_tempfile(MSIHANDLE hPackage, LPCWSTR name, LPCWSTR path)
{
MSIPACKAGE *package;
@ -821,17 +840,16 @@ UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action)
rc = ACTION_DuplicateFiles(hPackage);
else if (strcmpW(action,szWriteRegistryValues)==0)
rc = ACTION_WriteRegistryValues(hPackage);
else if (strcmpW(action,szRegisterTypeLibraries)==0)
rc = ACTION_RegisterTypeLibraries(hPackage);
/*
Current called during itunes but unimplemented and seem important
ResolveSource (sets SourceDir)
ValidateProductID (sets ProductID)
CreateShortcuts (would be nice to have soon)
RegisterClassInfo
RegisterProgIdInfo (Lots to do)
RegisterTypeLibraries
RegisterUser
RegisterProduct
InstallFinalize
*/
@ -3016,10 +3034,9 @@ static void resolve_keypath(MSIHANDLE hPackage, MSIPACKAGE* package, INT
else
{
int j;
for (j = 0; j < package->loaded_files; j++)
if (strcmpW(package->files[j].File,cmp->KeyPath)==0)
break;
if (j < package->loaded_files)
j = get_loaded_file(package,cmp->KeyPath);
if (j>=0)
strcpyW(keypath,package->files[j].TargetPath);
}
}
@ -3115,6 +3132,119 @@ end:
return rc;
}
static UINT ACTION_RegisterTypeLibraries(MSIHANDLE hPackage)
{
/*
* ok this is a bit confusting.. I am given a _Component key and i believe
* that the file that is being registered as a type library is the "key file
* of that component" which i interpert to mean "The file in the KeyPath of
* that component"
*/
UINT rc;
MSIHANDLE view;
MSIHANDLE row = 0;
static const CHAR *Query = "SELECT * from TypeLib";
MSIPACKAGE* package;
ITypeLib *ptLib;
HRESULT res;
package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
rc = MsiDatabaseOpenViewA(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
rc = MsiViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
MsiViewClose(view);
MsiCloseHandle(view);
return rc;
}
while (1)
{
WCHAR component[0x100];
DWORD sz;
INT index;
rc = MsiViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
break;
}
sz = 0x100;
MsiRecordGetStringW(row,3,component,&sz);
index = get_loaded_component(package,component);
if (index < 0)
{
MsiCloseHandle(row);
continue;
}
if (!package->components[index].Enabled ||
!package->components[index].FeatureState)
{
TRACE("Skipping typelib reg due to disabled component\n");
MsiCloseHandle(row);
continue;
}
index = get_loaded_file(package,package->components[index].KeyPath);
if (index < 0)
{
MsiCloseHandle(row);
continue;
}
res = LoadTypeLib(package->files[index].TargetPath,&ptLib);
if (SUCCEEDED(res))
{
WCHAR help[MAX_PATH];
WCHAR helpid[0x100];
sz = 0x100;
MsiRecordGetStringW(row,6,helpid,&sz);
resolve_folder(hPackage,helpid,help,FALSE,FALSE,NULL);
res = RegisterTypeLib(ptLib,package->files[index].TargetPath,help);
if (!SUCCEEDED(res))
ERR("Failed to register type library %s\n",
debugstr_w(package->files[index].TargetPath));
else
{
/* yes the row has more fields than i need, but #1 is
correct and the only one i need. why make a new row */
ui_actiondata(hPackage,szRegisterTypeLibraries,row);
TRACE("Registered %s\n",
debugstr_w(package->files[index].TargetPath));
}
if (ptLib)
ITypeLib_Release(ptLib);
}
else
ERR("Failed to load type library %s\n",
debugstr_w(package->files[index].TargetPath));
MsiCloseHandle(row);
}
MsiViewClose(view);
MsiCloseHandle(view);
return rc;
}
/* Msi functions that seem approperate here */
UINT WINAPI MsiDoActionA( MSIHANDLE hInstall, LPCSTR szAction )
{