sync msi with wine 1.1.27

svn path=/trunk/; revision=42507
This commit is contained in:
Christoph von Wittich 2009-08-08 11:55:51 +00:00
parent 522d088b11
commit 50ba99e99c
30 changed files with 233 additions and 72 deletions

View file

@ -851,6 +851,7 @@ static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source,
msi_custom_action_info *info;
WCHAR package_path[MAX_PATH];
DWORD size;
UINT r;
static const WCHAR backslash[] = {'\\',0};
@ -863,7 +864,9 @@ static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCAConcurrentInstall(package, type, package_path, target, action);
return wait_thread_handle(info);
r = wait_thread_handle(info);
release_custom_action_data( info );
return r;
}
static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source,
@ -888,7 +891,9 @@ static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeDll( package, type, tmp_file, target, action );
return wait_thread_handle( info );
r = wait_thread_handle( info );
release_custom_action_data( info );
return r;
}
static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source,
@ -951,6 +956,7 @@ static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source,
{
msi_custom_action_info *info;
MSIFILE *file;
UINT r;
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
@ -963,7 +969,9 @@ static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeDll( package, type, file->TargetPath, target, action );
return wait_thread_handle( info );
r = wait_thread_handle( info );
release_custom_action_data( info );
return r;
}
static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source,
@ -1167,9 +1175,7 @@ static DWORD ACTION_CallScript( const GUID *guid )
else
ERR("failed to create handle for %p\n", info->package );
if (info->type & msidbCustomActionTypeAsync &&
info->type & msidbCustomActionTypeContinue)
release_custom_action_data( info );
release_custom_action_data( info );
return S_OK;
}
@ -1226,13 +1232,16 @@ static msi_custom_action_info *do_msidbCustomActionTypeScript(
static UINT HANDLE_CustomType37_38(MSIPACKAGE *package, LPCWSTR source,
LPCWSTR target, const INT type, LPCWSTR action)
{
UINT r;
msi_custom_action_info *info;
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
info = do_msidbCustomActionTypeScript( package, type, target, NULL, action );
return wait_thread_handle( info );
r = wait_thread_handle( info );
release_custom_action_data( info );
return r;
}
static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source,
@ -1277,6 +1286,7 @@ static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeScript( package, type, bufferw, target, action );
r = wait_thread_handle( info );
release_custom_action_data( info );
done:
msi_free(bufferw);
@ -1341,6 +1351,7 @@ static UINT HANDLE_CustomType21_22(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeScript( package, type, bufferw, target, action );
r = wait_thread_handle( info );
release_custom_action_data( info );
done:
msi_free(bufferw);
@ -1353,6 +1364,7 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
{
msi_custom_action_info *info;
WCHAR *prop;
UINT r;
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
@ -1362,7 +1374,9 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
info = do_msidbCustomActionTypeScript( package, type, prop, NULL, action );
msi_free(prop);
return wait_thread_handle( info );
r = wait_thread_handle( info );
release_custom_action_data( info );
return r;
}
void ACTION_FinishCustomActions(const MSIPACKAGE* package)

View file

@ -41,11 +41,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(msi);
DEFINE_GUID( CLSID_MsiDatabase, 0x000c1084, 0x0000, 0x0000,
0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
DEFINE_GUID( CLSID_MsiPatch, 0x000c1086, 0x0000, 0x0000,
0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
/*
* .MSI file format
*
@ -163,7 +158,8 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
}
if ( !IsEqualGUID( &stat.clsid, &CLSID_MsiDatabase ) &&
!IsEqualGUID( &stat.clsid, &CLSID_MsiPatch ) )
!IsEqualGUID( &stat.clsid, &CLSID_MsiPatch ) &&
!IsEqualGUID( &stat.clsid, &CLSID_MsiTransform ) )
{
ERR("storage GUID is not a MSI database GUID %s\n",
debugstr_guid(&stat.clsid) );
@ -417,10 +413,16 @@ static LPWSTR msi_build_createsql_columns(LPWSTR *columns_data, LPWSTR *types, D
case 'i':
lstrcpyW(extra, type_notnull);
case 'I':
if (len == 2)
if (len <= 2)
type = type_int;
else
else if (len == 4)
type = type_long;
else
{
WARN("invalid int width %u\n", len);
msi_free(columns);
return NULL;
}
break;
case 'v':
lstrcpyW(extra, type_notnull);

View file

@ -171,7 +171,7 @@ static HWND hMsiHiddenWindow;
static INT msi_dialog_scale_unit( msi_dialog *dialog, INT val )
{
return (dialog->scale * val + 5) / 10;
return MulDiv( val, dialog->scale, 12 );
}
static msi_control *msi_dialog_find_control( msi_dialog *dialog, LPCWSTR name )
@ -417,7 +417,7 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog,
return NULL;
strcpyW( control->name, name );
list_add_head( &dialog->controls, &control->entry );
list_add_tail( &dialog->controls, &control->entry );
control->handler = NULL;
control->update = NULL;
control->property = NULL;
@ -2911,7 +2911,7 @@ static INT msi_dialog_get_sans_serif_height( HWND hwnd )
if (hdc)
{
memset( &lf, 0, sizeof lf );
lf.lfHeight = MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72);
lf.lfHeight = MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72);
strcpyW( lf.lfFaceName, szSansSerif );
hFont = CreateFontIndirectW(&lf);
if (hFont)
@ -3002,37 +3002,34 @@ static void msi_dialog_adjust_dialog_pos( msi_dialog *dialog, MSIRECORD *rec, LP
AdjustWindowRect( pos, style, FALSE );
}
static BOOL msi_control_set_next( msi_control *control, msi_control *next )
static void msi_dialog_set_tab_order( msi_dialog *dialog, LPCWSTR first )
{
return SetWindowPos( next->hwnd, control->hwnd, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW |
SWP_NOREPOSITION | SWP_NOSENDCHANGING | SWP_NOSIZE );
}
struct list tab_chain;
msi_control *control;
HWND prev = HWND_TOP;
static UINT msi_dialog_set_tab_order( msi_dialog *dialog )
{
msi_control *control, *tab_next;
list_init( &tab_chain );
if (!(control = msi_dialog_find_control( dialog, first ))) return;
LIST_FOR_EACH_ENTRY( control, &dialog->controls, msi_control, entry )
dialog->hWndFocus = control->hwnd;
while (control)
{
tab_next = msi_dialog_find_control( dialog, control->tabnext );
if( !tab_next )
continue;
msi_control_set_next( control, tab_next );
list_remove( &control->entry );
list_add_tail( &tab_chain, &control->entry );
if (!control->tabnext) break;
control = msi_dialog_find_control( dialog, control->tabnext );
}
return ERROR_SUCCESS;
}
LIST_FOR_EACH_ENTRY( control, &tab_chain, msi_control, entry )
{
SetWindowPos( control->hwnd, prev, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW |
SWP_NOREPOSITION | SWP_NOSENDCHANGING | SWP_NOSIZE );
prev = control->hwnd;
}
static void msi_dialog_set_first_control( msi_dialog* dialog, LPCWSTR name )
{
msi_control *control;
control = msi_dialog_find_control( dialog, name );
if( control )
dialog->hWndFocus = control->hwnd;
else
dialog->hWndFocus = NULL;
/* put them back on the main list */
list_move_head( &dialog->controls, &tab_chain );
}
static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
@ -3082,8 +3079,7 @@ static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
msi_dialog_build_font_list( dialog );
msi_dialog_fill_controls( dialog );
msi_dialog_evaluate_control_conditions( dialog );
msi_dialog_set_tab_order( dialog );
msi_dialog_set_first_control( dialog, MSI_RecordGetString( rec, 8 ) );
msi_dialog_set_tab_order( dialog, MSI_RecordGetString( rec, 8 ) );
msiobj_release( &rec->hdr );
return 0;

View file

@ -38,6 +38,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
#include "msi_Hu.rc"
#include "msi_It.rc"
#include "msi_Ko.rc"
#include "msi_Lt.rc"
#include "msi_Nl.rc"
#include "msi_No.rc"
#include "msi_Pl.rc"

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
#pragma code_page(65001)

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -18,17 +18,23 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
/* UTF-8 */
#pragma code_page(65001)
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
4 "The specified installation package could not be opened. Please check the file path and try again."
4 "Le paquet d'installation spécifié n'a pu être ouvert. Veuillez vérifier le chemin du fichier et réessayer."
5 "Le chemin %s est introuvable"
9 "insérez le disque %s"
10 "mauvais paramètres"
9 "insérez le disque %s"
10 "mauvais paramètres"
11 "saisissez le nom du dossier contenant %s"
12 "source d'installation pour la fonctionnalité manquante"
13 "lecteur réseau pour la fonctionnalité manquant"
14 "fonctionnalité depuis:"
15 "sélectionnez le dossier contenant %s"
12 "source d'installation pour la fonctionnalité manquante"
13 "lecteur réseau pour la fonctionnalité manquante"
14 "fonctionnalité depuis :"
15 "sélectionnez le dossier contenant %s"
}
#pragma code_page(default)

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -0,0 +1,40 @@
/*
* Lithuanian resources for MSI
*
* Copyright 2009 Aurimas Fišeras <aurimas@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
/* UTF-8 */
#pragma code_page(65001)
LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
4 "Nepavyko atverti nurodyto diegimo paketo. Patikrinkite failo kelią ir mėginkite dar kartą."
5 "kelias %s nerastas"
9 "įdėkite diską %s"
10 "blogi parametrai"
11 "įveskite aplanką, kuris turi %s"
12 "trūksta diegimo šaltinio komponentui"
13 "trūksta tinklo disko komponentui"
14 "komponentas iš:"
15 "parinkite aplanką, kuris turi %s"
}
#pragma code_page(default)

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE DISCARDABLE

View file

@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
STRINGTABLE DISCARDABLE

View file

@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@ -33,5 +35,4 @@ STRINGTABLE DISCARDABLE
14 "caracteristică de la:"
15 "selectați fișierul care conține %s"
}
#pragma code_page(default)

