summaryrefslogtreecommitdiffstats
path: root/src/osd/winui/mui_audit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/winui/mui_audit.cpp')
-rw-r--r--src/osd/winui/mui_audit.cpp482
1 files changed, 482 insertions, 0 deletions
diff --git a/src/osd/winui/mui_audit.cpp b/src/osd/winui/mui_audit.cpp
new file mode 100644
index 00000000000..c29368c0f64
--- /dev/null
+++ b/src/osd/winui/mui_audit.cpp
@@ -0,0 +1,482 @@
+// For licensing and usage information, read docs/winui_license.txt
+// MASTER
+//****************************************************************************
+
+ /***************************************************************************
+
+ mui_audit.c
+
+ Audit dialog
+
+***************************************************************************/
+
+// standard windows headers
+#include <windows.h>
+#include <windowsx.h>
+
+// standard C headers
+#include <tchar.h>
+
+// MAME/MAMEUI headers
+#include "winui.h"
+#include "winutf8.h"
+#include "audit.h"
+#include "resource.h"
+#include "mui_opts.h"
+#include "mui_util.h"
+#include "properties.h"
+#include <richedit.h>
+
+
+#ifdef _MSC_VER
+#define vsnprintf _vsnprintf
+#endif
+
+/***************************************************************************
+ function prototypes
+ ***************************************************************************/
+
+static DWORD WINAPI AuditThreadProc(LPVOID hDlg);
+static INT_PTR CALLBACK AuditWindowProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
+static void ProcessNextRom(void);
+static void ProcessNextSample(void);
+static void CLIB_DECL DetailsPrintf(const char *fmt, ...) ATTR_PRINTF(1,2);
+static const char * StatusString(int iStatus);
+
+/***************************************************************************
+ Internal variables
+ ***************************************************************************/
+
+#define MAX_AUDITBOX_TEXT 0x7FFFFFFE
+
+static volatile HWND hAudit;
+static volatile int rom_index = 0;
+static volatile int roms_correct = 0;
+static volatile int roms_incorrect = 0;
+static volatile int sample_index = 0;
+static volatile int samples_correct = 0;
+static volatile int samples_incorrect = 0;
+static volatile BOOL bPaused = FALSE;
+static volatile BOOL bCancel = FALSE;
+static int m_choice = 0;
+
+/***************************************************************************
+ External functions
+ ***************************************************************************/
+
+static int strcatprintf(std::string &str, const char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ int retVal = strcatvprintf(str, format, ap);
+ va_end(ap);
+ return retVal;
+}
+
+void AuditDialog(HWND hParent, int choice)
+{
+ rom_index = 0;
+ roms_correct = -1; // ___empty must not be counted
+ roms_incorrect = 0;
+ sample_index = 0;
+ samples_correct = -1; // ___empty must not be counted
+ samples_incorrect = 0;
+ m_choice = choice;
+
+ //RS use Riched32.dll
+ HMODULE hModule = LoadLibrary(TEXT("Riched32.dll"));
+ if( hModule )
+ {
+ DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_AUDIT),hParent,AuditWindowProc);
+ FreeLibrary( hModule );
+ hModule = NULL;
+ }
+ else
+ MessageBox(GetMainWindow(),TEXT("Unable to Load Riched32.dll"),TEXT("Error"), MB_OK | MB_ICONERROR);
+}
+
+void InitGameAudit(int gameIndex)
+{
+ rom_index = gameIndex;
+}
+
+const char * GetAuditString(int audit_result)
+{
+ switch (audit_result)
+ {
+ case media_auditor::CORRECT :
+ case media_auditor::BEST_AVAILABLE :
+ case media_auditor::NONE_NEEDED :
+ return "Yes";
+
+ case media_auditor::NOTFOUND :
+ case media_auditor::INCORRECT :
+ return "No";
+
+ default:
+ printf("unknown audit value %i\n",audit_result);
+ }
+
+ return "?";
+}
+
+BOOL IsAuditResultKnown(int audit_result)
+{
+ return TRUE;
+}
+
+BOOL IsAuditResultYes(int audit_result)
+{
+ return audit_result == media_auditor::CORRECT
+ || audit_result == media_auditor::BEST_AVAILABLE
+ || audit_result == media_auditor::NONE_NEEDED;
+}
+
+BOOL IsAuditResultNo(int audit_result)
+{
+ return audit_result == media_auditor::NOTFOUND
+ || audit_result == media_auditor::INCORRECT;
+}
+
+
+/***************************************************************************
+ Internal functions
+ ***************************************************************************/
+// Verifies the ROM set while calling SetRomAuditResults
+int MameUIVerifyRomSet(int game, bool choice)
+{
+ driver_enumerator enumerator(MameUIGlobal(), driver_list::driver(game));
+ enumerator.next();
+ media_auditor auditor(enumerator);
+ media_auditor::summary summary = auditor.audit_media(AUDIT_VALIDATE_FAST);
+
+ std::string summary_string;
+
+ if (summary == media_auditor::NOTFOUND)
+ {
+ if (m_choice < 2)
+ strcatprintf(summary_string, "%s: Romset NOT FOUND\n", driver_list::driver(game).name);
+ }
+ else
+ if (choice)
+ {
+ auditor.winui_summarize(driver_list::driver(game).name, &summary_string); // audit all games
+ }
+ else
+ {
+ std::ostringstream whatever;
+ auditor.summarize(driver_list::driver(game).name, &whatever); // audit one game
+ summary_string = whatever.str();
+ }
+
+ // output the summary of the audit
+ DetailsPrintf("%s", summary_string.c_str());
+
+ SetRomAuditResults(game, summary);
+ return summary;
+}
+
+// Verifies the Sample set while calling SetSampleAuditResults
+int MameUIVerifySampleSet(int game)
+{
+ driver_enumerator enumerator(MameUIGlobal(), driver_list::driver(game));
+ enumerator.next();
+ media_auditor auditor(enumerator);
+ media_auditor::summary summary = auditor.audit_samples();
+
+ std::string summary_string;
+
+ if (summary == media_auditor::NOTFOUND)
+ strcatprintf(summary_string, "%s: Sampleset NOT FOUND\n", driver_list::driver(game).name);
+ else
+ {
+ std::ostringstream whatever;
+ auditor.summarize(driver_list::driver(game).name, &whatever);
+ summary_string = whatever.str();
+ }
+
+ // output the summary of the audit
+ DetailsPrintf("%s", summary_string.c_str());
+
+ SetSampleAuditResults(game, summary);
+ return summary;
+}
+
+static DWORD WINAPI AuditThreadProc(LPVOID hDlg)
+{
+ char buffer[200];
+
+ while (!bCancel)
+ {
+ if (!bPaused)
+ {
+ if (rom_index != -1)
+ {
+ sprintf(buffer, "Checking Set %s - %s", driver_list::driver(rom_index).name, driver_list::driver(rom_index).type.fullname());
+ win_set_window_text_utf8((HWND)hDlg, buffer);
+ ProcessNextRom();
+ }
+ else
+ if (sample_index != -1)
+ {
+ sprintf(buffer, "Checking Set %s - %s", driver_list::driver(sample_index).name, driver_list::driver(sample_index).type.fullname());
+ win_set_window_text_utf8((HWND)hDlg, buffer);
+ ProcessNextSample();
+ }
+ else
+ {
+ win_set_window_text_utf8((HWND)hDlg, "File Audit");
+ EnableWindow(GetDlgItem((HWND)hDlg, IDPAUSE), FALSE);
+ ExitThread(1);
+ }
+ }
+ }
+ return 0;
+}
+
+static INT_PTR CALLBACK AuditWindowProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ static HANDLE hThread;
+ static DWORD dwThreadID = 0;
+ HWND hEdit;
+
+ switch (Msg)
+ {
+ case WM_INITDIALOG:
+ hAudit = hDlg;
+ //RS 20030613 Set Bkg of RichEdit Ctrl
+ hEdit = GetDlgItem(hAudit, IDC_AUDIT_DETAILS);
+ if (hEdit)
+ {
+ SendMessage( hEdit, EM_SETBKGNDCOLOR, FALSE, GetSysColor(COLOR_BTNFACE) );
+ // MSH - Set to max
+ SendMessage( hEdit, EM_SETLIMITTEXT, MAX_AUDITBOX_TEXT, 0 );
+ }
+
+ SendDlgItemMessage(hDlg, IDC_ROMS_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, driver_list::total()));
+ SendDlgItemMessage(hDlg, IDC_SAMPLES_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, driver_list::total()));
+ bPaused = false;
+ bCancel = false;
+ rom_index = 0;
+ hThread = CreateThread(NULL, 0, AuditThreadProc, hDlg, 0, &dwThreadID);
+ return 1;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDCANCEL:
+ bPaused = false;
+ if (hThread)
+ {
+ bCancel = true;
+ DWORD dwExitCode = 0;
+ if (GetExitCodeThread(hThread, &dwExitCode) && (dwExitCode == STILL_ACTIVE))
+ {
+ PostMessage(hDlg, WM_COMMAND, wParam, lParam);
+ return 1;
+ }
+ CloseHandle(hThread);
+ }
+ EndDialog(hDlg,0);
+ m_choice = 0;
+ break;
+
+ case IDPAUSE:
+ if (bPaused)
+ {
+ SendDlgItemMessage(hAudit, IDPAUSE, WM_SETTEXT, 0, (LPARAM)TEXT("Pause"));
+ bPaused = false;
+ }
+ else
+ {
+ SendDlgItemMessage(hAudit, IDPAUSE, WM_SETTEXT, 0, (LPARAM)TEXT("Continue"));
+ bPaused = true;
+ }
+ break;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+/* Callback for the Audit property sheet */
+INT_PTR CALLBACK GameAuditDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam)
+{
+ switch (Msg)
+ {
+ case WM_INITDIALOG:
+ FlushFileCaches();
+ hAudit = hDlg;
+ win_set_window_text_utf8(GetDlgItem(hDlg, IDC_PROP_TITLE), GameInfoTitle(OPTIONS_GAME, rom_index));
+ SetTimer(hDlg, 0, 1, NULL);
+ return 1;
+
+ case WM_TIMER:
+ KillTimer(hDlg, 0);
+ {
+ int iStatus;
+ LPCSTR lpStatus;
+
+ iStatus = MameUIVerifyRomSet(rom_index, 0);
+ lpStatus = DriverUsesRoms(rom_index) ? StatusString(iStatus) : "None required";
+ win_set_window_text_utf8(GetDlgItem(hDlg, IDC_PROP_ROMS), lpStatus);
+
+ if (DriverUsesSamples(rom_index))
+ {
+ iStatus = MameUIVerifySampleSet(rom_index);
+ lpStatus = StatusString(iStatus);
+ }
+ else
+ {
+ lpStatus = "None Required";
+ }
+
+ win_set_window_text_utf8(GetDlgItem(hDlg, IDC_PROP_SAMPLES), lpStatus);
+ }
+ ShowWindow(hDlg, SW_SHOW);
+ break;
+ }
+ return 0;
+}
+
+static void ProcessNextRom()
+{
+ int retval = 0;
+ TCHAR buffer[200];
+
+ retval = MameUIVerifyRomSet(rom_index, 1);
+ switch (retval)
+ {
+ case media_auditor::BEST_AVAILABLE: /* correct, incorrect or separate count? */
+ case media_auditor::CORRECT:
+ case media_auditor::NONE_NEEDED:
+ roms_correct++;
+ _stprintf(buffer, TEXT("%i"), roms_correct);
+ SendDlgItemMessage(hAudit, IDC_ROMS_CORRECT, WM_SETTEXT, 0, (LPARAM)buffer);
+ _stprintf(buffer, TEXT("%i"), roms_correct + roms_incorrect);
+ SendDlgItemMessage(hAudit, IDC_ROMS_TOTAL, WM_SETTEXT, 0, (LPARAM)buffer);
+ break;
+
+ case media_auditor::NOTFOUND:
+ case media_auditor::INCORRECT:
+ roms_incorrect++;
+ _stprintf(buffer, TEXT("%i"), roms_incorrect);
+ SendDlgItemMessage(hAudit, IDC_ROMS_INCORRECT, WM_SETTEXT, 0, (LPARAM)buffer);
+ _stprintf(buffer, TEXT("%i"), roms_correct + roms_incorrect);
+ SendDlgItemMessage(hAudit, IDC_ROMS_TOTAL, WM_SETTEXT, 0, (LPARAM)buffer);
+ break;
+ }
+
+ rom_index++;
+ SendDlgItemMessage(hAudit, IDC_ROMS_PROGRESS, PBM_SETPOS, rom_index, 0);
+
+ if (rom_index == driver_list::total())
+ {
+ sample_index = 0;
+ rom_index = -1;
+ }
+}
+
+static void ProcessNextSample()
+{
+ int retval = 0;
+ TCHAR buffer[200];
+
+ retval = MameUIVerifySampleSet(sample_index);
+
+ switch (retval)
+ {
+ case media_auditor::NOTFOUND:
+ case media_auditor::INCORRECT:
+ if (DriverUsesSamples(sample_index))
+ {
+ samples_incorrect++;
+ _stprintf(buffer, TEXT("%i"), samples_incorrect);
+ SendDlgItemMessage(hAudit, IDC_SAMPLES_INCORRECT, WM_SETTEXT, 0, (LPARAM)buffer);
+ _stprintf(buffer, TEXT("%i"), samples_correct + samples_incorrect);
+ SendDlgItemMessage(hAudit, IDC_SAMPLES_TOTAL, WM_SETTEXT, 0, (LPARAM)buffer);
+ break;
+ }
+ default:
+ if ((DriverUsesSamples(sample_index)) || (m_choice == 1))
+ {
+ samples_correct++;
+ _stprintf(buffer, TEXT("%i"), samples_correct);
+ SendDlgItemMessage(hAudit, IDC_SAMPLES_CORRECT, WM_SETTEXT, 0, (LPARAM)buffer);
+ _stprintf(buffer, TEXT("%i"), samples_correct + samples_incorrect);
+ SendDlgItemMessage(hAudit, IDC_SAMPLES_TOTAL, WM_SETTEXT, 0, (LPARAM)buffer);
+ break;
+ }
+ }
+
+ sample_index++;
+ SendDlgItemMessage(hAudit, IDC_SAMPLES_PROGRESS, PBM_SETPOS, sample_index, 0);
+
+ if (sample_index == driver_list::total())
+ {
+ DetailsPrintf("Audit complete.\n");
+ SendDlgItemMessage(hAudit, IDCANCEL, WM_SETTEXT, 0, (LPARAM)TEXT("Close"));
+ sample_index = -1;
+ }
+}
+
+static void CLIB_DECL DetailsPrintf(const char *fmt, ...)
+{
+ //RS 20030613 Different Ids for Property Page and Dialog
+ // so see which one's currently instantiated
+ HWND hEdit = GetDlgItem(hAudit, IDC_AUDIT_DETAILS);
+ if (hEdit == NULL)
+ hEdit = GetDlgItem(hAudit, IDC_AUDIT_DETAILS_PROP);
+
+ if (hEdit == NULL)
+ {
+ // Auditing via F5 - no window to display the results
+ //printf("audit detailsprintf() can't find any audit control\n");
+ return;
+ }
+
+ va_list marker;
+ va_start(marker, fmt);
+ char buffer[8000];
+ vsprintf(buffer, fmt, marker);
+ va_end(marker);
+
+ TCHAR* t_s = ui_wstring_from_utf8(ConvertToWindowsNewlines(buffer));
+ if( !t_s || _tcscmp(TEXT(""), t_s) == 0)
+ return;
+
+ int textLength = Edit_GetTextLength(hEdit);
+ Edit_SetSel(hEdit, textLength, textLength);
+ SendMessage( hEdit, EM_REPLACESEL, false, (WPARAM)(LPCTSTR)win_tstring_strdup(t_s) );
+
+ free(t_s);
+}
+
+static const char * StatusString(int iStatus)
+{
+ static const char *ptr = "Unknown";
+
+ switch (iStatus)
+ {
+ case media_auditor::CORRECT:
+ ptr = "Passed";
+ break;
+
+ case media_auditor::BEST_AVAILABLE:
+ ptr = "Best available";
+ break;
+
+ case media_auditor::NONE_NEEDED:
+ ptr = "None Required";
+ break;
+
+ case media_auditor::NOTFOUND:
+ ptr = "Not found";
+ break;
+
+ case media_auditor::INCORRECT:
+ ptr = "Failed";
+ break;
+ }
+
+ return ptr;
+}