static UINT ITERATE_UnregisterFonts( MSIRECORD *row, LPVOID param ) { MSIPACKAGE *package = param; LPWSTR name; LPCWSTR filename; MSIFILE *file; HKEY hkey1, hkey2; MSIRECORD *uirow; LPWSTR uipath, p; filename = MSI_RecordGetString( row, 1 ); file = get_loaded_file( package, filename ); if (!file) { ERR("Unable to load file\n"); return ERROR_SUCCESS; } if (!file->Component->Enabled) { TRACE("component is disabled\n"); return ERROR_SUCCESS; } if (file->Component->ActionRequest != INSTALLSTATE_ABSENT) { TRACE("Component not scheduled for removal\n"); return ERROR_SUCCESS; } RegCreateKeyW( HKEY_LOCAL_MACHINE, regfont1, &hkey1 ); RegCreateKeyW( HKEY_LOCAL_MACHINE, regfont2, &hkey2 ); if (MSI_RecordIsNull( row, 2 )) name = font_name_from_file( file->TargetPath ); else name = msi_dup_record_field( row, 2 ); if (name) { RegDeleteValueW( hkey1, name ); RegDeleteValueW( hkey2, name ); } msi_free( name ); RegCloseKey( hkey1 ); RegCloseKey( hkey2 ); /* the UI chunk */ uirow = MSI_CreateRecord( 1 ); uipath = strdupW( file->TargetPath ); p = strrchrW( uipath,'\\' ); if (p) p++; else p = uipath; MSI_RecordSetStringW( uirow, 1, p ); ui_actiondata( package, szUnregisterFonts, uirow ); msiobj_release( &uirow->hdr ); msi_free( uipath ); /* FIXME: call ui_progress? */ return ERROR_SUCCESS; }
static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin) { switch (fdint) { case fdintCOPY_FILE: { CabData *data = (CabData*) pfdin->pv; HANDLE handle; LPWSTR file; MSIFILE *f; DWORD attrs; file = strdupAtoW(pfdin->psz1); f = get_loaded_file(data->package, file); msi_free(file); if (!f) { WARN("unknown file in cabinet (%s)\n",debugstr_a(pfdin->psz1)); return 0; } if (f->state != msifs_missing && f->state != msifs_overwrite) { TRACE("Skipping extraction of %s\n",debugstr_a(pfdin->psz1)); return 0; } msi_file_update_ui( data->package, f, szInstallFiles ); TRACE("extracting %s\n", debugstr_w(f->TargetPath) ); attrs = f->Attributes & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM); if (!attrs) attrs = FILE_ATTRIBUTE_NORMAL; handle = CreateFileW( f->TargetPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, attrs, NULL ); if ( handle == INVALID_HANDLE_VALUE ) { ERR("failed to create %s (error %ld)\n", debugstr_w( f->TargetPath ), GetLastError() ); return 0; } f->state = msifs_installed; return (INT_PTR) handle; } case fdintCLOSE_FILE_INFO: { FILETIME ft; FILETIME ftLocal; HANDLE handle = (HANDLE) pfdin->hf; if (!DosDateTimeToFileTime(pfdin->date, pfdin->time, &ft)) return -1; if (!LocalFileTimeToFileTime(&ft, &ftLocal)) return -1; if (!SetFileTime(handle, &ftLocal, 0, &ftLocal)) return -1; CloseHandle(handle); return 1; } default: return 0; } }
static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin) { TRACE("(%d)\n", fdint); switch (fdint) { case fdintPARTIAL_FILE: { CabData *data = (CabData *)pfdin->pv; data->mi->is_continuous = FALSE; return 0; } case fdintNEXT_CABINET: { CabData *data = (CabData *)pfdin->pv; struct media_info *mi = data->mi; LPWSTR cab = strdupAtoW(pfdin->psz1); UINT rc; msi_free(mi->disk_prompt); msi_free(mi->cabinet); msi_free(mi->volume_label); mi->disk_prompt = NULL; mi->cabinet = NULL; mi->volume_label = NULL; mi->disk_id++; mi->is_continuous = TRUE; rc = msi_media_get_disk_info(data->package, mi); if (rc != ERROR_SUCCESS) { msi_free(cab); ERR("Failed to get next cabinet information: %d\n", rc); return -1; } if (lstrcmpiW(mi->cabinet, cab)) { msi_free(cab); ERR("Continuous cabinet does not match the next cabinet in the Media table\n"); return -1; } msi_free(cab); TRACE("Searching for %s\n", debugstr_w(mi->source)); if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES) rc = msi_change_media(data->package, mi); if (rc != ERROR_SUCCESS) return -1; return 0; } case fdintCOPY_FILE: { CabData *data = (CabData*) pfdin->pv; HANDLE handle; LPWSTR file; MSIFILE *f; DWORD attrs; file = strdupAtoW(pfdin->psz1); f = get_loaded_file(data->package, file); msi_free(file); if (!f) { WARN("unknown file in cabinet (%s)\n",debugstr_a(pfdin->psz1)); return 0; } if (f->state != msifs_missing && f->state != msifs_overwrite) { TRACE("Skipping extraction of %s\n",debugstr_a(pfdin->psz1)); return 0; } msi_file_update_ui( data->package, f, szInstallFiles ); TRACE("extracting %s\n", debugstr_w(f->TargetPath) ); attrs = f->Attributes & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM); if (!attrs) attrs = FILE_ATTRIBUTE_NORMAL; handle = CreateFileW( f->TargetPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, attrs, NULL ); if ( handle == INVALID_HANDLE_VALUE ) { if ( GetFileAttributesW( f->TargetPath ) != INVALID_FILE_ATTRIBUTES ) f->state = msifs_installed; else ERR("failed to create %s (error %d)\n", debugstr_w( f->TargetPath ), GetLastError() ); return 0; } f->state = msifs_installed; return (INT_PTR) handle; } case fdintCLOSE_FILE_INFO: { CabData *data = (CabData*) pfdin->pv; FILETIME ft; FILETIME ftLocal; HANDLE handle = (HANDLE) pfdin->hf; data->mi->is_continuous = FALSE; if (!DosDateTimeToFileTime(pfdin->date, pfdin->time, &ft)) return -1; if (!LocalFileTimeToFileTime(&ft, &ftLocal)) return -1; if (!SetFileTime(handle, &ftLocal, 0, &ftLocal)) return -1; CloseHandle(handle); return 1; } default: return 0; } }
static UINT ITERATE_RegisterFonts(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPWSTR name; LPCWSTR filename; MSIFILE *file; static const WCHAR regfont1[] = {'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s',' ','N','T','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'F','o','n','t','s',0}; static const WCHAR regfont2[] = {'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'F','o','n','t','s',0}; HKEY hkey1; HKEY hkey2; MSIRECORD *uirow; LPWSTR uipath, p; filename = MSI_RecordGetString( row, 1 ); file = get_loaded_file( package, filename ); if (!file) { ERR("Unable to load file\n"); return ERROR_SUCCESS; } /* check to make sure that component is installed */ if (!ACTION_VerifyComponentForAction( file->Component, INSTALLSTATE_LOCAL)) { TRACE("Skipping: Component not scheduled for install\n"); return ERROR_SUCCESS; } RegCreateKeyW(HKEY_LOCAL_MACHINE,regfont1,&hkey1); RegCreateKeyW(HKEY_LOCAL_MACHINE,regfont2,&hkey2); if (MSI_RecordIsNull(row,2)) name = load_ttfname_from( file->TargetPath ); else name = msi_dup_record_field(row,2); if (name) { msi_reg_set_val_str( hkey1, name, file->TargetPath); msi_reg_set_val_str( hkey2, name, file->TargetPath); } msi_free(name); RegCloseKey(hkey1); RegCloseKey(hkey2); /* the UI chunk */ uirow = MSI_CreateRecord( 1 ); uipath = strdupW( file->TargetPath ); p = strrchrW(uipath,'\\'); if (p) p++; else p = uipath; MSI_RecordSetStringW( uirow, 1, p ); ui_actiondata( package, szRegisterFonts, uirow); msiobj_release( &uirow->hdr ); msi_free( uipath ); /* FIXME: call ui_progress? */ return ERROR_SUCCESS; }