summaryrefslogtreecommitdiff
path: root/protocols/Xfire/src/addgamedialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Xfire/src/addgamedialog.cpp')
-rw-r--r--protocols/Xfire/src/addgamedialog.cpp867
1 files changed, 867 insertions, 0 deletions
diff --git a/protocols/Xfire/src/addgamedialog.cpp b/protocols/Xfire/src/addgamedialog.cpp
new file mode 100644
index 0000000000..4d3d717b8c
--- /dev/null
+++ b/protocols/Xfire/src/addgamedialog.cpp
@@ -0,0 +1,867 @@
+#include "stdafx.h"
+
+#include "addgamedialog.h"
+
+extern HANDLE XFireWorkingFolder;
+extern Xfire_gamelist xgamelist;
+
+char inipath[MAX_PATH];
+char* buffer=NULL;
+BOOL dontClose=FALSE;
+
+vector<lbInicache> Inicache;
+Xfire_game* editgame=NULL;
+
+HWND hwndTab,hPage;
+
+void AddGameDialog(HWND hwndDlg,Xfire_game* game) {
+ //übergebendes game, dem editgame zuordnen, damit wechselt es in den editmodus
+ editgame=game;
+ if(DialogBox(hinstance,MAKEINTRESOURCE(IDD_ADDGAMEMAIN),hwndDlg,DlgAddGameProcMain)) {
+ }
+ //wieder auf NULL setzen
+ editgame=NULL;
+}
+
+static void FillGameList( LPVOID hwndDlg ) {
+ //liste.,suche und suchlabel unsichtbar machen
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_GAMELIST),SW_HIDE);
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_SEARCH),SW_HIDE);
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_STC14),SW_HIDE);
+
+ //handle von progressbar holen
+ HWND hwndPB=GetDlgItem((HWND)hwndDlg,IDC_PROGRESS);
+
+ //das schließen des dialogs verhindern
+ dontClose=TRUE;
+
+ if(Inicache.size()==0)
+ {
+ //temp xfirebaseob für strlower
+ Xfire_base tempxfire;
+ //vector für doppelfilter
+ vector<DWORD> dublBuffer;
+ //Cache ist leer, Cache füllen
+ FoldersGetCustomPath( XFireWorkingFolder, inipath, 1024, "" );
+ strcat_s(inipath,MAX_PATH,"\\");
+ strcat_s(inipath,MAX_PATH,"xfire_games.ini");
+
+ //ini soll in den RAM geladen werden, fürs schnellere ausparsen
+ FILE* f=fopen(inipath,"rb");
+ //wenn ini nicht aufrufbar, abbrechen
+ if(f==NULL)
+ return;
+ //ans ende der datei springen
+ fseek(f,0,SEEK_END);
+ //aktuelle position im filepoitner als größe zwischenspeichern
+ int size=ftell(f);
+ //buffer anelgen
+ buffer=new char[size+1];
+ //wenn nicht genug ram, abbruch
+ if(buffer==NULL)
+ return;
+ //buffer nullen
+ memset(buffer,0,size+1);
+ //zum anfang springen
+ fseek(f,0,SEEK_SET);
+ //ini komplett in den ram lesen
+ fread(buffer,size,1,f);
+ //datei schließen
+ fclose(f);
+
+ //parse einzelne sections aus
+
+ //pointer vom buffer
+ char*p=buffer;
+ //zahlenbufer1 und pointer
+ char zahlbuffer[10]="";
+ char*z=zahlbuffer;
+ //zahlenbuffer2 uznd pointer
+ char zahlbuffer2[10]="";
+ char*z2=zahlbuffer2;
+
+ //progressbar auf bytegröße anpassen
+ SendMessage(hwndPB, PBM_SETRANGE32, 0,size);
+
+ //solange bis wir bei 0 angekommen sind
+ if(*p!=0)
+ p++;
+ while(*p!=0)
+ {
+ if(*p=='['&&*(p-1)=='\n')
+ {
+ z=zahlbuffer;
+ z2=zahlbuffer2;
+ p++;
+ while(*p>='0'&&*p<='9'&&p!=0)
+ {
+ *z=*p;
+ p++;
+ z++;
+ }
+ *z=0;
+ if(*p=='_') {
+ p++;
+ while(*p>='0'&&*p<='9'&&p!=0)
+ {
+ *z2=*p;
+ p++;
+ z2++;
+ }
+ *z2=0;
+ }
+
+ //erste zahl gefunden
+ if(z!=zahlbuffer)
+ {
+ int gameid=atoi(zahlbuffer);
+ //prüfe ob das game schon in der gameliste ist
+ if(!xgamelist.Gameinlist(gameid))
+ {
+ char*name=p;
+ lbInicache listentry;
+ char gameidtemp[10]="";
+ char ret[512];
+ DWORD uniqid=0;
+ BYTE accLaunch=0;
+ BYTE accDetect=0;
+
+ //bis zum nächsten isgleich springen
+ while(*name!='=')
+ name++;
+ name++;
+
+ //jetzt den umbruch suchen
+ p=name;
+ while(*p!='\n'&&*p!='\r') p++;
+ *p=0;
+ p++;
+
+ //spielnamen in den listentry einfügen
+ strcpy_s(listentry.name,255,name);
+
+ if(z2!=zahlbuffer2)
+ {
+ listentry.gameid=MAKELONG(gameid,atoi(zahlbuffer2));
+ sprintf_s(gameidtemp,10,"%d_%d",gameid,atoi(zahlbuffer2));
+ }
+ else
+ {
+ listentry.gameid=gameid;
+ sprintf_s(gameidtemp,10,"%d",gameid);
+ }
+
+
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherExe", "", ret, 512, inipath)) {
+ //lower launchstring
+ tempxfire.strtolower(ret);
+ //einzelnen ziechen zusammenrechnen
+ if(z2!=zahlbuffer2)
+ {
+ //wenn pfad, dann exe vorher rausziehen
+ if(strrchr(ret,'\\'))
+ accLaunch=tempxfire.accStringByte(strrchr(ret,'\\'));
+ else
+ accLaunch=tempxfire.accStringByte(ret);
+ }
+ //Steam.exe als launcher?
+ if((ret[0]=='s')&&
+ ret[1]=='t'&&
+ ret[2]=='e'&&
+ ret[3]=='a'&&
+ ret[4]=='m'&&
+ ret[5]=='.'&&
+ ret[6]=='e'&&
+ ret[7]=='x'&&
+ ret[8]=='e')
+ {
+ strcat_s(listentry.name,255," (Steam)");
+ }
+ }
+
+ if(z2!=zahlbuffer2) {
+ if(xfire_GetPrivateProfileString(gameidtemp, "DetectExe", "", ret, 512, inipath)) {
+ //lower launchstring
+ tempxfire.strtolower(ret);
+ //einzelnen ziechen zusammenrechnen
+ //wenn pfad, dann exe vorher rausziehen
+ if(strrchr(ret,'\\'))
+ accDetect=tempxfire.accStringByte(strrchr(ret,'\\'));
+ else
+ accDetect=tempxfire.accStringByte(ret);
+ }
+ }
+
+ //standardmäßig TRUE
+ BOOL addtolist=TRUE;
+
+ //schon ein eintrag vorhanden?
+ if(z2!=zahlbuffer2) {
+ //uniq id zusammen bauen aus spielid sowie zusammengerechneten launchstring und detectstring
+ uniqid=MAKELONG(gameid,MAKEWORD(accLaunch,accDetect));
+ for(uint i = 0 ; i < dublBuffer.size() ; i ++) {
+ if(dublBuffer.at(i)==uniqid)
+ {
+ addtolist=FALSE;
+ break;
+ }
+ }
+ }
+
+ //nur eintragen, wenn kein doppelter gefunden wurde
+ if(addtolist) {
+ //eintrag einfügen
+ int idx=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_ADDSTRING, 0, (LPARAM)listentry.name);
+ SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_SETITEMDATA, idx, listentry.gameid);
+ //eintrag in den buffer für die dublikateprüfung
+ dublBuffer.push_back(uniqid);
+ //und eintrag in den cache
+ Inicache.push_back(listentry);
+ SendMessage(hwndPB, PBM_SETPOS, (WPARAM)(p-buffer), 0);
+ }
+ }
+ }
+ }
+ else
+ p++;
+ }
+ }
+ else
+ {
+ //liste mit dem cache aufbauen
+ for(uint i = 0 ; i < Inicache.size() ; i ++) {
+ //spielid in der liste spielliste?
+ if(!xgamelist.Gameinlist(LOWORD(Inicache.at(i).gameid)))
+ {
+ //eintrag in die listeeinfügen
+ int idx=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_ADDSTRING, 0, (LPARAM)Inicache.at(i).name);
+ //gameid zuweisen
+ SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_SETITEMDATA, idx, Inicache.at(i).gameid);
+ }
+ }
+ }
+
+ //progressbar unsichtbar
+ ShowWindow(hwndPB,SW_HIDE);
+ //liste sichtbar machen
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_GAMELIST),SW_SHOW);
+ //suche und suchlabel sichtbar machen
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_SEARCH),SW_SHOW);
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_STC14),SW_SHOW);
+
+ dontClose=FALSE;
+}
+
+BOOL OpenFileDialog(HWND hwndDlg,OPENFILENAME*ofn,char*exe) {
+ //pointer zum exenamen
+ char* exename=NULL;
+ //buffer vom pfad
+ static char szFile[260]=""; //static damit noch nach dem aufruf lesbar bleibt
+ //buffer vom filter
+ char szFilter[260]="";
+ //backslash suchen
+ exename=strrchr(exe,'\\')+1;
+ //kein backslash dann normal ret als exenamen verwenden
+ if((int)exename==1) exename=exe;
+ //filterstring aufbauen
+ sprintf(szFilter,"%s|%s|%s|*.*|",exename,exename,Translate("All Files"));
+ //umbruch in 0 wandeln
+ unsigned int sizeFilter=strlen(szFilter);
+ for(unsigned int i=0;i<sizeFilter;i++)
+ if(szFilter[i]=='|') szFilter[i]=0;
+ //openfiledia vorbereiten
+ ZeroMemory(ofn, sizeof(OPENFILENAME));
+ ofn->lStructSize = sizeof(OPENFILENAME);
+ ofn->hwndOwner = hwndDlg;
+ ofn->lpstrFile = szFile;
+ ofn->nMaxFile = sizeof(szFile);
+ ofn->lpstrFilter = szFilter;
+ ofn->nFilterIndex = 1;
+ ofn->lpstrFileTitle = exe;
+ ofn->nMaxFileTitle = 0;
+ ofn->lpstrInitialDir = NULL;
+ ofn->Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+
+ return GetOpenFileName(ofn);
+}
+
+INT_PTR CALLBACK DlgAddGameProc (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch (uMsg) {
+ case WM_INITDIALOG:
+ {
+ //übersetzen lassen
+ TranslateDialogDefault(hwndDlg);
+
+
+ //per thread liste füllen
+ mir_forkthread(FillGameList,hwndDlg);
+ }
+ break;
+ case WM_COMMAND:
+ if(LOWORD(wParam) == IDC_SEARCH && HIWORD(wParam)==EN_CHANGE)
+ {
+ char temp[256];
+ //eingabe bei der suche auslesen
+ GetDlgItemText(hwndDlg,IDC_SEARCH,temp,256);
+ //eingabe in der liste suchen
+ int idx=SendDlgItemMessage(hwndDlg, IDC_GAMELIST, LB_FINDSTRING, 0, (LPARAM)temp);
+ //gefunden?
+ if(idx!=LB_ERR)
+ {
+ //als aktiv setzen
+ SendDlgItemMessage(hwndDlg, IDC_GAMELIST,LB_SETCURSEL,idx,0);
+ }
+ }
+ else if(LOWORD(wParam) == IDCANCEL)
+ {
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ else if(LOWORD(wParam) == IDC_CUSTOM)
+ {
+ int idx=SendDlgItemMessage(hwndDlg, IDC_GAMELIST, LB_GETCURSEL, 0, 0);
+ //es wurde was ausgewählt?
+ if(idx==LB_ERR) {
+ MessageBoxA(hwndDlg,Translate("Please choose one game in the list!"),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ char ret[512]="";
+ char gameidtemp[10]="";
+
+ int gameids=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_GETITEMDATA, idx, 0);
+ //gameid splitten
+ int gameid1=LOWORD(gameids);
+ int gameid2=HIWORD(gameids);
+
+ if(gameid2!=0)
+ sprintf_s(gameidtemp,10,"%d_%d",gameid1,gameid2);
+ else
+ sprintf_s(gameidtemp,10,"%d",gameid1);
+
+ //spielnamen holen
+ if(xfire_GetPrivateProfileString(gameidtemp, "LongName", "", ret, 512, inipath)) {
+ sprintf_s(gameidtemp,10,"%d",gameid1);
+
+ //einige felder vorbelegen
+ SetDlgItemText(hPage,IDC_ADD_NAME,ret);
+ SetDlgItemText(hPage,IDC_ADD_DETECTEXE,"");
+ SetDlgItemText(hPage,IDC_ADD_LAUNCHEREXE,"");
+ SetDlgItemText(hPage,IDC_ADD_ID,gameidtemp);
+ SetDlgItemText(hPage,IDC_ADD_STATUSMSG,"");
+ SetDlgItemText(hPage,IDC_ADD_CUSTOMPARAMS,"");
+ SetDlgItemText(hPage,IDC_ADD_SENDID,gameidtemp);
+
+ //auf customeintrag edit tab wechseln
+ TabCtrl_SetCurSel(hwndTab, 1);
+ ShowWindow(hwndDlg,SW_HIDE);
+ ShowWindow(hPage,SW_SHOW);
+ }
+ }
+ }
+ else if(LOWORD(wParam) == IDOK)
+ {
+ int idx=SendDlgItemMessage(hwndDlg, IDC_GAMELIST, LB_GETCURSEL, 0, 0);
+ //es wurde was ausgewählt?
+ if(idx==LB_ERR) {
+ MessageBoxA(hwndDlg,Translate("Please choose one game in the list!"),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ //datei öffnen dialog
+ OPENFILENAME ofn;
+ //listdata auslesen, wo die gameid gespeihcert ist
+ int gameids=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_GETITEMDATA, idx, 0);
+ //gameid splitten
+ int gameid1=LOWORD(gameids);
+ int gameid2=HIWORD(gameids);
+ char gameidtemp[10]="";
+ char ret[512];
+
+ if(gameid2!=0)
+ sprintf_s(gameidtemp,10,"%d_%d",gameid1,gameid2);
+ else
+ sprintf_s(gameidtemp,10,"%d",gameid1);
+
+ //neuen gameeintrag anlegen
+ Xfire_game* newgame=new Xfire_game();
+ //gameid und sendid setzen
+ newgame->id=gameid1;
+ newgame->send_gameid=gameid1;
+ //es handelt sich um einen customeintrag, man staune xD
+ newgame->custom=1;
+
+ //launcherexe abfragen
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherExe", "", ret, 512, inipath)) {
+ //datei vom user öffnen lassen
+ if(OpenFileDialog(hwndDlg,&ofn,ret))
+ {
+ //lowercase pfad
+ newgame->strtolower(ofn.lpstrFile);
+ //pfad dem spiel zuordnen
+ newgame->setString(ofn.lpstrFile,&newgame->launchparams);
+ }
+ else
+ {
+ //speicher freigeben
+ delete newgame;
+ return FALSE;
+ }
+ }
+
+ //detectexe abfragen
+ if(xfire_GetPrivateProfileString(gameidtemp, "DetectExe", "", ret, 512, inipath)) {
+ //datei vom user öffnen lassen
+ if(OpenFileDialog(hwndDlg,&ofn,ret))
+ {
+ //lowercase pfad
+ newgame->strtolower(ofn.lpstrFile);
+ //pfad dem spiel zuordnen
+ newgame->setString(ofn.lpstrFile,&newgame->path);
+ }
+ else
+ {
+ //speicher freigeben
+ delete newgame;
+ return FALSE;
+ }
+ } //MatchExe abfragen
+ else if(xfire_GetPrivateProfileString(gameidtemp, "MatchExe", "", ret, 512, inipath)) {
+ //datei vom user öffnen lassen
+ if(OpenFileDialog(hwndDlg,&ofn,ret))
+ {
+ //lowercase pfad
+ newgame->strtolower(ofn.lpstrFile);
+ //pfad dem spiel zuordnen
+ newgame->setString(ofn.lpstrFile,&newgame->path);
+ }
+ else
+ {
+ //speicher freigeben
+ delete newgame;
+ return FALSE;
+ }
+ }
+
+
+ //prüfe ob schon ein launchstring festgelegt wurde, wenn nicht die detectexe nehmen
+ if(!newgame->launchparams&&newgame->path) {
+ newgame->setString(newgame->path,&newgame->launchparams);
+ }
+
+ //prüfe ob schon ein detectexe festgelegt wurde, wenn nicht die launchstring nehmen
+ if(newgame->launchparams&&!newgame->path) {
+ newgame->setString(newgame->launchparams,&newgame->path);
+ }
+
+ //LauncherUrl wird der launcherstring überschrieben
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherUrl", "", ret, 512, inipath)) {
+ newgame->setString(ret,&newgame->launchparams);
+ }
+ else if(xfire_GetPrivateProfileString(gameidtemp, "Launch", "", ret, 512, inipath)) {
+ str_replace(ret,"%UA_LAUNCHER_EXE_PATH%",""); //erstmal unwichtige sachen entfernen
+ //str_replace(ret,"%UA_LAUNCHER_EXTRA_ARGS%",""); // - auch entfernen
+ str_replace(ret,"%UA_LAUNCHER_LOGIN_ARGS%",""); // - auch entfernen
+
+ //ein leerzeichen anfügen
+ newgame->appendString(" ",&newgame->launchparams);
+ //nun commandline des launchstringes dranhängen
+ newgame->appendString(ret,&newgame->launchparams);
+ }
+
+ //restliche wichtige felder einfügen
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherPasswordArgs", "", ret, 512, inipath))
+ newgame->setString(ret,&newgame->pwparams);
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherNetworkArgs", "", ret, 512, inipath))
+ newgame->setString(ret,&newgame->networkparams);
+ if(xfire_GetPrivateProfileString(gameidtemp, "CommandLineMustContain[0]", "", ret, 512, inipath))
+ newgame->setString(ret,&newgame->mustcontain);
+ if(xfire_GetPrivateProfileString(gameidtemp, "XUSERSendId", "", ret, 512, inipath))
+ newgame->send_gameid=atoi(ret);
+ if(xfire_GetPrivateProfileString(gameidtemp, "XUSERSetStatusMsg", "", ret, 512, inipath))
+ newgame->setstatusmsg=atoi(ret);
+
+ //namen setzen und icon laden
+ newgame->setNameandIcon();
+ //spiel in die gameliste einfügen
+ xgamelist.Addgame(newgame);
+ //derzeitige gameliste in die datenbank eintragen
+ xgamelist.writeDatabase();
+ //startmenu leeren
+ xgamelist.clearStartmenu();
+ //startmenu neuerzeugen
+ xgamelist.createStartmenu();
+
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ }
+ break;
+ case WM_CLOSE:
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+ //hauptfenster schließen
+ SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ break;
+ }
+ return FALSE;
+}
+
+
+INT_PTR CALLBACK DlgAddGameProc2 (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ //ein spiel wurde zum editieren geöffnet, felder alle vorbelegen
+ if(editgame) {
+ //add augf übernehmen umstellen
+ SetDlgItemTextA(hwndDlg,IDOK,Translate("Apply"));
+
+ //namen vorbelegen
+ if(editgame->customgamename)
+ SetDlgItemTextA(hwndDlg,IDC_ADD_NAME,editgame->customgamename);
+ else if(editgame->name)
+ SetDlgItemTextA(hwndDlg,IDC_ADD_NAME,editgame->name);
+
+ //gameid setzen und feld schreibschützen
+ char gameid[10]="";
+ _itoa_s(editgame->id,gameid,10,10);
+ SetDlgItemTextA(hwndDlg,IDC_ADD_ID,gameid);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ADD_ID),FALSE);
+
+ //sendgameid setzen, bei -1 leer lassen
+ if(editgame->send_gameid!=-1)
+ {
+ _itoa_s(editgame->send_gameid,gameid,10,10);
+ SetDlgItemTextA(hwndDlg,IDC_ADD_SENDID,gameid);
+ }
+
+ //launcherstring
+ if(editgame->launchparams) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_LAUNCHEREXE,editgame->launchparams);
+ }
+
+ //detectstring
+ if(editgame->path) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_DETECTEXE,editgame->path);
+ }
+
+ //statusmsg
+ if(editgame->statusmsg) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_STATUSMSG,editgame->statusmsg);
+ }
+
+ //mustcontain parameter
+ if(editgame->mustcontain) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_CUSTOMPARAMS,editgame->mustcontain);
+ }
+ }
+ //dialog übersetzen
+ TranslateDialogDefault(hwndDlg);
+
+ return TRUE;
+
+ case WM_COMMAND:
+ {
+ if(LOWORD(wParam) == IDC_SENDIDHELP)
+ {
+ MessageBoxA(hwndDlg, Translate("If you add a mod of a Xfire supported game, then you can specify what gameid will be sent to Xfire. So if you add a Half-Life mod, you can set the Half-Life game id and if you start the game, your Xfire buddies will see the Half-Life game icon next to your name and the game time will be tracked."), Translate("XFire Options"), MB_OK|MB_ICONASTERISK);
+ }
+ else if(LOWORD(wParam) == IDC_GAMEIDHELP)
+ {
+ MessageBoxA(hwndDlg, Translate("Every game in Xfire needs an id. Use a number above the last used id to avoid problems with used ids. Every number above 10000 should be save. This id will not be sent to Xfire, when you start a game."), Translate("XFire Options"), MB_OK|MB_ICONASTERISK);
+ }
+ else if(LOWORD(wParam) == IDC_ADD_BROWSEDETECT)
+ {
+ OPENFILENAME ofn;
+ if(OpenFileDialog(hwndDlg,&ofn,"*.exe"))
+ {
+ SetDlgItemText(hwndDlg,IDC_ADD_DETECTEXE,ofn.lpstrFile);
+ }
+ }
+ else if(LOWORD(wParam) == IDC_ADD_BROWSELAUNCHER)
+ {
+ OPENFILENAME ofn;
+ if(OpenFileDialog(hwndDlg,&ofn,"*.exe"))
+ {
+ SetDlgItemText(hwndDlg,IDC_ADD_LAUNCHEREXE,ofn.lpstrFile);
+ }
+ }
+ else if(LOWORD(wParam) == IDCANCEL)
+ {
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ else if(LOWORD(wParam) == IDOK)
+ {
+ char temp[256];
+
+ //fillgames sucht noch
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+
+ //neuen gameeintrag anlegen
+ Xfire_game* newgame=NULL;
+
+ if(editgame)
+ newgame=editgame;
+ else
+ newgame=new Xfire_game();
+
+ //Spielname
+ GetDlgItemText(hwndDlg,IDC_ADD_NAME,temp,256);
+ if(!strlen(temp))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please enter a game name."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ //spielname zuordnen
+ newgame->setString(temp,&newgame->customgamename);
+ //spielnamen fürs menü
+ newgame->setString(temp,&newgame->name);
+ }
+ //spielid nur setzen/prüfen, wenn kein editgame
+ if(!editgame) {
+ GetDlgItemText(hwndDlg,IDC_ADD_ID,temp,256);
+ if(!strlen(temp))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please enter a game id."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ int gameid=atoi(temp);
+ //negative gameid blocken
+ if(gameid<1)
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please enter a game id above 1."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ //gameid auf uniq prüfen
+ else if(xgamelist.getGamebyGameid(gameid))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("This game id is already in use."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ //gameid zuordnen
+ newgame->id=gameid;
+ //standardmäßig wird bei einem customeintrag keine id versendet
+ newgame->send_gameid=-1;
+ }
+ }
+ //zu sendene spielid
+ GetDlgItemText(hwndDlg,IDC_ADD_SENDID,temp,256);
+ if(strlen(temp))
+ {
+ //standardmäßig wird bei einem customeintrag keine id versendet
+ int sendid=atoi(temp);
+ if(sendid>0)
+ newgame->send_gameid=sendid;
+ }
+
+ //launcher exe
+ GetDlgItemText(hwndDlg,IDC_ADD_LAUNCHEREXE,temp,256);
+ if(strlen(temp))
+ {
+ //lowercase pfad
+ newgame->strtolower(temp);
+ //detect exe
+ newgame->setString(temp,&newgame->launchparams);
+ }
+ //detectexe
+ GetDlgItemText(hwndDlg,IDC_ADD_DETECTEXE,temp,256);
+ if(!strlen(temp))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please select a game exe. Note: If you dont select a launcher exe, the game exe will be used in the game start menu."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ //lowercase pfad
+ newgame->strtolower(temp);
+ //detect exe
+ newgame->setString(temp,&newgame->path);
+ //wenn kein launcher exe/pfad angeben wurde, dann den gamepath nehmen
+ if(!newgame->launchparams)
+ newgame->setString(temp,&newgame->launchparams);
+
+ }
+ //mustcontain parameter
+ GetDlgItemText(hwndDlg,IDC_ADD_CUSTOMPARAMS,temp,256);
+ if(strlen(temp))
+ {
+ newgame->setString(temp,&newgame->mustcontain);
+ }
+ //statusmsg speichern
+ GetDlgItemText(hwndDlg,IDC_ADD_STATUSMSG,temp,256);
+ if(strlen(temp))
+ {
+ newgame->setString(temp,&newgame->statusmsg);
+ newgame->setstatusmsg=1;
+ }
+ //custom eintrag aktivieren
+ newgame->custom=1;
+ //spiel in die gameliste einfügen, aber nur im nicht editmodus
+ if(!editgame)
+ xgamelist.Addgame(newgame);
+ //derzeitige gameliste in die datenbank eintragen
+ xgamelist.writeDatabase();
+ //startmenu leeren
+ xgamelist.clearStartmenu();
+ //startmenu neuerzeugen
+ xgamelist.createStartmenu();
+
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+
+INT_PTR CALLBACK DlgAddGameProcMain (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ TCITEMA tci = {0};
+ int iTotal;
+ RECT rcClient;
+
+ //icon des dialogs setzen
+ SendMessage(hwndDlg,WM_SETICON, (WPARAM)false, (LPARAM)LoadIcon(hinstance, MAKEINTRESOURCE(IDI_TM)));
+
+ hwndTab = GetDlgItem(hwndDlg, IDC_OPTIONSTAB);
+ TabCtrl_DeleteAllItems(hwndTab);
+ GetClientRect(GetParent(hwndTab), &rcClient);
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_ADDGAME), hwndDlg, DlgAddGameProc);
+
+ //bei editgame keine spiellisteauswahl
+ if(!editgame)
+ {
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Supported Games");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 10, rcClient.bottom - 28, 1);
+ iTotal++;
+ }
+ else
+ ShowWindow(hPage,FALSE);
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_ADDGAME2), hwndDlg, DlgAddGameProc2);
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Custom game");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 10, rcClient.bottom - 28, 1);
+ iTotal++;
+
+ //bei editgame 2. registerkarte aktiv schalten
+ if(!editgame) {
+ ShowWindow(hPage,FALSE);
+ TabCtrl_SetCurSel(hwndTab, 0);
+ }
+
+ return TRUE;
+ }
+ case WM_CLOSE:
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) return FALSE;
+ //buffer leeren
+ if(buffer)
+ {
+ delete[] buffer;
+ buffer=NULL;
+ }
+ EndDialog(hwndDlg,0);
+ break;
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom)
+ {
+ case 0:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ TCITEM tci;
+ int i,count;
+
+ tci.mask = TCIF_PARAM;
+ count = TabCtrl_GetItemCount(GetDlgItem(hwndDlg,IDC_OPTIONSTAB));
+ for (i=0; i<count; i++)
+ {
+ TabCtrl_GetItem(GetDlgItem(hwndDlg,IDC_OPTIONSTAB),i,&tci);
+ SendMessage((HWND)tci.lParam,WM_NOTIFY,0,lParam);
+ }
+ break;
+ }
+ }
+ break;
+
+ case IDC_OPTIONSTAB:
+ {
+ HWND hTabCtrl = GetDlgItem(hwndDlg, IDC_OPTIONSTAB);
+
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case TCN_SELCHANGING:
+ {
+ TCITEM tci;
+
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(hTabCtrl, TabCtrl_GetCurSel(hTabCtrl), &tci);
+ ShowWindow((HWND)tci.lParam, SW_HIDE);
+ }
+ break;
+
+ case TCN_SELCHANGE:
+ {
+ TCITEM tci;
+
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(hTabCtrl, TabCtrl_GetCurSel(hTabCtrl), &tci);
+ ShowWindow((HWND)tci.lParam,SW_SHOW);
+ }
+ break;
+ }
+ break;
+ }
+ }
+ break;
+ }
+ return FALSE;
+} \ No newline at end of file