pcsxr-1.9.92
[pcsx_rearmed.git] / win32 / gui / ConfigurePlugins.c
1 /*  Pcsx - Pc Psx Emulator\r
2  *  Copyright (C) 1999-2003  Pcsx Team\r
3  *\r
4  *  This program is free software; you can redistribute it and/or modify\r
5  *  it under the terms of the GNU General Public License as published by\r
6  *  the Free Software Foundation; either version 2 of the License, or\r
7  *  (at your option) any later version.\r
8  *\r
9  *  This program is distributed in the hope that it will be useful,\r
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
12  *  GNU General Public License for more details.\r
13  *\r
14  *  You should have received a copy of the GNU General Public License\r
15  *  along with this program; if not, write to the Free Software\r
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA\r
17  */\r
18 \r
19 #include <windows.h>\r
20 #include <windowsx.h>\r
21 #include <stdio.h>\r
22 #include "psxcommon.h"\r
23 #include "plugin.h"\r
24 #include "plugins.h"\r
25 #include "resource.h"\r
26 #include "Win32.h"\r
27 \r
28 #define QueryKeyV(name, var) \\r
29         size = sizeof(DWORD); \\r
30         if (RegQueryValueEx(myKey, name, 0, &type, (LPBYTE)&tmp, &size) != 0) { if (err) { RegCloseKey(myKey); return -1; } } \\r
31         var = tmp;\r
32 \r
33 #define QueryKey(s, name, var) \\r
34         size = s; \\r
35         if (RegQueryValueEx(myKey, name, 0, &type, (LPBYTE)var, &size) != 0) { if (err) { RegCloseKey(myKey); return -1; } }\r
36 \r
37 #define SetKeyV(name, var) \\r
38         tmp = var; \\r
39         RegSetValueEx(myKey, name, 0, REG_DWORD, (LPBYTE)&tmp, sizeof(DWORD));\r
40 \r
41 #define SetKey(name, var, s, t) \\r
42         RegSetValueEx(myKey, name, 0, t, (LPBYTE)var, s);\r
43 \r
44 int LoadConfig() {\r
45         HKEY myKey;\r
46         DWORD type, size, tmp;\r
47         PcsxConfig *Conf = &Config;\r
48         int err;\r
49 #ifdef ENABLE_NLS\r
50         char text[256];\r
51 #endif\r
52 \r
53         if (RegOpenKeyEx(HKEY_CURRENT_USER,cfgfile,0,KEY_ALL_ACCESS,&myKey)!=ERROR_SUCCESS) return -1;\r
54 \r
55         err = 1;\r
56         QueryKey(256, "Bios", Conf->Bios);\r
57         QueryKey(256, "Gpu",  Conf->Gpu);\r
58         QueryKey(256, "Spu",  Conf->Spu);\r
59         QueryKey(256, "Cdr",  Conf->Cdr);\r
60         QueryKey(256, "Pad1", Conf->Pad1);\r
61         QueryKey(256, "Pad2", Conf->Pad2);\r
62         QueryKey(256, "Mcd1", Conf->Mcd1);\r
63         QueryKey(256, "Mcd2", Conf->Mcd2);\r
64         QueryKey(256, "PluginsDir", Conf->PluginsDir);\r
65         QueryKey(256, "BiosDir",    Conf->BiosDir);\r
66         err = 0;\r
67         QueryKey(256, "Net",  Conf->Net);\r
68         QueryKey(256, "Lang", Conf->Lang);\r
69 \r
70         QueryKeyV("Xa",       Conf->Xa);\r
71         QueryKeyV("Sio",      Conf->Sio);\r
72         QueryKeyV("Mdec",     Conf->Mdec);\r
73         QueryKeyV("PsxAuto",  Conf->PsxAuto);\r
74         QueryKeyV("Cdda",     Conf->Cdda);\r
75         QueryKeyV("Debug",    Conf->Debug);\r
76         QueryKeyV("PsxOut",   Conf->PsxOut);\r
77         QueryKeyV("SpuIrq",   Conf->SpuIrq);\r
78         QueryKeyV("RCntFix",  Conf->RCntFix);\r
79         QueryKeyV("VSyncWA",  Conf->VSyncWA);\r
80 \r
81         QueryKeyV("Cpu",      Conf->Cpu);\r
82         QueryKeyV("PsxType",  Conf->PsxType);\r
83 \r
84         if (Config.Cpu == CPU_DYNAREC) {\r
85                 Config.Debug = 0; // don't enable debugger if using dynarec core\r
86         }\r
87 \r
88         RegCloseKey(myKey);\r
89 \r
90 #ifdef ENABLE_NLS\r
91         sprintf(text, "LANGUAGE=%s", Conf->Lang);\r
92         gettext_putenv(text);\r
93 #endif\r
94 \r
95         return 0;\r
96 }\r
97 \r
98 /////////////////////////////////////////////////////////\r
99 \r
100 void SaveConfig() {\r
101         HKEY myKey;\r
102         DWORD myDisp, tmp;\r
103         PcsxConfig *Conf = &Config;\r
104 \r
105         RegCreateKeyEx(HKEY_CURRENT_USER, cfgfile, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &myKey, &myDisp);\r
106 \r
107         SetKey("Bios", Conf->Bios, strlen(Conf->Bios), REG_SZ);\r
108         SetKey("Gpu",  Conf->Gpu,  strlen(Conf->Gpu),  REG_SZ);\r
109         SetKey("Spu",  Conf->Spu,  strlen(Conf->Spu),  REG_SZ);\r
110         SetKey("Cdr",  Conf->Cdr,  strlen(Conf->Cdr),  REG_SZ);\r
111         SetKey("Pad1", Conf->Pad1, strlen(Conf->Pad1), REG_SZ);\r
112         SetKey("Pad2", Conf->Pad2, strlen(Conf->Pad2), REG_SZ);\r
113         SetKey("Net",  Conf->Net,  strlen(Conf->Net),  REG_SZ);\r
114         SetKey("Mcd1", Conf->Mcd1, strlen(Conf->Mcd1), REG_SZ);\r
115         SetKey("Mcd2", Conf->Mcd2, strlen(Conf->Mcd2), REG_SZ);\r
116         SetKey("Lang", Conf->Lang, strlen(Conf->Lang), REG_SZ);\r
117         SetKey("PluginsDir", Conf->PluginsDir, strlen(Conf->PluginsDir), REG_SZ);\r
118         SetKey("BiosDir",    Conf->BiosDir,    strlen(Conf->BiosDir), REG_SZ);\r
119 \r
120         SetKeyV("Xa",      Conf->Xa);\r
121         SetKeyV("Sio",     Conf->Sio);\r
122         SetKeyV("Mdec",    Conf->Mdec);\r
123         SetKeyV("PsxAuto", Conf->PsxAuto);\r
124         SetKeyV("Cdda",    Conf->Cdda);\r
125         SetKeyV("Debug",   Conf->Debug);\r
126         SetKeyV("PsxOut",  Conf->PsxOut);\r
127         SetKeyV("SpuIrq",  Conf->SpuIrq);\r
128         SetKeyV("RCntFix", Conf->RCntFix);\r
129         SetKeyV("VSyncWA", Conf->VSyncWA);\r
130 \r
131         SetKeyV("Cpu",     Conf->Cpu);\r
132         SetKeyV("PsxType", Conf->PsxType);\r
133 \r
134         RegCloseKey(myKey);\r
135 }\r
136 \r
137 /////////////////////////////////////////////////////////\r
138 \r
139 #define ComboAddPlugin(hw, str) { \\r
140         lp = (char *)malloc(strlen(FindData.cFileName)+8); \\r
141         sprintf(lp, "%s", FindData.cFileName); \\r
142         i = ComboBox_AddString(hw, tmpStr); \\r
143         ComboBox_SetItemData(hw, i, lp); \\r
144         if (stricmp(str, lp)==0) \\r
145                 ComboBox_SetCurSel(hw, i); \\r
146 }\r
147 \r
148 BOOL OnConfigurePluginsDialog(HWND hW) {\r
149         WIN32_FIND_DATA FindData;\r
150         HANDLE Find;\r
151         HANDLE Lib;\r
152         PSEgetLibType    PSE_GetLibType;\r
153         PSEgetLibName    PSE_GetLibName;\r
154         PSEgetLibVersion PSE_GetLibVersion;\r
155         HWND hWC_GPU=GetDlgItem(hW,IDC_LISTGPU);\r
156         HWND hWC_SPU=GetDlgItem(hW,IDC_LISTSPU);\r
157         HWND hWC_CDR=GetDlgItem(hW,IDC_LISTCDR);\r
158         HWND hWC_PAD1=GetDlgItem(hW,IDC_LISTPAD1);\r
159         HWND hWC_PAD2=GetDlgItem(hW,IDC_LISTPAD2);\r
160         HWND hWC_BIOS=GetDlgItem(hW,IDC_LISTBIOS);\r
161         char tmpStr[256];\r
162         char *lp;\r
163         int i;\r
164 \r
165         strcpy(tmpStr, Config.PluginsDir);\r
166         strcat(tmpStr, "*.dll");\r
167         Find = FindFirstFile(tmpStr, &FindData);\r
168 \r
169         do {\r
170                 if (Find == INVALID_HANDLE_VALUE) break;\r
171                 sprintf(tmpStr,"%s%s", Config.PluginsDir, FindData.cFileName);\r
172                 Lib = LoadLibrary(tmpStr);\r
173                 if (Lib != NULL) {\r
174                         PSE_GetLibType = (PSEgetLibType) GetProcAddress((HMODULE)Lib,"PSEgetLibType");\r
175                         PSE_GetLibName = (PSEgetLibName) GetProcAddress((HMODULE)Lib,"PSEgetLibName");\r
176                         PSE_GetLibVersion = (PSEgetLibVersion) GetProcAddress((HMODULE)Lib,"PSEgetLibVersion");\r
177 \r
178                         if (PSE_GetLibType != NULL && PSE_GetLibName != NULL && PSE_GetLibVersion != NULL) {\r
179                                 unsigned long version = PSE_GetLibVersion();\r
180                                 long type;\r
181 \r
182                                 sprintf(tmpStr, "%s %d.%d", PSE_GetLibName(), (int)(version>>8)&0xff, (int)version&0xff);\r
183                                 type = PSE_GetLibType();\r
184                                 if (type & PSE_LT_CDR) {\r
185                                         ComboAddPlugin(hWC_CDR, Config.Cdr);\r
186                                 }\r
187 \r
188                                 if (type & PSE_LT_SPU) {\r
189                                         ComboAddPlugin(hWC_SPU, Config.Spu);\r
190                                 }\r
191 \r
192                                 if (type & PSE_LT_GPU) {\r
193                                         ComboAddPlugin(hWC_GPU, Config.Gpu);\r
194                                 }\r
195 \r
196                                 if (type & PSE_LT_PAD) {\r
197                                         PADquery query;\r
198 \r
199                                         query = (PADquery)GetProcAddress((HMODULE)Lib, "PADquery");\r
200                                         if (query != NULL) {\r
201                                                 if (query() & 0x1)\r
202                                                         ComboAddPlugin(hWC_PAD1, Config.Pad1);\r
203                                                 if (query() & 0x2)\r
204                                                         ComboAddPlugin(hWC_PAD2, Config.Pad2);\r
205                                         } else { // just a guess\r
206                                                 ComboAddPlugin(hWC_PAD1, Config.Pad1);\r
207                                         }\r
208                                 }\r
209                         }\r
210                 }\r
211         } while (FindNextFile(Find,&FindData));\r
212 \r
213         if (Find != INVALID_HANDLE_VALUE) FindClose(Find);\r
214 \r
215 // BIOS\r
216 \r
217         lp = (char *)malloc(strlen("HLE") + 1);\r
218         sprintf(lp, "HLE");\r
219         i = ComboBox_AddString(hWC_BIOS, _("Simulate Psx Bios"));\r
220         ComboBox_SetItemData(hWC_BIOS, i, lp);\r
221         if (stricmp(Config.Bios, lp)==0)\r
222                 ComboBox_SetCurSel(hWC_BIOS, i);\r
223 \r
224         strcpy(tmpStr, Config.BiosDir);\r
225         strcat(tmpStr, "*");\r
226         Find=FindFirstFile(tmpStr, &FindData);\r
227 \r
228         do {\r
229                 if (Find==INVALID_HANDLE_VALUE) break;\r
230                 if (!strcmp(FindData.cFileName, ".")) continue;\r
231                 if (!strcmp(FindData.cFileName, "..")) continue;\r
232                 if (FindData.nFileSizeLow != 1024 * 512) continue;\r
233                 lp = (char *)malloc(strlen(FindData.cFileName)+8);\r
234                 sprintf(lp, "%s", (char *)FindData.cFileName);\r
235                 i = ComboBox_AddString(hWC_BIOS, FindData.cFileName);\r
236                 ComboBox_SetItemData(hWC_BIOS, i, lp);\r
237                 if (Config.Bios[0]=='\0') {\r
238                         ComboBox_SetCurSel(hWC_BIOS, i);\r
239                         strcpy(Config.Bios, FindData.cFileName);\r
240                 } else if (stricmp(Config.Bios, FindData.cFileName)==0)\r
241                         ComboBox_SetCurSel(hWC_BIOS, i);\r
242         } while (FindNextFile(Find,&FindData));\r
243 \r
244         if (Find!=INVALID_HANDLE_VALUE) FindClose(Find);\r
245 \r
246         if (ComboBox_GetCurSel(hWC_CDR ) == -1)\r
247                 ComboBox_SetCurSel(hWC_CDR,  0);\r
248         if (ComboBox_GetCurSel(hWC_GPU ) == -1)\r
249                 ComboBox_SetCurSel(hWC_GPU,  0);\r
250         if (ComboBox_GetCurSel(hWC_SPU ) == -1)\r
251                 ComboBox_SetCurSel(hWC_SPU,  0);\r
252         if (ComboBox_GetCurSel(hWC_PAD1) == -1)\r
253                 ComboBox_SetCurSel(hWC_PAD1, 0);\r
254         if (ComboBox_GetCurSel(hWC_PAD2) == -1)\r
255                 ComboBox_SetCurSel(hWC_PAD2, 0);\r
256         if (ComboBox_GetCurSel(hWC_BIOS) == -1)\r
257                 ComboBox_SetCurSel(hWC_BIOS, 0);\r
258 \r
259         return TRUE;\r
260 }\r
261         \r
262 #define CleanCombo(item) \\r
263         hWC = GetDlgItem(hW, item); \\r
264         iCnt = ComboBox_GetCount(hWC); \\r
265         for (i=0; i<iCnt; i++) { \\r
266                 lp = (char *)ComboBox_GetItemData(hWC, i); \\r
267                 if (lp) free(lp); \\r
268         } \\r
269         ComboBox_ResetContent(hWC);\r
270 \r
271 void CleanUpCombos(HWND hW) {\r
272         int i,iCnt;HWND hWC;char * lp;\r
273 \r
274         CleanCombo(IDC_LISTGPU);\r
275         CleanCombo(IDC_LISTSPU);\r
276         CleanCombo(IDC_LISTCDR);\r
277         CleanCombo(IDC_LISTPAD1);\r
278         CleanCombo(IDC_LISTPAD2);\r
279         CleanCombo(IDC_LISTBIOS);\r
280 }\r
281 \r
282 void OnCancel(HWND hW) {\r
283         CleanUpCombos(hW);\r
284         EndDialog(hW,FALSE);\r
285 }\r
286 \r
287 char *GetSelDLL(HWND hW,int id) {\r
288         HWND hWC = GetDlgItem(hW,id);\r
289         int iSel;\r
290         iSel = ComboBox_GetCurSel(hWC);\r
291         if (iSel<0) return NULL;\r
292         return (char *)ComboBox_GetItemData(hWC, iSel);\r
293 }\r
294 \r
295 void OnOK(HWND hW) {\r
296         char *gpuDLL=GetSelDLL(hW,IDC_LISTGPU);\r
297         char *spuDLL=GetSelDLL(hW,IDC_LISTSPU);\r
298         char *cdrDLL=GetSelDLL(hW,IDC_LISTCDR);\r
299         char *pad1DLL=GetSelDLL(hW,IDC_LISTPAD1);\r
300         char *pad2DLL=GetSelDLL(hW,IDC_LISTPAD2);\r
301         char *biosFILE=GetSelDLL(hW,IDC_LISTBIOS);\r
302 \r
303     if (gpuDLL == NULL || spuDLL == NULL || cdrDLL == NULL || pad1DLL == NULL ||\r
304                 pad2DLL == NULL || biosFILE == NULL) {\r
305                 MessageBox(hW, _("Configuration not OK!"), _("Error"), MB_OK | MB_ICONERROR);\r
306                 return;\r
307         }\r
308 \r
309         strcpy(Config.Bios, biosFILE);\r
310         strcpy(Config.Gpu,  gpuDLL);\r
311         strcpy(Config.Spu,  spuDLL);\r
312         strcpy(Config.Cdr,  cdrDLL);\r
313         strcpy(Config.Pad1, pad1DLL);\r
314         strcpy(Config.Pad2, pad2DLL);\r
315 \r
316         SaveConfig();\r
317 \r
318         CleanUpCombos(hW);\r
319 \r
320         if (!ConfPlug) {\r
321                 LoadPlugins();\r
322         }\r
323         EndDialog(hW,TRUE);\r
324 }\r
325 \r
326 \r
327 #define ConfPlugin(src, confs, name) \\r
328         void *drv; \\r
329         src conf; \\r
330         char * pDLL = GetSelDLL(hW, confs); \\r
331         char file[256]; \\r
332         if(pDLL==NULL) return; \\r
333         strcpy(file, Config.PluginsDir); \\r
334         strcat(file, pDLL); \\r
335         drv = SysLoadLibrary(file); \\r
336         if (drv == NULL) return; \\r
337         conf = (src) SysLoadSym(drv, name); \\r
338         if (SysLibError() == NULL) conf(); \\r
339         SysCloseLibrary(drv);\r
340 \r
341 void ConfigureGPU(HWND hW) {\r
342         ConfPlugin(GPUconfigure, IDC_LISTGPU, "GPUconfigure");\r
343 }\r
344 \r
345 void ConfigureSPU(HWND hW) {\r
346         ConfPlugin(SPUconfigure, IDC_LISTSPU, "SPUconfigure");\r
347 }\r
348 \r
349 void ConfigureCDR(HWND hW) {\r
350         ConfPlugin(CDRconfigure, IDC_LISTCDR, "CDRconfigure");\r
351 }\r
352 \r
353 void ConfigureNET(HWND hW) {\r
354         ConfPlugin(NETconfigure, IDC_LISTNET, "NETconfigure");\r
355 }\r
356 \r
357 void ConfigurePAD1(HWND hW) {\r
358         ConfPlugin(PADconfigure, IDC_LISTPAD1, "PADconfigure");\r
359 }\r
360 \r
361 void ConfigurePAD2(HWND hW) {\r
362         ConfPlugin(PADconfigure, IDC_LISTPAD2, "PADconfigure");\r
363 }\r
364 \r
365 \r
366 void AboutGPU(HWND hW) {\r
367         ConfPlugin(GPUabout, IDC_LISTGPU, "GPUabout");\r
368 }\r
369 \r
370 void AboutSPU(HWND hW) {\r
371         ConfPlugin(SPUabout, IDC_LISTSPU, "SPUabout");\r
372 }\r
373 \r
374 void AboutCDR(HWND hW) {\r
375         ConfPlugin(CDRabout, IDC_LISTCDR, "CDRabout");\r
376 }\r
377 \r
378 void AboutNET(HWND hW) {\r
379         ConfPlugin(NETabout, IDC_LISTNET, "NETabout");\r
380 }\r
381 \r
382 void AboutPAD1(HWND hW) {\r
383         ConfPlugin(PADabout, IDC_LISTPAD1, "PADabout");\r
384 }\r
385 \r
386 void AboutPAD2(HWND hW) {\r
387         ConfPlugin(PADabout, IDC_LISTPAD2, "PADabout");\r
388 }\r
389 \r
390 \r
391 #define TestPlugin(src, confs, name) \\r
392         void *drv; \\r
393         src conf; \\r
394         int ret = 0; \\r
395         char * pDLL = GetSelDLL(hW, confs); \\r
396         char file[256]; \\r
397         if (pDLL== NULL) return; \\r
398         strcpy(file, Config.PluginsDir); \\r
399         strcat(file, pDLL); \\r
400         drv = SysLoadLibrary(file); \\r
401         if (drv == NULL) return; \\r
402         conf = (src) SysLoadSym(drv, name); \\r
403         if (SysLibError() == NULL) { \\r
404                 ret = conf(); \\r
405                 if (ret == 0) \\r
406                          SysMessage(_("This plugin reports that should work correctly")); \\r
407                 else SysMessage(_("This plugin reports that should not work correctly")); \\r
408         } \\r
409         SysCloseLibrary(drv);\r
410 \r
411 void TestGPU(HWND hW) {\r
412         TestPlugin(GPUtest, IDC_LISTGPU, "GPUtest");\r
413 }\r
414 \r
415 void TestSPU(HWND hW) {\r
416         TestPlugin(SPUtest, IDC_LISTSPU, "SPUtest");\r
417 }\r
418 \r
419 void TestCDR(HWND hW) {\r
420         TestPlugin(CDRtest, IDC_LISTCDR, "CDRtest");\r
421 }\r
422 \r
423 void TestNET(HWND hW) {\r
424         TestPlugin(NETtest, IDC_LISTNET, "NETtest");\r
425 }\r
426 \r
427 void TestPAD1(HWND hW) {\r
428         TestPlugin(PADtest, IDC_LISTPAD1, "PADtest");\r
429 }\r
430 \r
431 void TestPAD2(HWND hW) {\r
432         TestPlugin(PADtest, IDC_LISTPAD2, "PADtest");\r
433 }\r
434 \r
435 #include <shlobj.h>\r
436 \r
437 int SelectPath(HWND hW, char *Title, char *Path) {\r
438         LPITEMIDLIST pidl;\r
439         BROWSEINFO bi;\r
440         char Buffer[256];\r
441 \r
442         bi.hwndOwner = hW;\r
443         bi.pidlRoot = NULL;\r
444         bi.pszDisplayName = Buffer;\r
445         bi.lpszTitle = Title;\r
446         bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;\r
447         bi.lpfn = NULL;\r
448         bi.lParam = 0;\r
449         if ((pidl = SHBrowseForFolder(&bi)) != NULL) {\r
450                 if (SHGetPathFromIDList(pidl, Path)) {\r
451                         int len = strlen(Path);\r
452 \r
453                         if (Path[len - 1] != '\\') { strcat(Path,"\\"); }\r
454                         return 0;\r
455                 }\r
456         }\r
457         return -1;\r
458 }\r
459 \r
460 void SetPluginsDir(HWND hW) {\r
461         char Path[256];\r
462 \r
463         if (SelectPath(hW, _("Select Plugins Directory"), Path) == -1) return;\r
464         strcpy(Config.PluginsDir, Path);\r
465         CleanUpCombos(hW);\r
466         OnConfigurePluginsDialog(hW);\r
467 }\r
468 \r
469 void SetBiosDir(HWND hW) {\r
470         char Path[256];\r
471 \r
472         if (SelectPath(hW, _("Select Bios Directory"), Path) == -1) return;\r
473         strcpy(Config.BiosDir, Path);\r
474         CleanUpCombos(hW);\r
475         OnConfigurePluginsDialog(hW);\r
476 }\r
477 \r
478 BOOL CALLBACK ConfigurePluginsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
479         switch(uMsg) {\r
480                 case WM_INITDIALOG:\r
481                         SetWindowText(hW, _("Configuration"));\r
482 \r
483                         Button_SetText(GetDlgItem(hW, IDOK), _("OK"));\r
484                         Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));\r
485                         Static_SetText(GetDlgItem(hW, IDC_GRAPHICS), _("Graphics"));\r
486                         Static_SetText(GetDlgItem(hW, IDC_FIRSTCONTROLLER), _("First Controller"));\r
487                         Static_SetText(GetDlgItem(hW, IDC_SECONDCONTROLLER), _("Second Controller"));\r
488                         Static_SetText(GetDlgItem(hW, IDC_SOUND), _("Sound"));\r
489                         Static_SetText(GetDlgItem(hW, IDC_CDROM), _("Cdrom"));\r
490                         Static_SetText(GetDlgItem(hW, IDC_BIOS), _("Bios"));\r
491                         Button_SetText(GetDlgItem(hW, IDC_BIOSDIR), _("Set Bios Directory"));\r
492                         Button_SetText(GetDlgItem(hW, IDC_PLUGINSDIR), _("Set Plugins Directory"));\r
493                         Button_SetText(GetDlgItem(hW, IDC_CONFIGGPU), _("Configure..."));\r
494                         Button_SetText(GetDlgItem(hW, IDC_TESTGPU), _("Test..."));\r
495                         Button_SetText(GetDlgItem(hW, IDC_ABOUTGPU), _("About..."));\r
496                         Button_SetText(GetDlgItem(hW, IDC_CONFIGSPU), _("Configure..."));\r
497                         Button_SetText(GetDlgItem(hW, IDC_TESTSPU), _("Test..."));\r
498                         Button_SetText(GetDlgItem(hW, IDC_ABOUTSPU), _("About..."));\r
499                         Button_SetText(GetDlgItem(hW, IDC_CONFIGCDR), _("Configure..."));\r
500                         Button_SetText(GetDlgItem(hW, IDC_TESTCDR), _("Test..."));\r
501                         Button_SetText(GetDlgItem(hW, IDC_ABOUTCDR), _("About..."));\r
502                         Button_SetText(GetDlgItem(hW, IDC_CONFIGPAD1), _("Configure..."));\r
503                         Button_SetText(GetDlgItem(hW, IDC_TESTPAD1), _("Test..."));\r
504                         Button_SetText(GetDlgItem(hW, IDC_ABOUTPAD1), _("About..."));\r
505                         Button_SetText(GetDlgItem(hW, IDC_CONFIGPAD2), _("Configure..."));\r
506                         Button_SetText(GetDlgItem(hW, IDC_TESTPAD2), _("Test..."));\r
507                         Button_SetText(GetDlgItem(hW, IDC_ABOUTPAD2), _("About..."));\r
508 \r
509                         return OnConfigurePluginsDialog(hW);\r
510 \r
511                 case WM_COMMAND:\r
512                         switch(LOWORD(wParam)) {\r
513                                 case IDC_CONFIGGPU:  ConfigureGPU(hW); return TRUE;\r
514                         case IDC_CONFIGSPU:  ConfigureSPU(hW); return TRUE;\r
515                         case IDC_CONFIGCDR:  ConfigureCDR(hW); return TRUE;\r
516                         case IDC_CONFIGPAD1: ConfigurePAD1(hW); return TRUE;\r
517                         case IDC_CONFIGPAD2: ConfigurePAD2(hW); return TRUE;\r
518 \r
519                                 case IDC_TESTGPU:    TestGPU(hW);   return TRUE;\r
520                                 case IDC_TESTSPU:    TestSPU(hW);   return TRUE;\r
521                                 case IDC_TESTCDR:    TestCDR(hW);   return TRUE;\r
522                                 case IDC_TESTPAD1:   TestPAD1(hW);  return TRUE;\r
523                                 case IDC_TESTPAD2:   TestPAD2(hW);  return TRUE;\r
524 \r
525                                 case IDC_ABOUTGPU:   AboutGPU(hW);  return TRUE;\r
526                                 case IDC_ABOUTSPU:   AboutSPU(hW);  return TRUE;\r
527                 case IDC_ABOUTCDR:   AboutCDR(hW);  return TRUE;\r
528                 case IDC_ABOUTPAD1:  AboutPAD1(hW); return TRUE;\r
529                     case IDC_ABOUTPAD2:  AboutPAD2(hW); return TRUE;\r
530 \r
531                                 case IDC_PLUGINSDIR: SetPluginsDir(hW); return TRUE;\r
532                                 case IDC_BIOSDIR:        SetBiosDir(hW);        return TRUE;\r
533 \r
534                                 case IDCANCEL: \r
535                                         OnCancel(hW); \r
536                                         if (CancelQuit) {\r
537                                                 SysClose(); exit(1);\r
538                                         }\r
539                                         return TRUE;\r
540                                 case IDOK:     \r
541                                         OnOK(hW);     \r
542                                         return TRUE;\r
543                         }\r
544         }\r
545         return FALSE;\r
546 }\r
547 \r
548 \r
549 void ConfigurePlugins(HWND hWnd) {\r
550     DialogBox(gApp.hInstance,\r
551               MAKEINTRESOURCE(IDD_CONFIG),\r
552               hWnd,  \r
553               (DLGPROC)ConfigurePluginsDlgProc);\r
554 }\r
555 \r
556 // NetPlay Config Dialog\r
557 \r
558 BOOL OnConfigureNetPlayDialog(HWND hW) {\r
559         WIN32_FIND_DATA FindData;\r
560         HANDLE Find;\r
561         HANDLE Lib;\r
562         PSEgetLibType    PSE_GetLibType;\r
563         PSEgetLibName    PSE_GetLibName;\r
564         PSEgetLibVersion PSE_GetLibVersion;\r
565         HWND hWC_NET=GetDlgItem(hW,IDC_LISTNET);\r
566         char tmpStr[256];\r
567         char *lp;\r
568         int i;\r
569 \r
570         strcpy(tmpStr, Config.PluginsDir);\r
571         strcat(tmpStr, "*.dll");\r
572         Find = FindFirstFile(tmpStr, &FindData);\r
573 \r
574         lp = (char *)malloc(strlen("Disabled")+8);\r
575         sprintf(lp, "Disabled");\r
576         i = ComboBox_AddString(hWC_NET, "Disabled");\r
577         ComboBox_SetItemData(hWC_NET, i, lp);\r
578         ComboBox_SetCurSel(hWC_NET,  0);\r
579 \r
580         do {\r
581                 if (Find==INVALID_HANDLE_VALUE) break;\r
582                 sprintf(tmpStr,"%s%s", Config.PluginsDir, FindData.cFileName);\r
583                 Lib = LoadLibrary(tmpStr);\r
584                 if (Lib!=NULL) {\r
585                         PSE_GetLibType = (PSEgetLibType) GetProcAddress((HMODULE)Lib,"PSEgetLibType");\r
586                         PSE_GetLibName = (PSEgetLibName) GetProcAddress((HMODULE)Lib,"PSEgetLibName");\r
587                         PSE_GetLibVersion = (PSEgetLibVersion) GetProcAddress((HMODULE)Lib,"PSEgetLibVersion");\r
588 \r
589                         if (PSE_GetLibType != NULL && PSE_GetLibName != NULL && PSE_GetLibVersion != NULL) {\r
590                                 unsigned long version = PSE_GetLibVersion();\r
591                                 long type;\r
592 \r
593                                 sprintf(tmpStr, "%s %d.%d", PSE_GetLibName(), (int)(version>>8)&0xff, (int)version&0xff);\r
594                                 type = PSE_GetLibType();\r
595                                 if (type & PSE_LT_NET  && ((version >> 16) == 2)) {\r
596                                         ComboAddPlugin(hWC_NET, Config.Net);\r
597                                 }\r
598                         }\r
599                 }\r
600         } while (FindNextFile(Find,&FindData));\r
601 \r
602         if (Find!=INVALID_HANDLE_VALUE) FindClose(Find);\r
603 \r
604         return TRUE;\r
605 }\r
606 \r
607 BOOL CALLBACK ConfigureNetPlayDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
608         int i,iCnt;HWND hWC;char * lp;\r
609 \r
610         switch(uMsg) {\r
611                 case WM_INITDIALOG:\r
612                         SetWindowText(hW, _("NetPlay Configuration"));\r
613 \r
614                         Button_SetText(GetDlgItem(hW, IDOK), _("OK"));\r
615                         Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));\r
616                         Static_SetText(GetDlgItem(hW, IDC_NETPLAY), _("NetPlay"));\r
617                         Button_SetText(GetDlgItem(hW, IDC_CONFIGNET), _("Configure..."));\r
618                         Button_SetText(GetDlgItem(hW, IDC_TESTNET), _("Test..."));\r
619                         Button_SetText(GetDlgItem(hW, IDC_ABOUTNET), _("About..."));\r
620                         Static_SetText(GetDlgItem(hW, IDC_NETPLAYNOTE), _("Note: The NetPlay Plugin Directory should be the same as the other Plugins."));\r
621 \r
622                         OnConfigureNetPlayDialog(hW);\r
623                         return TRUE;\r
624 \r
625                 case WM_COMMAND: {\r
626                 switch (LOWORD(wParam)) {\r
627                                 case IDC_CONFIGNET:  ConfigureNET(hW); return TRUE;\r
628                                 case IDC_TESTNET:    TestNET(hW);   return TRUE;\r
629                                 case IDC_ABOUTNET:   AboutNET(hW);  return TRUE;\r
630 \r
631                                 case IDCANCEL: \r
632                                         CleanCombo(IDC_LISTNET);\r
633                                         EndDialog(hW,FALSE); \r
634                                         return TRUE;\r
635 \r
636                                 case IDOK:\r
637                                         strcpy(Config.Net, GetSelDLL(hW, IDC_LISTNET));\r
638                                         SaveConfig();\r
639                                         CleanUpCombos(hW);\r
640                                         LoadPlugins();\r
641                                         CleanCombo(IDC_LISTNET);\r
642                                         EndDialog(hW,TRUE);\r
643                                         return TRUE;\r
644                         }\r
645                 }\r
646         }\r
647 \r
648         return FALSE;\r
649 }\r