/* * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network. * * Copyright (C) 2010 by * dufte * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Based on J. Lawler - BaseProtocol * Herbert Poul/Beat Wolf - xfirelib * * Miranda ICQ: the free icq client for MS Windows * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede * */ #include "stdafx.h" #include "baseProtocol.h" #include "m_variables.h" #include "recvprefspacket.h" #include "Xfire_gamelist.h" #include "addgamedialog.h" #include "variables.h" extern HANDLE XFireWorkingFolder; extern HANDLE XFireIconFolder; extern xfire_prefitem xfireconfig[XFIRE_RECVPREFSPACKET_MAXCONFIGS]; extern Xfire_gamelist xgamelist; struct mytreeitem { TCHAR name[256]; char dbentry[256]; int parent; int icon; HTREEITEM hitem; }; extern int bpStatus; BOOL alreadyInit=FALSE; HWND ghwndDlg2; HWND addgameDialog=NULL; xfireconfigitem xfireconfigitems[XFIRE_RECVPREFSPACKET_SUPPORTEDONFIGS] = { {IDC_KONFIG_1,1,"sendgamestatus"}, {IDC_KONFIG_2,3,"hideprofile"}, {IDC_KONFIG_3,2,"ipportdetec"}, {IDC_KONFIG_4,0xa,"shownicks"}, {IDC_KONFIG_5,0xb,"ts2detection"}, {IDC_KONFIG_6,0xc,"sendtyping"}, {IDC_KONFIG_7,8,"friendsoffriends"}, }; #define NUM_ICONS 4 static mytreeitem mytree[] = { {LPGENT("Avatars"),"",1,0}, {LPGENT("Disable avatars"),"noavatars",0,0}, {LPGENT("Don't download avatars of clan members"),"noclanavatars",0,0}, {LPGENT("Use alternate way for Avatar download"),"specialavatarload",0,0}, {LPGENT("General"),"",1,0}, {LPGENT("Automatically reconnect on protocol version changes"),"recprotoverchg",0,0}, {LPGENT("No Ip/Port in StatusMsg"),"noipportinstatus",0,0}, {LPGENT("Use Online status for unsupported global statuses"),"oninsteadafk",0,0}, {LPGENT("Don't move friends to clan groups"),"skipfriendsgroups",0,0}, {LPGENT("GameServerQuery support"),"gsqsupport",0,0}, {LPGENT("No custom away message"),"nocustomaway",0,0}, {LPGENT("Remove friend of friend buddies from database"),"fofdbremove",0,0}, /*{"Show usernames only","onlyusername",0},*/ {LPGENT("Hide yourself in buddylist"),"skipmyself",0,0}, {LPGENT("Don't display game search results"),"dontdisresults",0,0}, {LPGENT("Don't display game search status window"),"dontdissstatus",0,0}, {LPGENT("Display popup, if someone start a game"),"gamepopup",0,0}, {LPGENT("Don't automatically create clan groups"),"noclangroups",0,0}, {LPGENT("Enable MBot support"),"mbotsupport",0,0}, {LPGENT("Gamedetection"),"",1,0}, /*{"Scan for games on every Miranda start","scanalways",0},*/ {LPGENT("Disable game detection"),"nogamedetect",0,0}, /*{"Enable server IP/Port detection","ipportdetec",0},*/ /*{"Enable TeamSpeak2/Ventrilo detection","",0},*/ {LPGENT("Use TSRemote.dll to get teamspeak server info"),"ts2useremote",0,0}, {LPGENT("Disable popups when ingame"),"nopopups",0,0}, {LPGENT("Disable sound events when ingame"),"nosoundev",0,0}, {LPGENT("Files"),"",1,0}, {LPGENT("Automatically update xfire_games.ini (pro-laming.de)"),"autoiniupdate",0,0}, {LPGENT("Automatically update icons.dll (pro-laming.de)"),"autoicodllupdate",0,0}, {LPGENT("Download missing game icons from Xfire website"),"xfiresitegameico",0,0}, {LPGENT("No backup on update"),"nobackupini",0,0}, {LPGENT("Background updating"),"dontaskforupdate",0,0}, }; //funktion zum auslesen aller einträge unter XFireBlock static int enumSettingsProc(const char *szSetting,LPARAM lParam) { if(strlen(szSetting)>0) { SendDlgItemMessageA( (HWND)lParam, IDC_BLOCKUSER, LB_ADDSTRING, 0, (LPARAM)szSetting); } EnableDlgItem((HWND)lParam, IDC_REMUSER, TRUE); return 0; } //damit die änderungen sofort sichtbar sind static INT_PTR CALLBACK DlgProcOpts2(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { char inipath[XFIRE_MAX_STATIC_STRING_LEN]=""; static BOOL inifound = FALSE; static BOOL dllfound = FALSE; static int nomsgboxsel[] = {1,0,2}; static HWND hwndTree = NULL; static char login[128]; switch (msg) { case PSM_CHANGED: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_INITDIALOG: { DBVARIANT dbv; TranslateDialogDefault(hwndDlg); ghwndDlg2=hwndDlg; hwndTree = GetDlgItem(hwndDlg, IDC_TREE); SetWindowLongPtr(hwndTree,GWL_STYLE,GetWindowLongPtr(hwndTree,GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES); SendMessage(hwndDlg, DM_REBUILD_TREE, 0, 0); strcpy(inipath, XFireGetFoldersPath ("IniFile")); strcat(inipath, "xfire_games.ini"); FILE * f = fopen(inipath,"r"); if(f!=NULL) { fclose(f); CheckDlgButton(hwndDlg,IDC_CHKG,1); inifound = TRUE; } else { EnableDlgItem(hwndDlg, IDC_SETUPGAMES, FALSE); inifound = FALSE; } strcpy(inipath, XFireGetFoldersPath ("IconsFile")); strcat(inipath, "icons.dll"); f = fopen(inipath,"r"); if(f!=NULL) { fclose(f); CheckDlgButton(hwndDlg,IDC_CHKI,1); dllfound = TRUE; } else dllfound = FALSE; if(!db_get(NULL,protocolname,"login",&dbv)) { SetDlgItemTextA(hwndDlg,IDC_LOGIN,dbv.pszVal); db_free(&dbv); } if(!db_get(NULL,protocolname,"Nick",&dbv)) { SetDlgItemTextA(hwndDlg,IDC_NICK,dbv.pszVal); db_free(&dbv); } if(!db_get(NULL,protocolname,"password",&dbv)) { //bit of a security hole here, since it's easy to extract a password from an edit box CallService(MS_DB_CRYPT_DECODESTRING,strlen(dbv.pszVal)+1,(LPARAM)dbv.pszVal); SetDlgItemTextA(hwndDlg,IDC_PASSWORD,dbv.pszVal); db_free(&dbv); } char temp[255]=""; mir_snprintf(temp, SIZEOF(temp), "%d", db_get_b(NULL, protocolname, "protover", 0x5b)); SetDlgItemTextA(hwndDlg,IDC_PVER,temp); EnableWindow(GetDlgItem(hwndDlg,IDC_LASTGAME),FALSE); if(!db_get(NULL,protocolname,"LastGame",&dbv)) { SetDlgItemTextA(hwndDlg,IDC_LASTGAME,dbv.pszVal); db_free(&dbv); } if(bpStatus==ID_STATUS_OFFLINE&&bpStatus!=ID_STATUS_CONNECTING) { EnableDlgItem(hwndDlg, IDC_NICK, FALSE); } else { int size=sizeof(xfireconfigitems)/sizeof(xfireconfigitem); for(int i=0;icode) { case PSN_APPLY: { int reconnectRequired=0; char str[128]; DBVARIANT dbv; GetDlgItemTextA(hwndDlg,IDC_LOGIN,login,sizeof(login)); dbv.pszVal=NULL; if(db_get(NULL,protocolname,"login",&dbv) || strcmp(login,dbv.pszVal)) reconnectRequired=1; if(dbv.pszVal!=NULL) db_free(&dbv); //den login lowercasen int size=strlen(login); BOOL mustlowercase=FALSE; for(int i=0;i='A'&&login[i]<='Z') mustlowercase=TRUE; login[i]=tolower(login[i]); } if(mustlowercase) { MessageBoxA(NULL,Translate("The username must be lowercase, so it will be lowercased saved."),Translate("XFire Options"),MB_OK|MB_ICONINFORMATION); SetDlgItemTextA(hwndDlg,IDC_LOGIN,login); } db_set_s(NULL,protocolname,"login",login); db_set_s(NULL,protocolname,"Username",login); //nur wenn der nick erfolgreich übertragen wurde GetDlgItemTextA(hwndDlg,IDC_NICK,login,sizeof(login)); dbv.pszVal=NULL; if(db_get(NULL,protocolname,"Nick",&dbv) || strcmp(login,dbv.pszVal)) { if(CallService(XFIRE_SET_NICK,0,(WPARAM)login)) db_set_s(NULL,protocolname,"Nick",login); } if(dbv.pszVal!=NULL) db_free(&dbv); GetDlgItemTextA(hwndDlg,IDC_PASSWORD,str,sizeof(str)); CallService(MS_DB_CRYPT_ENCODESTRING,sizeof(str),(LPARAM)str); dbv.pszVal=NULL; if(db_get(NULL,protocolname,"password",&dbv) || strcmp(str,dbv.pszVal)) reconnectRequired=1; if(dbv.pszVal!=NULL) db_free(&dbv); db_set_s(NULL,protocolname,"password",str); GetDlgItemTextA(hwndDlg,IDC_SERVER,str,sizeof(str)); //neue preferencen sichern if(bpStatus!=ID_STATUS_OFFLINE&&bpStatus!=ID_STATUS_CONNECTING) { int size=sizeof(xfireconfigitems)/sizeof(xfireconfigitem); for(int i=0;i" )); SendDlgItemMessage( hwndDlg, IDC_FOFGROUP, CB_ADDSTRING, 0, (LPARAM)TranslateT("" )); mir_snprintf(temp, SIZEOF(temp), "%d", gruppen_id); while(!db_get_s(NULL,"CListGroups",temp,&dbv)) { gruppen_id++; mir_snprintf(temp, SIZEOF(temp), "%d", gruppen_id); if(dbv.pszVal!=NULL) { SendDlgItemMessageA( hwndDlg, IDC_CLANGROUP, CB_ADDSTRING, 0, (LPARAM)&dbv.pszVal[1]); SendDlgItemMessageA( hwndDlg, IDC_FOFGROUP, CB_ADDSTRING, 0, (LPARAM)&dbv.pszVal[1]); db_free(&dbv); } } SendDlgItemMessage( hwndDlg, IDC_CLANGROUP, CB_SETCURSEL, db_get_b(NULL,protocolname,"mainclangroup",0), 0); SendDlgItemMessage( hwndDlg, IDC_FOFGROUP, CB_SETCURSEL, db_get_b(NULL,protocolname,"fofgroup",0), 0); } return TRUE; } case DM_REBUILD_TREE: //baue optionsmenü auf TreeView_SelectItem(hwndTree, NULL); ShowWindow(hwndTree, SW_HIDE); TreeView_DeleteAllItems(hwndTree); { TVINSERTSTRUCT tvis; HTREEITEM lastSec = NULL; tvis.hParent = NULL; tvis.hInsertAfter = TVI_SORT; tvis.item.state = tvis.item.stateMask = TVIS_EXPANDED; int size=sizeof(mytree)/sizeof(mytreeitem); for(int i=0;iidFrom) { case IDC_TREE: { switch(((NMHDR*)lParam)->code) { //wenn was geändert wurde, apply aktivieren case TVN_SELCHANGEDA: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case TVN_KEYDOWN: //tastatursteuerung { NMTVKEYDOWN* ptkd = (NMTVKEYDOWN*)lParam; if (ptkd&&ptkd->wVKey==VK_SPACE&&TreeView_GetSelection(ptkd->hdr.hwndFrom)) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } case NM_CLICK: //wenn was geklickt wurde, apply aktivieren { TVHITTESTINFO hti; hti.pt.x=(short)LOWORD(GetMessagePos()); hti.pt.y=(short)HIWORD(GetMessagePos()); ScreenToClient(((LPNMHDR)lParam)->hwndFrom,&hti.pt); if(TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom,&hti)) if (hti.flags&TVHT_ONITEM) if(hti.flags&TVHT_ONITEMSTATEICON) if (TreeView_GetParent(hwndTree, hti.hItem)!=NULL) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } } } } switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { int reconnectRequired=0; int ccc; hwndTree = GetDlgItem(hwndDlg, IDC_TREE); //optionen speichern for(int i=0;i> 12 == 2 )) db_set_b(NULL,protocolname,mytree[i].dbentry,1); else db_set_b(NULL,protocolname,mytree[i].dbentry,0); } } db_set_b(NULL,protocolname,"nomsgbox",(BYTE)nomsgboxsel[SendDlgItemMessage(hwndDlg, IDC_NOMSG, CB_GETCURSEL, 0, 0)]); ccc=SendDlgItemMessage(hwndDlg, IDC_CLANGROUP, CB_GETCURSEL, 0, 0); db_set_b(NULL,protocolname,"mainclangroup",(BYTE)ccc); ccc=SendDlgItemMessage(hwndDlg, IDC_FOFGROUP, CB_GETCURSEL, 0, 0); db_set_b(NULL,protocolname,"fofgroup",(BYTE)ccc); ccc=SendDlgItemMessage(hwndDlg, IDC_SCANUPDATECB, CB_GETCURSEL, 0, 0); db_set_b(NULL,protocolname,"scanalways",(BYTE)ccc); //protocolversion wird autoamtisch vergeben //GetDlgItemTextA(hwndDlg,IDC_PVER,str,sizeof(str)); //db_set_b(NULL,protocolname,"protover",(char)atoi(str)); if(reconnectRequired) MessageBoxA(hwndDlg,Translate("The changes you have made require you to reconnect to the XFire network before they take effect"),Translate("XFire Options"),MB_OK|MB_ICONINFORMATION); return TRUE; } } break; } } return FALSE; } static INT_PTR CALLBACK DlgProcOpts4(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { char inipath[XFIRE_MAX_STATIC_STRING_LEN]=""; static BOOL inifound = FALSE; static BOOL dllfound = FALSE; static int nomsgboxsel[] = {1,0,2}; static HWND hwndTree = NULL; switch (msg) { case WM_INITDIALOG: { //addgamedia auf 0 setzen TranslateDialogDefault(hwndDlg); strcpy(inipath, XFireGetFoldersPath ("IniFile")); strcat(inipath, "xfire_games.ini"); FILE * f = fopen(inipath,"r"); if(f!=NULL) { fclose(f); CheckDlgButton(hwndDlg,IDC_CHKG,1); inifound = TRUE; } else { EnableDlgItem(hwndDlg, IDC_SETUPGAMES, FALSE); inifound = FALSE; } strcpy(inipath, XFireGetFoldersPath ("IconsFile")); strcat(inipath, "icons.dll"); f = fopen(inipath,"r"); if(f!=NULL) { fclose(f); CheckDlgButton(hwndDlg,IDC_CHKI,1); dllfound = TRUE; } else dllfound = FALSE; //alle blockierten nutzer in die liste einfügen DBCONTACTENUMSETTINGS dbces; // enum all setting the contact has for the module dbces.pfnEnumProc = enumSettingsProc; dbces.szModule = "XFireBlock"; dbces.lParam = (LPARAM)hwndDlg; CallService(MS_DB_CONTACT_ENUMSETTINGS, 0,(LPARAM)&dbces); SendMessage(GetDlgItem(hwndDlg,IDC_REMUSER),BM_SETIMAGE,IMAGE_ICON,(WPARAM)LoadSkinnedIcon(SKINICON_OTHER_DELETE)); strcpy(inipath, XFireGetFoldersPath ("IniFile")); SetDlgItemTextA(hwndDlg,IDC_FILESSHOULDBE,inipath); EnableDlgItem(hwndDlg, IDC_REMUSER, FALSE); return TRUE; } case PSM_CHANGED: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_COMMAND: CheckDlgButton(hwndDlg,IDC_CHKI,dllfound); CheckDlgButton(hwndDlg,IDC_CHKG,inifound); if(LOWORD(wParam) == IDC_REMUSER) //nutzer soll aus der blockierliste raus { char temp[255]; int sel=SendDlgItemMessage(hwndDlg, IDC_BLOCKUSER, LB_GETCURSEL, 0, 0); if(sel!=LB_ERR) //nur wenn was ausgewählt wurde { SendDlgItemMessageA(hwndDlg, IDC_BLOCKUSER, LB_GETTEXT, sel, (LPARAM)temp); SendDlgItemMessage(hwndDlg, IDC_BLOCKUSER, LB_DELETESTRING, sel, 0); db_unset(NULL,"XFireBlock",temp); if(SendDlgItemMessage(hwndDlg, IDC_BLOCKUSER, LB_GETCOUNT, 0, 0)==0) EnableDlgItem(hwndDlg, IDC_REMUSER, FALSE); } } if ((LOWORD(wParam) == 9508 || LOWORD(wParam) == IDC_LOGIN || LOWORD(wParam) == IDC_SETUPGAMES || LOWORD(wParam) == IDC_PASSWORD) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) ) return 0; break; case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { return TRUE; } } break; } } return FALSE; } static INT_PTR CALLBACK DlgProcOpts5(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DBVARIANT dbv; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); CheckDlgButton(hwndDlg,IDC_ENABLESTSMSG,db_get_b(NULL,protocolname,"autosetstatusmsg",0)); CheckDlgButton(hwndDlg,IDC_CHGSTATUS,db_get_b(NULL,protocolname,"statuschgtype",0)); CheckDlgButton(hwndDlg,IDC_DNDFIRST,db_get_b(NULL,protocolname,"dndfirst",0)); if(!db_get(NULL,protocolname,"setstatusmsg",&dbv)) { SetDlgItemTextA(hwndDlg,IDC_STATUSMSG,dbv.pszVal); db_free(&dbv); } if(!IsDlgButtonChecked(hwndDlg, IDC_ENABLESTSMSG)) { EnableDlgItem(hwndDlg, IDC_STATUSMSG, FALSE); } /* if(!ServiceExists(MS_VARS_FORMATSTRING)) { EnableDlgItem(hwndDlg, IDC_STATUSMSG, FALSE); EnableDlgItem(hwndDlg, IDC_ENABLESTSMSG, FALSE); EnableDlgItem(hwndDlg, IDC_CHGSTATUS, FALSE); EnableDlgItem(hwndDlg, IDC_DNDFIRST, FALSE); }*/ return TRUE; } case PSM_CHANGED: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_COMMAND: if ( IsDlgButtonChecked(hwndDlg, IDC_ENABLESTSMSG) ) { EnableDlgItem(hwndDlg, IDC_STATUSMSG, TRUE); } else { EnableDlgItem(hwndDlg, IDC_STATUSMSG, FALSE); } if ((LOWORD(wParam) == IDC_LOGIN || LOWORD(wParam) == IDC_STATUSMSG || LOWORD(wParam) == IDC_PASSWORD) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) ) return 0; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { int reconnectRequired=0; char str[512]; GetDlgItemTextA(hwndDlg,IDC_STATUSMSG,str,sizeof(str)); db_set_s(NULL,protocolname, "setstatusmsg", str); db_set_b(NULL,protocolname, "autosetstatusmsg", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ENABLESTSMSG)); db_set_b(NULL,protocolname, "statuschgtype", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CHGSTATUS)); db_set_b(NULL,protocolname, "dndfirst", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_DNDFIRST)); return TRUE; } } break; } } return FALSE; } static INT_PTR CALLBACK DlgProcOpts6(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { addgameDialog=NULL; TranslateDialogDefault(hwndDlg); //elemente erstmal abstellen EnableDlgItem(hwndDlg, IDC_DONTDETECT, FALSE); EnableDlgItem(hwndDlg, IDC_NOSTATUSMSG, FALSE); EnableDlgItem(hwndDlg, IDC_NOTINSTARTMENU, FALSE); EnableDlgItem(hwndDlg, IDC_APPLY, FALSE); EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, FALSE); ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_HIDE); //gamelist füllen SendMessage(hwndDlg,WM_FILLGAMELIST,0,0); //SendMessage(GetDlgItem(hwndDlg,IDC_CREATETXTLIST),BM_SETIMAGE,IMAGE_ICON,(WPARAM)LoadSkinnedIcon(SKINICON_OTHER_USERDETAILS)); return TRUE; } case WM_FILLGAMELIST: { //spielliste leeren SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_RESETCONTENT, 0, 0); //spiele auslesen und in die liste einfügen int found=db_get_w(NULL,protocolname,"foundgames",0); char temp[XFIRE_MAXSIZEOFGAMENAME]; for(int i=0;iname) { xgamelist.appendString("\r\nName: ",&out); xgamelist.appendString(nextgame->name,&out); } if(nextgame->path) { xgamelist.appendString("\r\nPath: ",&out); xgamelist.appendString(nextgame->path,&out); } if(nextgame->launchparams) { xgamelist.appendString("\r\nLaunch: ",&out); xgamelist.appendString(nextgame->launchparams,&out); } char temp[10]; _itoa(nextgame->id,temp,10); xgamelist.appendString("\r\nId: ",&out); xgamelist.appendString(temp,&out); _itoa(nextgame->send_gameid,temp,10); xgamelist.appendString("\r\nSend-Id: ",&out); xgamelist.appendString(temp,&out); if(nextgame->skip) { xgamelist.appendString("\r\nThis game will be skipped in game detection!",&out); } xgamelist.appendString("\r\n",&out); } if(OpenClipboard(NULL)) { HGLOBAL clipbuffer; char* buffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(out)+1); buffer = (char*)GlobalLock(clipbuffer); strcpy(buffer, LPCSTR(out)); GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT, clipbuffer); CloseClipboard(); } if(out!=NULL) delete[] out; //gameliste unblocken xgamelist.Block(FALSE); }*/ else if(LOWORD(wParam)==IDC_EDITGAME) { int idx=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETCURSEL, 0, 0); //was ausgewählt in der liste? if(idx!=LB_ERR) { //gameliste blocken xgamelist.Block(TRUE); //gameid der aktuellen auswahl auslesen int gameid=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_GETITEMDATA, idx, 0); //spielobject holen Xfire_game* tempgame=xgamelist.getGamebyGameid(gameid); //gültiger verweis? if(tempgame) { //editmodus des addgamedialog AddGameDialog(hwndDlg,tempgame); //elemente wieder unsichtbar machen EnableDlgItem(hwndDlg, IDC_DONTDETECT, FALSE); EnableDlgItem(hwndDlg, IDC_NOSTATUSMSG, FALSE); EnableDlgItem(hwndDlg, IDC_NOTINSTARTMENU, FALSE); EnableDlgItem(hwndDlg, IDC_APPLY, FALSE); EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, FALSE); ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_HIDE); } else MessageBoxA(hwndDlg,Translate("Error unknown game id."),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION); //gameliste unblocken xgamelist.Block(FALSE); //gamelist neu füllen SendMessage(hwndDlg,WM_FILLGAMELIST,0,0); } else MessageBoxA(hwndDlg,Translate("Please select a game."),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION); }else //wurde ein spiel aus der liste gewählt? if(HIWORD(wParam)==LBN_SELCHANGE && LOWORD(wParam)==IDC_LGAMELIST) { int idx=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETCURSEL, 0, 0); //es wurde was ausgewählt? if(idx!=LB_ERR) { //textlänge auslesen int size=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETTEXTLEN, idx, 0); //textbuffer anlegen char* text=new char[size+1]; SendDlgItemMessageA(hwndDlg, IDC_LGAMELIST, LB_GETTEXT, idx, (LPARAM)text); SetDlgItemTextA(hwndDlg,IDC_GAMENAME,text); //textbuffer löschen if(text!=NULL) { delete text; text=NULL; } //id des spielsbekommen int gameid=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_GETITEMDATA, idx, 0); HICON hicon=xgamelist.iconmngr.getGameIcon(gameid); //iconhandle holen und setzen if(hicon) SendMessage(GetDlgItem(hwndDlg,IDC_GAMEICO),STM_SETICON,(WPARAM)hicon,0); else SendMessage(GetDlgItem(hwndDlg,IDC_GAMEICO),STM_SETICON,0,0); //elemente aktivieren EnableDlgItem(hwndDlg, IDC_DONTDETECT, TRUE); EnableDlgItem(hwndDlg, IDC_NOSTATUSMSG, TRUE); EnableDlgItem(hwndDlg, IDC_APPLY, TRUE); EnableDlgItem(hwndDlg, IDC_NOTINSTARTMENU, TRUE); EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, TRUE); Xfire_game* xgtemp = xgamelist.getGamebyGameid(gameid); if(xgtemp && xgtemp->custom) { ShowWindow(GetDlgItem(hwndDlg,IDC_MANADDED),SW_SHOW); ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_SHOW); } else { ShowWindow(GetDlgItem(hwndDlg,IDC_MANADDED),SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_HIDE); } //gameskip wert setzen char temp[64]=""; mir_snprintf(temp, SIZEOF(temp), "gameskip_%d", gameid); CheckDlgButton(hwndDlg,IDC_DONTDETECT,db_get_b(NULL,protocolname,temp,0)); mir_snprintf(temp, SIZEOF(temp), "gamenostatus_%d", gameid); CheckDlgButton(hwndDlg,IDC_NOSTATUSMSG,db_get_b(NULL,protocolname,temp,0)); mir_snprintf(temp, SIZEOF(temp), "notinstartmenu_%d", gameid); CheckDlgButton(hwndDlg,IDC_NOTINSTARTMENU,db_get_b(NULL,protocolname,temp,0)); //extra parameter auslesen, aber nur, wenn das spiel auch sowas unterstützt if(xgtemp && xgtemp->haveExtraGameArgs()) { EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, TRUE); mir_snprintf(temp, SIZEOF(temp), "gameextraparams_%d", gameid); DBVARIANT dbv; if(!db_get(NULL,protocolname,temp,&dbv)) { SetDlgItemTextA(hwndDlg,IDC_EXTRAPARAMS,dbv.pszVal); db_free(&dbv); } else SetDlgItemTextA(hwndDlg,IDC_EXTRAPARAMS,""); } else { EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, FALSE); SetDlgItemTextA(hwndDlg,IDC_EXTRAPARAMS,Translate("Not supported")); } } } else if(LOWORD(wParam)==IDC_APPLY) { //auswahl speichern int idx=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETCURSEL, 0, 0); //es wurde was ausgewählt? if(idx!=LB_ERR) { int gameid=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_GETITEMDATA, idx, 0); int dbid; //gamelist blocken xgamelist.Block(TRUE); if(xgamelist.Gameinlist(gameid,&dbid)) { Xfire_game* game=xgamelist.getGame(dbid); if(game) { game->skip=(BYTE)IsDlgButtonChecked(hwndDlg, IDC_DONTDETECT); game->noicqstatus=(BYTE)IsDlgButtonChecked(hwndDlg, IDC_NOSTATUSMSG); game->notinstartmenu=(BYTE)IsDlgButtonChecked(hwndDlg, IDC_NOTINSTARTMENU); //extra parameter auslesen und das gameobj schreiben char str[128]=""; GetDlgItemTextA(hwndDlg,IDC_EXTRAPARAMS,str,sizeof(str)); if(str[0]!=0) { //extra parameter sind gesetzt, zuweisen game->setString(str,&game->extraparams); } else { //extra parameter leer, wenn gesetzt entfernen/freigeben if(game->extraparams) { delete[] game->extraparams; game->extraparams=NULL; } } game->refreshMenuitem(); game->writeToDB(dbid); SetDlgItemTextA(hwndDlg,IDC_TEXTSTATUS,Translate("Configuration saved!")); } else { SetDlgItemTextA(hwndDlg,IDC_TEXTSTATUS,Translate("Game not found?!")); } } else { SetDlgItemTextA(hwndDlg,IDC_TEXTSTATUS,Translate("Game not found?!")); } //gamelist unblocken xgamelist.Block(FALSE); } } break; } case WM_NOTIFY: { break; } } return FALSE; } int OptInit(WPARAM wParam,LPARAM) { ghwndDlg2 = NULL; OPTIONSDIALOGPAGE odp = { sizeof(odp) }; odp.hInstance = hinstance; odp.ptszTitle = LPGENT("XFire"); odp.ptszGroup = LPGENT("Network"); odp.flags = ODPF_BOLDGROUPS| ODPF_TCHAR; odp.pfnDlgProc = DlgProcOpts2; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTLOGIN); odp.ptszTab = LPGENT("Account"); Options_AddPage(wParam, &odp); odp.pfnDlgProc = DlgProcOpts3; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTFEAT); odp.ptszTab = LPGENT("Features"); Options_AddPage(wParam, &odp); odp.pfnDlgProc = DlgProcOpts4; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTFEAT2); odp.ptszTab = LPGENT("Blocklist / Games"); Options_AddPage(wParam, &odp); odp.pfnDlgProc = DlgProcOpts5; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTFEAT3); odp.ptszTab = LPGENT("StatusMsg"); Options_AddPage(wParam, &odp); odp.pfnDlgProc = DlgProcOpts6; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTFEAT4); odp.ptszTab = LPGENT("Games"); Options_AddPage(wParam, &odp); return 0; }