static void plugin_eof(struct plugin_cycle *cycle, struct plugin_pipe *p) { int ret, status; g_io_channel_unref(p->channel); close(p->fd); p->fd = -1; /* Only if both pipes are have EOF status we are done */ if (cycle->pipe_stdout.fd != -1 || cycle->pipe_stderr.fd != -1) return; ret = waitpid(cycle->pid, &status, 0); cycle->pid = -1; if (ret < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) { /* If we encountered an error other than service unavailable * (69), log it for later. If all plugins fail, we may get * some hints for debugging.*/ if (cycle->pipe_stderr.data->len > 0 && WEXITSTATUS(status) != 69) g_string_append_printf(cycle->all_errors, "*** %s ***\n\n%s\n", cycle->argv[0], cycle->pipe_stderr.data->str); /* the plugin has failed */ g_string_free(cycle->pipe_stdout.data, TRUE); cycle->pipe_stdout.data = NULL; g_string_free(cycle->pipe_stderr.data, TRUE); cycle->pipe_stderr.data = NULL; next_plugin(cycle); } else { /* success: invoke the callback */ cycle->callback(cycle->pipe_stdout.data, true, cycle->argv[0], cycle->callback_data); } }
struct plugin_cycle * plugin_run(struct plugin_list *list, const char *const*args, plugin_callback_t callback, void *callback_data) { struct plugin_cycle *cycle = g_new(struct plugin_cycle, 1); assert(args != NULL); cycle->list = list; cycle->argv = make_argv(args); cycle->callback = callback; cycle->callback_data = callback_data; cycle->next_plugin = 0; cycle->pid = -1; cycle->pipe_stdout.fd = -1; cycle->pipe_stderr.fd = -1; cycle->pipe_stdout.data = NULL; cycle->pipe_stderr.data = NULL; cycle->all_errors = g_string_new(NULL); next_plugin(cycle); return cycle; }
BOOL CALLBACK PluginsCfg(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { char path_buffer[_MAX_PATH]; int index; switch(Message) { case WM_CLOSE: EndDialog(hwnd, IDOK); break; case WM_INITDIALOG: rewind_plugin(); while(get_plugin_type() != -1) { switch (get_plugin_type()) { case PLUGIN_TYPE_GFX: SendDlgItemMessage(hwnd, IDC_COMBO_GFX, CB_ADDSTRING, 0, (LPARAM)next_plugin()); break; case PLUGIN_TYPE_CONTROLLER: SendDlgItemMessage(hwnd, IDC_COMBO_INPUT, CB_ADDSTRING, 0, (LPARAM)next_plugin()); break; case PLUGIN_TYPE_AUDIO: SendDlgItemMessage(hwnd, IDC_COMBO_SOUND, CB_ADDSTRING, 0, (LPARAM)next_plugin()); break; case PLUGIN_TYPE_RSP: SendDlgItemMessage(hwnd, IDC_COMBO_RSP, CB_ADDSTRING, 0, (LPARAM)next_plugin()); break; default: next_plugin(); } } // Set gfx plugin index = SendDlgItemMessage(hwnd, IDC_COMBO_GFX, CB_FINDSTRINGEXACT, 0, (LPARAM)gfx_name); if (index!=CB_ERR) { SendDlgItemMessage(hwnd, IDC_COMBO_GFX, CB_SETCURSEL, index, 0); } else { SendDlgItemMessage(hwnd, IDC_COMBO_GFX, CB_SETCURSEL, 0, 0); SendDlgItemMessage(hwnd, IDC_COMBO_GFX, CB_GETLBTEXT, 0, (LPARAM)gfx_name); } // Set input plugin index = SendDlgItemMessage(hwnd, IDC_COMBO_INPUT, CB_FINDSTRINGEXACT, 0, (LPARAM)input_name); if (index!=CB_ERR) { SendDlgItemMessage(hwnd, IDC_COMBO_INPUT, CB_SETCURSEL, index, 0); } else { SendDlgItemMessage(hwnd, IDC_COMBO_INPUT, CB_SETCURSEL, 0, 0); SendDlgItemMessage(hwnd, IDC_COMBO_INPUT, CB_GETLBTEXT, 0, (LPARAM)input_name); } // Set sound plugin index = SendDlgItemMessage(hwnd, IDC_COMBO_SOUND, CB_FINDSTRINGEXACT, 0, (LPARAM)sound_name); if (index!=CB_ERR) { SendDlgItemMessage(hwnd, IDC_COMBO_SOUND, CB_SETCURSEL, index, 0); } else { SendDlgItemMessage(hwnd, IDC_COMBO_SOUND, CB_SETCURSEL, 0, 0); SendDlgItemMessage(hwnd, IDC_COMBO_SOUND, CB_GETLBTEXT, 0, (LPARAM)sound_name); } // Set RSP plugin index = SendDlgItemMessage(hwnd, IDC_COMBO_RSP, CB_FINDSTRINGEXACT, 0, (LPARAM)rsp_name); if (index!=CB_ERR) { SendDlgItemMessage(hwnd, IDC_COMBO_RSP, CB_SETCURSEL, index, 0); } else { SendDlgItemMessage(hwnd, IDC_COMBO_RSP, CB_SETCURSEL, 0, 0); SendDlgItemMessage(hwnd, IDC_COMBO_RSP, CB_GETLBTEXT, 0, (LPARAM)rsp_name); } TranslateConfigDialog(hwnd); if(emu_launched) { EnableWindow( GetDlgItem(hwnd,IDC_COMBO_GFX), FALSE ); EnableWindow( GetDlgItem(hwnd,IDC_COMBO_INPUT), FALSE ); EnableWindow( GetDlgItem(hwnd,IDC_COMBO_SOUND), FALSE ); EnableWindow( GetDlgItem(hwnd,IDC_COMBO_RSP), FALSE ); } //Show the images SendDlgItemMessage(hwnd, IDB_DISPLAY, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadImage (GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_DISPLAY), IMAGE_BITMAP, 0, 0, 0)); SendDlgItemMessage(hwnd, IDB_CONTROL, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadImage (GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_CONTROL), IMAGE_BITMAP, 0, 0, 0)); SendDlgItemMessage(hwnd, IDB_SOUND, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadImage (GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SOUND), IMAGE_BITMAP, 0, 0, 0)); SendDlgItemMessage(hwnd, IDB_RSP, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadImage (GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_RSP), IMAGE_BITMAP, 0, 0, 0)); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDGFXCONFIG: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_GFX, path_buffer); exec_config(path_buffer); break; case IDGFXTEST: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_GFX, path_buffer); exec_test(path_buffer); break; case IDGFXABOUT: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_GFX, path_buffer); exec_about(path_buffer); break; case IDINPUTCONFIG: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_INPUT, path_buffer); exec_config(path_buffer); break; case IDINPUTTEST: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_INPUT, path_buffer); exec_test(path_buffer); break; case IDINPUTABOUT: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_INPUT, path_buffer); exec_about(path_buffer); break; case IDSOUNDCONFIG: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_SOUND, path_buffer); exec_config(path_buffer); break; case IDSOUNDTEST: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_SOUND, path_buffer); exec_test(path_buffer); break; case IDSOUNDABOUT: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_SOUND, path_buffer); exec_about(path_buffer); break; case IDRSPCONFIG: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_RSP, path_buffer); exec_config(path_buffer); break; case IDRSPTEST: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_RSP, path_buffer); exec_test(path_buffer); break; case IDRSPABOUT: hwnd_plug = hwnd; ReadComboBoxValue( hwnd, IDC_COMBO_RSP, path_buffer); exec_about(path_buffer); break; } break; case WM_NOTIFY: if (((NMHDR FAR *) lParam)->code == PSN_APPLY) { ReadComboBoxValue( hwnd, IDC_COMBO_GFX, gfx_name); WriteCfgString("Plugins","Graphics",gfx_name); ReadComboBoxValue( hwnd, IDC_COMBO_INPUT, input_name); WriteCfgString("Plugins","Input",input_name); ReadComboBoxValue( hwnd, IDC_COMBO_SOUND, sound_name); WriteCfgString("Plugins","Sound",sound_name); ReadComboBoxValue( hwnd, IDC_COMBO_RSP, rsp_name); WriteCfgString("Plugins","RSP",rsp_name); } break; default: return FALSE; } return TRUE; }