Commit f721a24a authored by James Hawkins's avatar James Hawkins Committed by Alexandre Julliard

msi: Perform button control events in greatest to least order.

parent 34aaea93
...@@ -2914,7 +2914,7 @@ static UINT msi_dialog_button_handler( msi_dialog *dialog, ...@@ -2914,7 +2914,7 @@ static UINT msi_dialog_button_handler( msi_dialog *dialog,
return 0; return 0;
} }
r = MSI_IterateRecords( view, 0, msi_dialog_control_event, dialog ); r = MSI_ReverseIterateRecords( view, 0, msi_dialog_control_event, dialog );
msiobj_release( &view->hdr ); msiobj_release( &view->hdr );
return r; return r;
......
...@@ -386,6 +386,7 @@ extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** ); ...@@ -386,6 +386,7 @@ extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** );
extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** ); extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** );
extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... ); extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... );
typedef UINT (*record_func)( MSIRECORD *, LPVOID ); typedef UINT (*record_func)( MSIRECORD *, LPVOID );
extern UINT MSI_ReverseIterateRecords( MSIQUERY *, DWORD *, record_func, LPVOID );
extern UINT MSI_IterateRecords( MSIQUERY *, DWORD *, record_func, LPVOID ); extern UINT MSI_IterateRecords( MSIQUERY *, DWORD *, record_func, LPVOID );
extern MSIRECORD *MSI_QueryGetRecord( MSIDATABASE *db, LPCWSTR query, ... ); extern MSIRECORD *MSI_QueryGetRecord( MSIDATABASE *db, LPCWSTR query, ... );
extern UINT MSI_DatabaseImport( MSIDATABASE *, LPCWSTR, LPCWSTR ); extern UINT MSI_DatabaseImport( MSIDATABASE *, LPCWSTR, LPCWSTR );
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "winerror.h" #include "winerror.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/list.h"
#include "msi.h" #include "msi.h"
#include "msiquery.h" #include "msiquery.h"
#include "objbase.h" #include "objbase.h"
...@@ -164,6 +165,82 @@ UINT MSI_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... ) ...@@ -164,6 +165,82 @@ UINT MSI_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... )
return r; return r;
} }
struct rec_list
{
struct list entry;
MSIRECORD *rec;
};
UINT MSI_ReverseIterateRecords( MSIQUERY *view, DWORD *count,
record_func func, LPVOID param )
{
MSIRECORD *rec = NULL;
struct rec_list *add_rec;
struct list records;
UINT r, n = 0, max = 0;
r = MSI_ViewExecute( view, NULL );
if( r != ERROR_SUCCESS )
return r;
list_init( &records );
if( count )
max = *count;
/* reverse the query */
for( n = 0; (max == 0) || (n < max); n++ )
{
r = MSI_ViewFetch( view, &rec );
if( r != ERROR_SUCCESS )
{
if ( r == ERROR_NO_MORE_ITEMS )
break;
else
goto done;
}
add_rec = msi_alloc( sizeof( *add_rec ) );
if (!add_rec)
goto done;
add_rec->rec = rec;
list_add_head( &records, &add_rec->entry );
}
/* iterate over the reversed records */
n = 0;
LIST_FOR_EACH_ENTRY( add_rec, &records, struct rec_list, entry )
{
if (func)
r = func( add_rec->rec, param );
msiobj_release( &add_rec->rec->hdr );
if ( r != ERROR_SUCCESS )
goto done;
n++;
}
done:
MSI_ViewClose( view );
while ( !list_empty( &records ) )
{
add_rec = LIST_ENTRY( list_head( &records ), struct rec_list, entry );
list_remove( &add_rec->entry );
msi_free( add_rec );
}
if( count )
*count = n;
if( r == ERROR_NO_MORE_ITEMS )
r = ERROR_SUCCESS;
return r;
}
UINT MSI_IterateRecords( MSIQUERY *view, DWORD *count, UINT MSI_IterateRecords( MSIQUERY *view, DWORD *count,
record_func func, LPVOID param ) record_func func, LPVOID param )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment