lsteamclient: Split do_cb_wrap into conversion helpers.

CW-Bug-Id: #22729
This commit is contained in:
Rémi Bernon 2023-09-17 09:48:57 +02:00
parent b62eb2aa0f
commit d81a972d3f

View file

@ -1000,43 +1000,46 @@ static int get_callback_len(int cb)
return 0; return 0;
} }
bool do_cb_wrap( HSteamPipe pipe, bool (*cpp_func)( void *, SteamAPICall_t, void *, int, int, bool * ), static void *alloc_callback_wtou( int id, void *callback, int *callback_len )
void *linux_side, SteamAPICall_t call, void *callback, int callback_len,
int cb_expected, bool *failed )
{ {
void *lin_callback = NULL; int len;
int lin_callback_len;
bool ret;
lin_callback_len = get_callback_len(cb_expected); if (!(len = get_callback_len( id ))) return callback;
if(!lin_callback_len){ callback = HeapAlloc( GetProcessHeap(), 0, len );
/* structs are compatible, pass on through */ *callback_len = len;
if(!cpp_func){
if(!load_steamclient())
return 0;
return steamclient_GetAPICallResult(pipe, call, callback, callback_len, cb_expected, failed);
}
return cpp_func(linux_side, call, callback, callback_len, cb_expected, failed);
}
/* structs require conversion */ return callback;
lin_callback = HeapAlloc(GetProcessHeap(), 0, lin_callback_len); }
if(!cpp_func){ static void convert_callback_utow( int id, void *lin_callback, int lin_callback_len, void *callback, int callback_len )
if(!load_steamclient()) {
return 0; switch (id)
ret = steamclient_GetAPICallResult(pipe, call, lin_callback, lin_callback_len, cb_expected, failed); {
}else
ret = cpp_func(linux_side, call, lin_callback, lin_callback_len, cb_expected, failed);
if(ret){
switch(cb_expected){
#include "cb_getapi_table.dat" #include "cb_getapi_table.dat"
} }
}
bool do_cb_wrap( HSteamPipe pipe, bool (*cpp_func)( void *, SteamAPICall_t, void *, int, int, bool * ),
void *linux_side, SteamAPICall_t call, void *callback, int callback_len, int id, bool *failed )
{
int lin_callback_len = callback_len;
void *lin_callback;
bool ret;
if (!(lin_callback = alloc_callback_wtou( id, callback, &lin_callback_len ))) return FALSE;
if(!cpp_func){
if(!load_steamclient())
return 0;
ret = steamclient_GetAPICallResult(pipe, call, callback, callback_len, id, failed);
}else
ret = cpp_func(linux_side, call, callback, callback_len, id, failed);
if (ret && lin_callback != callback)
{
convert_callback_utow( id, lin_callback, lin_callback_len, callback, callback_len );
HeapFree( GetProcessHeap(), 0, lin_callback );
} }
HeapFree(GetProcessHeap(), 0, lin_callback);
return ret; return ret;
} }