View file

@ -18,17 +18,23 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
/* UTF-8 */
#pragma code_page(65001)
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
4 "Указанный пакет не может быть открыт. Проверьте файл и повторите попытку."
5 "путь %s не найден"
9 "вставьте диск %s"
10 "неверные параметры"
11 "укажите каталог, содержащий %s"
12 "источник установки данной возможности не указан"
13 "сетевой диск для данной возможности не указан"
14 "возможность из:"
15 "выберите каталог, содержащий %s"
4 "Указанный пакет не может быть открыт. Проверьте файл и повторите попытку."
5 "путь %s не найден"
9 "вставьте диск %s"
10 "неверные параметры"
11 "укажите каталог, содержащий %s"
12 "источник установки данной возможности не указан"
13 "сетевой диск для данной возможности не указан"
14 "возможность из:"
15 "выберите каталог, содержащий %s"
}
#pragma code_page(default)

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@ -34,5 +36,4 @@ STRINGTABLE DISCARDABLE
14 "funkcija z:"
15 "izberite mapo, ki vsebuje %s"
}
#pragma code_page(default)

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@ -50,5 +52,3 @@ STRINGTABLE DISCARDABLE
14 "功能來自:"
15 "選擇包含 %s 的檔案夾"
}
#pragma code_page(default)

View file

@ -605,6 +605,10 @@ DEFINE_GUID(CLSID_IMsiServerMessage, 0x000C101D,0x0000,0x0000,0xC0,0x00,0x00,0x0
DEFINE_GUID(CLSID_IWineMsiRemoteCustomAction,0xBA26E6FA,0x4F27,0x4f56,0x95,0x3A,0x3F,0x90,0x27,0x20,0x18,0xAA);
DEFINE_GUID(CLSID_IWineMsiRemotePackage,0x902b3592,0x9d08,0x4dfd,0xa5,0x93,0xd0,0x7c,0x52,0x54,0x64,0x21);
DEFINE_GUID(CLSID_MsiTransform, 0x000c1082,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
DEFINE_GUID(CLSID_MsiDatabase, 0x000c1084,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
DEFINE_GUID(CLSID_MsiPatch, 0x000c1086,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
/* handle unicode/ascii output in the Msi* API functions */
typedef struct {
BOOL unicode;

View file

@ -716,8 +716,6 @@ MSIHANDLE WINAPI MsiGetLastErrorRecord( void )
return 0;
}
DEFINE_GUID( CLSID_MsiTransform, 0x000c1082, 0x0000, 0x0000, 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db,
LPCWSTR szTransformFile, int iErrorCond )
{

View file

@ -424,4 +424,4 @@ library WindowsInstaller
properties:
methods:
}
}
}

View file

@ -121,16 +121,23 @@ static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo,
static UINT get_tablecolumns( MSIDATABASE *db,
LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz);
static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count );
static UINT table_find_insert_idx (MSIVIEW *view, LPCWSTR name, INT *pidx);
static inline UINT bytes_per_column( MSIDATABASE *db, const MSICOLUMNINFO *col )
{
if( MSITYPE_IS_BINARY(col->type) )
return 2;
if( col->type & MSITYPE_STRING )
return db->bytes_per_strref;
if( (col->type & 0xff) > 4 )
if( (col->type & 0xff) <= 2)
return 2;
if( (col->type & 0xff) != 4 )
ERR("Invalid column size!\n");
return col->type & 0xff;
return 4;
}
static int utf2mime(int x)
@ -620,6 +627,7 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
column_info *col;
MSITABLE *table;
UINT i;
INT idx;
/* only add tables that don't exist already */
if( TABLE_Exists(db, name ) )
@ -685,7 +693,11 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
if( r )
goto err;
r = tv->ops->insert_row( tv, rec, -1, persistent == MSICONDITION_FALSE );
r = table_find_insert_idx (tv, name, &idx);
if (r != ERROR_SUCCESS)
idx = -1;
r = tv->ops->insert_row( tv, rec, idx, persistent == MSICONDITION_FALSE );
TRACE("insert_row returned %x\n", r);
if( r )
goto err;
@ -735,7 +747,11 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
if( r )
goto err;
r = tv->ops->insert_row( tv, rec, -1, FALSE );
r = table_find_insert_idx (tv, name, &idx);
if (r != ERROR_SUCCESS)
idx = -1;
r = tv->ops->insert_row( tv, rec, idx, FALSE );
if( r )
goto err;
@ -1701,6 +1717,21 @@ static UINT msi_table_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row)
return TABLE_set_row(view, new_row, rec, (1 << tv->num_cols) - 1);
}
static UINT msi_table_assign(struct tagMSIVIEW *view, MSIRECORD *rec)
{
MSITABLEVIEW *tv = (MSITABLEVIEW *)view;
UINT r, row;
if (!tv->table)
return ERROR_INVALID_PARAMETER;
r = msi_table_find_row(tv, rec, &row);
if (r == ERROR_SUCCESS)
return TABLE_set_row(view, row, rec, (1 << tv->num_cols) - 1);
else
return TABLE_insert_row( view, rec, -1, FALSE );
}
static UINT modify_delete_row( struct tagMSIVIEW *view, MSIRECORD *rec )
{
MSITABLEVIEW *tv = (MSITABLEVIEW *)view;
@ -1770,6 +1801,9 @@ static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode,
break;
case MSIMODIFY_ASSIGN:
r = msi_table_assign( view, rec );
break;
case MSIMODIFY_REPLACE:
case MSIMODIFY_MERGE:
case MSIMODIFY_VALIDATE:
@ -2923,3 +2957,29 @@ void msi_free_transforms( MSIDATABASE *db )
msi_free( t );
}
}
static UINT table_find_insert_idx (MSIVIEW *view, LPCWSTR name, INT *pidx)
{
UINT r, name_id, row_id;
INT idx;
MSITABLEVIEW *tv = (MSITABLEVIEW *)view;
TRACE ("%p %s\n", view, debugstr_w(name));
r = msi_string2idW(tv->db->strings, name, &name_id);
if (r != ERROR_SUCCESS)
{
*pidx = -1;
return r;
}
for( idx = 0; idx < tv->table->row_count; idx++ )
{
r = TABLE_fetch_int( &tv->view, idx, 1, &row_id );
if (row_id > name_id)
break;
}
*pidx = idx;
return ERROR_SUCCESS;
}