From 08d82c6a8b0e597430aae75033fac58388139535 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 7 Oct 2012 11:47:00 +0000 Subject: new event filters, beginning git-svn-id: http://svn.miranda-ng.org/main/trunk@1797 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/modules/ignore/ignore.cpp | 452 +++++++++++++++++----------------- src/modules/protocols/protochains.cpp | 259 +++++++++---------- src/modules/protocols/protocols.cpp | 60 ++--- 3 files changed, 350 insertions(+), 421 deletions(-) (limited to 'src/modules') diff --git a/src/modules/ignore/ignore.cpp b/src/modules/ignore/ignore.cpp index 5cb9f64651..2b5176394d 100644 --- a/src/modules/ignore/ignore.cpp +++ b/src/modules/ignore/ignore.cpp @@ -29,14 +29,14 @@ static const DWORD ignoreIdToPf4[IGNOREEVENT_MAX] = {0xFFFFFFFF, 0xFFFFFFFF, 0xF static DWORD GetMask(HANDLE hContact) { - DWORD mask = DBGetContactSettingDword(hContact, "Ignore", "Mask1", (DWORD)(-1)); + DWORD mask = db_get_dw(hContact, "Ignore", "Mask1", (DWORD)(-1)); if (mask == (DWORD)(-1)) { if (hContact == NULL) mask = 0; else { - if (DBGetContactSettingByte(hContact, "CList", "Hidden", 0) || DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) - mask = DBGetContactSettingDword(NULL, "Ignore", "Mask1", 0); + if (db_get_b(hContact, "CList", "Hidden", 0) || db_get_b(hContact, "CList", "NotOnList", 0)) + mask = db_get_dw(NULL, "Ignore", "Mask1", 0); else - mask = DBGetContactSettingDword(NULL, "Ignore", "Default1", 0); + mask = db_get_dw(NULL, "Ignore", "Default1", 0); } } return mask; @@ -44,13 +44,12 @@ static DWORD GetMask(HANDLE hContact) static void SetListGroupIcons(HWND hwndList, HANDLE hFirstItem, HANDLE hParentItem, int *groupChildCount) { - int typeOfFirst; int iconOn[IGNOREEVENT_MAX] = {1, 1, 1, 1, 1, 1, 1}; int childCount[IGNOREEVENT_MAX] = {0, 0, 0, 0, 0, 0, 0}, i; int iImage; HANDLE hItem, hChildItem; - typeOfFirst = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hFirstItem, 0); + int typeOfFirst = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hFirstItem, 0); //check groups if (typeOfFirst == CLCIT_GROUP) hItem = hFirstItem; else hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hFirstItem); @@ -83,109 +82,107 @@ static void SetListGroupIcons(HWND hwndList, HANDLE hFirstItem, HANDLE hParentIt static void SetAllChildIcons(HWND hwndList, HANDLE hFirstItem, int iColumn, int iImage) { - int typeOfFirst, iOldIcon; - HANDLE hItem, hChildItem; + HANDLE hItem; - typeOfFirst = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hFirstItem, 0); + int typeOfFirst = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hFirstItem, 0); //check groups if (typeOfFirst == CLCIT_GROUP) hItem = hFirstItem; else hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hFirstItem); while (hItem) { - hChildItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); - if (hChildItem) SetAllChildIcons(hwndList, hChildItem, iColumn, iImage); + HANDLE hChildItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); + if (hChildItem) + SetAllChildIcons(hwndList, hChildItem, iColumn, iImage); hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTGROUP, (LPARAM)hItem); } //check contacts if (typeOfFirst == CLCIT_CONTACT) hItem = hFirstItem; else hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hFirstItem); while (hItem) { - iOldIcon = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, iColumn); - if (iOldIcon != 0xFF && iOldIcon != iImage) SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); + int iOldIcon = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, iColumn); + if (iOldIcon != 0xFF && iOldIcon != iImage) + SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_NEXTCONTACT, (LPARAM)hItem); } } static void ResetListOptions(HWND hwndList) { - int i; - SendMessage(hwndList, CLM_SETBKBITMAP, 0, (LPARAM)(HBITMAP)NULL); SendMessage(hwndList, CLM_SETBKCOLOR, GetSysColor(COLOR_WINDOW), 0); SendMessage(hwndList, CLM_SETGREYOUTFLAGS, 0, 0); SendMessage(hwndList, CLM_SETLEFTMARGIN, 4, 0); SendMessage(hwndList, CLM_SETINDENT, 10, 0); SendMessage(hwndList, CLM_SETHIDEEMPTYGROUPS, 1, 0); - for (i=0;i <= FONTID_MAX;i++) + + for (int i=0; i <= FONTID_MAX; i++) SendMessage(hwndList, CLM_SETTEXTCOLOR, i, GetSysColor(COLOR_WINDOWTEXT)); } static void SetIconsForColumn(HWND hwndList, HANDLE hItem, HANDLE hItemAll, int iColumn, int iImage) { - int itemType; - - itemType = SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hItem, 0); - if (itemType == CLCIT_CONTACT) { - int oldiImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, iColumn); - if (oldiImage != 0xFF && oldiImage != iImage) - SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); - } - else if (itemType == CLCIT_INFO) { - if (hItem == hItemAll) SetAllChildIcons(hwndList, hItem, iColumn, iImage); - else SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); //hItemUnknown - } - else if (itemType == CLCIT_GROUP) { + switch ( SendMessage(hwndList, CLM_GETITEMTYPE, (WPARAM)hItem, 0)) { + case CLCIT_CONTACT: + { + int oldiImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, iColumn); + if (oldiImage != 0xFF && oldiImage != iImage) + SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); + } + break; + case CLCIT_INFO: + if (hItem == hItemAll) + SetAllChildIcons(hwndList, hItem, iColumn, iImage); + else + SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(iColumn, iImage)); //hItemUnknown + break; + + case CLCIT_GROUP: hItem = (HANDLE)SendMessage(hwndList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); - if (hItem) SetAllChildIcons(hwndList, hItem, iColumn, iImage); + if (hItem) + SetAllChildIcons(hwndList, hItem, iColumn, iImage); } } static void InitialiseItem(HWND hwndList, HANDLE hContact, HANDLE hItem, DWORD proto1Caps, DWORD proto4Caps) { - DWORD mask; - int i; - - mask = GetMask(hContact); - for (i=0;iidFrom) { + case IDC_LIST: + switch (((LPNMHDR)lParam)->code) { + case CLN_NEWCONTACT: + case CLN_LISTREBUILT: + SetAllContactIcons( GetDlgItem(hwndDlg, IDC_LIST)); + //fall through + case CLN_CONTACTMOVED: + SetListGroupIcons( GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); + break; + case CLN_OPTIONSCHANGED: + ResetListOptions( GetDlgItem(hwndDlg, IDC_LIST)); + break; + case CLN_CHECKCHANGED: + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case NM_CLICK: + { + NMCLISTCONTROL *nm = (NMCLISTCONTROL*)lParam; + if (nm->iColumn == -1) + break; + + DWORD hitFlags; + HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x, nm->pt.y)); + if (hItem == NULL || !(hitFlags & CLCHT_ONITEMEXTRA)) + break; + + if (nm->iColumn == IGNOREEVENT_MAX) { // ignore all + for (int iImage = 0;iImageiColumn == IGNOREEVENT_MAX+1) { // ignore none + for (int iImage = 0;iImageiColumn, 0)); + if (iImage == 0) + iImage = nm->iColumn+3; + else if (iImage != 0xFF) + iImage = 0; + SetIconsForColumn( GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, nm->iColumn, iImage); + } + SetListGroupIcons( GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; } - - SetAllContactIcons( GetDlgItem(hwndDlg, IDC_LIST)); - SetListGroupIcons( GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); - return TRUE; - case WM_SETFOCUS: - SetFocus( GetDlgItem(hwndDlg, IDC_LIST)); break; - case WM_NOTIFY: - switch(((LPNMHDR)lParam)->idFrom) { - case IDC_LIST: - switch (((LPNMHDR)lParam)->code) - { - case CLN_NEWCONTACT: - case CLN_LISTREBUILT: - SetAllContactIcons( GetDlgItem(hwndDlg, IDC_LIST)); - //fall through - case CLN_CONTACTMOVED: - SetListGroupIcons( GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); - break; - case CLN_OPTIONSCHANGED: - ResetListOptions( GetDlgItem(hwndDlg, IDC_LIST)); - break; - case CLN_CHECKCHANGED: - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - case NM_CLICK: - { HANDLE hItem; - NMCLISTCONTROL *nm = (NMCLISTCONTROL*)lParam; - DWORD hitFlags; - int iImage; - - if (nm->iColumn == -1) break; - hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x, nm->pt.y)); - if (hItem == NULL) break; - if ( !(hitFlags&CLCHT_ONITEMEXTRA)) break; - if (nm->iColumn == IGNOREEVENT_MAX) { //ignore all - for (iImage = 0;iImageiColumn == IGNOREEVENT_MAX+1) { //ignore none - for (iImage = 0;iImageiColumn, 0)); - if (iImage == 0) iImage = nm->iColumn+3; - else if (iImage != 0xFF) iImage = 0; - SetIconsForColumn( GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, nm->iColumn, iImage); - } - SetListGroupIcons( GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); - SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); - break; - } - } - break; - case 0: - switch (((LPNMHDR)lParam)->code) - { - case PSN_APPLY: - { HANDLE hContact, hItem; - - hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); - do { - hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_FINDCONTACT, (WPARAM)hContact, 0); - if (hItem) SaveItemMask( GetDlgItem(hwndDlg, IDC_LIST), hContact, hItem, "Mask1"); - if (SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETCHECKMARK, (WPARAM)hItem, 0)) - DBDeleteContactSetting(hContact, "CList", "Hidden"); - else - DBWriteContactSettingByte(hContact, "CList", "Hidden", 1); - } while (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0)); - SaveItemMask( GetDlgItem(hwndDlg, IDC_LIST), NULL, hItemAll, "Default1"); - SaveItemMask( GetDlgItem(hwndDlg, IDC_LIST), NULL, hItemUnknown, "Mask1"); - return TRUE; - } - case PSN_EXPERTCHANGED: - SetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE, ((PSHNOTIFY*)lParam)->lParam?GetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE)|CLS_CHECKBOXES|CLS_GROUPCHECKBOXES|CLS_SHOWHIDDEN:GetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE)&~(CLS_CHECKBOXES|CLS_GROUPCHECKBOXES|CLS_SHOWHIDDEN)); - SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_AUTOREBUILD, 0, 0); - break; + + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + { + HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); + do { + HANDLE hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_FINDCONTACT, (WPARAM)hContact, 0); + if (hItem) SaveItemMask( GetDlgItem(hwndDlg, IDC_LIST), hContact, hItem, "Mask1"); + if (SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETCHECKMARK, (WPARAM)hItem, 0)) + DBDeleteContactSetting(hContact, "CList", "Hidden"); + else + DBWriteContactSettingByte(hContact, "CList", "Hidden", 1); } - break; + while (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0)); + SaveItemMask( GetDlgItem(hwndDlg, IDC_LIST), NULL, hItemAll, "Default1"); + SaveItemMask( GetDlgItem(hwndDlg, IDC_LIST), NULL, hItemUnknown, "Mask1"); + } + return TRUE; + + case PSN_EXPERTCHANGED: + { + INT_PTR dwStyle = GetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE); + if (((PSHNOTIFY*)lParam)->lParam) + dwStyle |= CLS_CHECKBOXES | CLS_GROUPCHECKBOXES | CLS_SHOWHIDDEN; + else + dwStyle &= ~(CLS_CHECKBOXES|CLS_GROUPCHECKBOXES|CLS_SHOWHIDDEN); + SetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE, dwStyle); + SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_AUTOREBUILD, 0, 0); + } + break; } break; - case WM_DESTROY: - { int i; - HIMAGELIST hIml; - for (i=0; i < SIZEOF(hIcons); i++) + } + break; + + case WM_DESTROY: + { + for (int i=0; i < SIZEOF(hIcons); i++) DestroyIcon(hIcons[i]); - hIml = (HIMAGELIST)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGELIST, 0, 0); + HIMAGELIST hIml = (HIMAGELIST)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGELIST, 0, 0); ImageList_Destroy(hIml); - break; } + break; } return FALSE; } @@ -360,57 +366,63 @@ static int IgnoreOptInitialise(WPARAM wParam, LPARAM) static INT_PTR IsIgnored(WPARAM wParam, LPARAM lParam) { DWORD mask = GetMask((HANDLE)wParam); - if (lParam<1 || lParam>IGNOREEVENT_MAX) return 1; - return (mask>>(lParam-1))&1; + if (lParam < 1 || lParam > IGNOREEVENT_MAX) + return 1; + return (mask >> (lParam-1))&1; } static INT_PTR Ignore(WPARAM wParam, LPARAM lParam) { DWORD mask = GetMask((HANDLE)wParam); - if ((lParam<1 || lParam>IGNOREEVENT_MAX) && lParam != IGNOREEVENT_ALL) return 1; - if (lParam == IGNOREEVENT_ALL) mask = (1< IGNOREEVENT_MAX) && lParam != IGNOREEVENT_ALL) + return 1; + if (lParam == IGNOREEVENT_ALL) + mask = (1 << IGNOREEVENT_MAX)-1; + else + mask |= 1 << (lParam-1); + db_set_dw((HANDLE)wParam, "Ignore", "Mask1", mask); return 0; } static INT_PTR Unignore(WPARAM wParam, LPARAM lParam) { DWORD mask = GetMask((HANDLE)wParam); - if ((lParam<1 || lParam>IGNOREEVENT_MAX) && lParam != IGNOREEVENT_ALL) return 1; - if (lParam == IGNOREEVENT_ALL) mask = 0; - else mask&=~(1<<(lParam-1)); - DBWriteContactSettingDword((HANDLE)wParam, "Ignore", "Mask1", mask); - return 0; -} - -static int IgnoreContactAdded(WPARAM wParam, LPARAM) -{ - CallService(MS_PROTO_ADDTOCONTACT, wParam, (LPARAM)"Ignore"); + if ((lParam < 1 || lParam > IGNOREEVENT_MAX) && lParam != IGNOREEVENT_ALL) + return 1; + + if (lParam == IGNOREEVENT_ALL) + mask = 0; + else + mask &= ~(1 << (lParam-1)); + db_set_dw((HANDLE)wParam, "Ignore", "Mask1", mask); return 0; } static INT_PTR IgnoreRecvMessage(WPARAM wParam, LPARAM lParam) { - if (IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_MESSAGE)) return 1; + if (IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_MESSAGE)) + return 1; return CallService(MS_PROTO_CHAINRECV, wParam, lParam); } static INT_PTR IgnoreRecvUrl(WPARAM wParam, LPARAM lParam) { - if (IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_URL)) return 1; + if ( IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_URL)) + return 1; return CallService(MS_PROTO_CHAINRECV, wParam, lParam); } static INT_PTR IgnoreRecvFile(WPARAM wParam, LPARAM lParam) { - if (IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_FILE)) return 1; + if ( IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_FILE)) + return 1; return CallService(MS_PROTO_CHAINRECV, wParam, lParam); } static INT_PTR IgnoreRecvAuth(WPARAM wParam, LPARAM lParam) { - if (IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_AUTHORIZATION)) return 1; + if ( IsIgnored((WPARAM)((CCSDATA*)lParam)->hContact, IGNOREEVENT_AUTHORIZATION)) + return 1; return CallService(MS_PROTO_CHAINRECV, wParam, lParam); } @@ -425,16 +437,11 @@ static int IgnoreAddedNotify(WPARAM, LPARAM lParam) return 0; } +static int iBoldControls[] = { IDC_TXT_TITLE1, IDC_TXT_TITLE2, IDC_TXT_TITLE3, MODERNOPT_CTRL_LAST }; + static int IgnoreModernOptInit(WPARAM wParam, LPARAM) { - static int iBoldControls[] = - { - IDC_TXT_TITLE1, IDC_TXT_TITLE2, IDC_TXT_TITLE3, - MODERNOPT_CTRL_LAST - }; - - MODERNOPTOBJECT obj = {0}; - obj.cbSize = sizeof(obj); + MODERNOPTOBJECT obj = { sizeof(obj) }; obj.hInstance = hInst; obj.dwFlags = MODEROPT_FLG_TCHAR; obj.iSection = MODERNOPT_PAGE_IGNORE; @@ -442,27 +449,17 @@ static int IgnoreModernOptInit(WPARAM wParam, LPARAM) obj.iBoldControls = iBoldControls; obj.lpzTemplate = MAKEINTRESOURCEA(IDD_MODERNOPT_IGNORE); obj.pfnDlgProc = DlgProcIgnoreOpts; -// obj.lpzClassicGroup = "Events"; -// obj.lpzClassicPage = "Ignore"; CallService(MS_MODERNOPT_ADDOBJECT, wParam, (LPARAM)&obj); return 0; } int LoadIgnoreModule(void) { - PROTOCOLDESCRIPTOR pd = { 0 }; - pd.cbSize = sizeof(pd); + PROTOCOLDESCRIPTOR pd = { sizeof(pd) }; pd.szName = "Ignore"; pd.type = PROTOTYPE_IGNORE; CallService(MS_PROTO_REGISTERMODULE, 0, (LPARAM)&pd); - HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); - while (hContact != NULL) { - if ( !CallService(MS_PROTO_ISPROTOONCONTACT, (WPARAM)hContact, (LPARAM)"Ignore")) - CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContact, (LPARAM)"Ignore"); - hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0); - } - CreateServiceFunction("Ignore"PSR_MESSAGE, IgnoreRecvMessage); CreateServiceFunction("Ignore"PSR_URL, IgnoreRecvUrl); CreateServiceFunction("Ignore"PSR_FILE, IgnoreRecvFile); @@ -471,7 +468,6 @@ int LoadIgnoreModule(void) CreateServiceFunction(MS_IGNORE_IGNORE, Ignore); CreateServiceFunction(MS_IGNORE_UNIGNORE, Unignore); - HookEvent(ME_DB_CONTACT_ADDED, IgnoreContactAdded); HookEvent(ME_DB_EVENT_FILTER_ADD, IgnoreAddedNotify); HookEvent(ME_MODERNOPT_INITIALIZE, IgnoreModernOptInit); HookEvent(ME_OPT_INITIALISE, IgnoreOptInitialise); diff --git a/src/modules/protocols/protochains.cpp b/src/modules/protocols/protochains.cpp index 74145d3970..0314282e08 100644 --- a/src/modules/protocols/protochains.cpp +++ b/src/modules/protocols/protochains.cpp @@ -20,104 +20,129 @@ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #include "..\..\core\commonheaders.h" #include -//Protocol chain is list of integers "0".."n", with network protocol named "p" +extern LIST filters; + +static int GetProtocolP(HANDLE hContact, char *szBuf, int cbLen) +{ + DBVARIANT dbv; + dbv.type = DBVT_ASCIIZ; + dbv.pszVal = szBuf; + dbv.cchVal = cbLen; + + DBCONTACTGETSETTING dbcgs; + dbcgs.pValue = &dbv; + dbcgs.szModule = "Protocol"; + dbcgs.szSetting = "p"; + return (int)CallService(MS_DB_CONTACT_GETSETTINGSTATIC, (WPARAM)hContact, (LPARAM)&dbcgs); +} + +///////////////////////////////////////////////////////////////////////////////////////// + +INT_PTR CallContactService(HANDLE hContact, const char *szProtoService, WPARAM wParam, LPARAM lParam) +{ + INT_PTR ret; + CCSDATA ccs = { hContact, szProtoService, wParam, lParam }; + + for (int i=0; i < filters.getCount(); i++) { + if ((ret = CallProtoServiceInt(hContact, filters[i]->szName, szProtoService, i+1, (LPARAM)&ccs)) != CALLSERVICE_NOTFOUND) { + //chain was started, exit + return ret; + } + } + + char szProto[40]; + if ( GetProtocolP(hContact, szProto, sizeof(szProto))) + return 1; + + PROTOACCOUNT *pa = Proto_GetAccount(szProto); + if (pa == NULL || pa->ppro == NULL) + return 1; + + if (pa->bOldProto) + ret = CallProtoServiceInt(hContact, szProto, szProtoService, (WPARAM)(-1), (LPARAM)&ccs); + else + ret = CallProtoServiceInt(hContact, szProto, szProtoService, wParam, lParam); + if (ret == CALLSERVICE_NOTFOUND) + ret = 1; + + return ret; +} + +///////////////////////////////////////////////////////////////////////////////////////// + INT_PTR Proto_CallContactService(WPARAM wParam, LPARAM lParam) -//note that this is ChainSend() too, due to a quirk of function definitions { CCSDATA *ccs = (CCSDATA*)lParam; - int i; - char str[10]; - DBVARIANT dbv; INT_PTR ret; - PROTOACCOUNT* pa; if (wParam == (WPARAM)(-1)) return 1; - for (i = wParam;; i++) { - _itoa(i, str, 10); - if (DBGetContactSettingString(ccs->hContact, "_Filter", str, &dbv)) - break; - - if ((ret = CallProtoServiceInt(NULL,dbv.pszVal, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) { + for (int i = wParam; i < filters.getCount(); i++) { + if ((ret = CallProtoServiceInt(NULL, filters[i]->szName, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) { //chain was started, exit - mir_free(dbv.pszVal); return ret; } - mir_free(dbv.pszVal); } - if (DBGetContactSettingString(ccs->hContact, "Protocol", "p", &dbv)) + + char szProto[40]; + if ( GetProtocolP(ccs->hContact, szProto, sizeof(szProto))) return 1; - pa = Proto_GetAccount(dbv.pszVal); + PROTOACCOUNT *pa = Proto_GetAccount(szProto); if (pa == NULL || pa->ppro == NULL) + return 1; + + if (pa->bOldProto) + ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, (WPARAM)(-1), (LPARAM)ccs); + else + ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, ccs->wParam, ccs->lParam); + if (ret == CALLSERVICE_NOTFOUND) ret = 1; - else { - if (pa->bOldProto) - ret = CallProtoServiceInt(ccs->hContact, dbv.pszVal, ccs->szProtoService, (WPARAM)(-1), (LPARAM)ccs); - else - ret = CallProtoServiceInt(ccs->hContact, dbv.pszVal, ccs->szProtoService, ccs->wParam, ccs->lParam); - if (ret == CALLSERVICE_NOTFOUND) - ret = 1; - } - mir_free(dbv.pszVal); return ret; } +///////////////////////////////////////////////////////////////////////////////////////// + static INT_PTR CallRecvChain(WPARAM wParam, LPARAM lParam) { CCSDATA *ccs = (CCSDATA*)lParam; - int i; INT_PTR ret; - char str[10]; - DBVARIANT dbv; - PROTOACCOUNT* pa; if (wParam == (WPARAM)(-1)) return 1; //shouldn't happen - sanity check - if (wParam == 0) { //begin processing by finding end of chain - for (;;wParam++) { - _itoa(wParam, str, 10); - if (DBGetContactSettingString(ccs->hContact, "_Filter", str, &dbv)) - break; - mir_free(dbv.pszVal); - } - } - else wParam--; + if (wParam == 0) //begin processing by finding end of chain + wParam = filters.getCount(); + else + wParam--; - for (i = wParam-1; i >= 0; i--) { - _itoa(i, str, 10); - if (DBGetContactSettingString(ccs->hContact, "_Filter", str, &dbv)) //never happens - return 1; - - if ((ret = CallProtoServiceInt(NULL,dbv.pszVal, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) { + for (int i = wParam-1; i >= 0; i--) { + if ((ret = CallProtoServiceInt(NULL, filters[i]->szName, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) { //chain was started, exit - mir_free(dbv.pszVal); return ret; } - mir_free(dbv.pszVal); } //end of chain, call network protocol again - if (DBGetContactSettingString(ccs->hContact, "Protocol", "p", &dbv)) + char szProto[40]; + if ( GetProtocolP(ccs->hContact, szProto, sizeof(szProto))) return 1; - pa = Proto_GetAccount(dbv.pszVal); + PROTOACCOUNT *pa = Proto_GetAccount(szProto); if (pa == NULL || pa->ppro == NULL) + return 1; + + if (pa->bOldProto) + ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, (WPARAM)(-1), (LPARAM)ccs); + else + ret = CallProtoServiceInt(ccs->hContact, szProto, ccs->szProtoService, ccs->wParam, ccs->lParam); + if (ret == CALLSERVICE_NOTFOUND) ret = 1; - else { - if (pa->bOldProto) - ret = CallProtoServiceInt(ccs->hContact, dbv.pszVal, ccs->szProtoService, (WPARAM)(-1), (LPARAM)ccs); - else - ret = CallProtoServiceInt(ccs->hContact, dbv.pszVal, ccs->szProtoService, ccs->wParam, ccs->lParam); - if (ret == CALLSERVICE_NOTFOUND) - ret = 1; - } - mir_free(dbv.pszVal); return ret; } @@ -129,133 +154,71 @@ static INT_PTR Proto_ChainRecv(WPARAM wParam, LPARAM lParam) PROTOACCOUNT* __fastcall Proto_GetAccount(HANDLE hContact) { - DBVARIANT dbv; - DBCONTACTGETSETTING dbcgs; - char name[32]; - - dbv.type = DBVT_ASCIIZ; - dbv.pszVal = name; - dbv.cchVal = SIZEOF(name); - dbcgs.pValue = &dbv; - dbcgs.szModule = "Protocol"; - dbcgs.szSetting = "p"; - if (CallService(MS_DB_CONTACT_GETSETTINGSTATIC, (WPARAM)hContact, (LPARAM)&dbcgs)) + char szProto[40]; + if ( GetProtocolP(hContact, szProto, sizeof(szProto))) return 0; - return Proto_GetAccount((char*)dbv.pszVal); + return Proto_GetAccount(szProto); } static INT_PTR Proto_GetContactBaseProto(WPARAM wParam, LPARAM) { - PROTOACCOUNT* pa = Proto_GetAccount((HANDLE)wParam); + PROTOACCOUNT *pa = Proto_GetAccount((HANDLE)wParam); return (INT_PTR)(Proto_IsAccountEnabled(pa) ? pa->szModuleName : NULL); } static INT_PTR Proto_GetContactBaseAccount(WPARAM wParam, LPARAM) { - PROTOACCOUNT* pa = Proto_GetAccount((HANDLE)wParam); - return (INT_PTR)(pa ? pa->szModuleName : NULL); + PROTOACCOUNT *pa = Proto_GetAccount((HANDLE)wParam); + return (INT_PTR)(pa ? pa->szModuleName : NULL); } static INT_PTR Proto_IsProtoOnContact(WPARAM wParam, LPARAM lParam) { - int i; - char str[10]; - DBVARIANT dbv; - - if ( !lParam) return 0; + char *szProto = (char*)lParam; + if (szProto == NULL) + return 0; - if ( !DBGetContactSettingString((HANDLE)wParam, "Protocol", "p", &dbv)) { - if ( !_stricmp((char*)lParam, dbv.pszVal)) { - mir_free(dbv.pszVal); + char szContactProto[40]; + if ( !GetProtocolP((HANDLE)wParam, szContactProto, sizeof(szContactProto))) + if ( !_stricmp(szProto, szContactProto)) return -1; - } - mir_free(dbv.pszVal); - } - for (i=0;;i++) { - _itoa(i, str, 10); - if (DBGetContactSettingString((HANDLE)wParam, "_Filter", str, &dbv)) break; - if ( !strcmp((char*)lParam, dbv.pszVal)) { - mir_free(dbv.pszVal); + + for (int i=0; i < filters.getCount(); i++) + if ( !strcmp(szProto, filters[i]->szName)) return i+1; - } - mir_free(dbv.pszVal); - } + return 0; } static INT_PTR Proto_AddToContact(WPARAM wParam, LPARAM lParam) { - PROTOCOLDESCRIPTOR *pd, *pdCompare; - - pd = Proto_IsProtocolLoaded((char*)lParam); + char *szProto = (char*)lParam; + PROTOCOLDESCRIPTOR *pd = Proto_IsProtocolLoaded(szProto); if (pd == NULL) { - PROTOACCOUNT* pa = Proto_GetAccount((char*)lParam); + PROTOACCOUNT *pa = Proto_GetAccount(szProto); if (pa) { - DBWriteContactSettingString((HANDLE)wParam, "Protocol", "p", (char*)lParam); + db_set_s((HANDLE)wParam, "Protocol", "p", szProto); return 0; } return 1; } - if (pd->type == PROTOTYPE_PROTOCOL) { - DBWriteContactSettingString((HANDLE)wParam, "Protocol", "p", (char*)lParam); - return 0; - } - if (Proto_IsProtoOnContact(wParam, lParam)) return 1; - { /* v:0.3.3 + PROTO FILTERS ARE NOW KEPT IN THEIR OWN DB MODULE! */ - int i; - char str[10], *lastProto; - DBVARIANT dbv; - - for (i=0;;i++) { - _itoa(i, str, 10); - if (DBGetContactSettingString((HANDLE)wParam, "_Filter", str, &dbv)) break; - pdCompare = Proto_IsProtocolLoaded((char*)dbv.pszVal); - mir_free(dbv.pszVal); - if (pdCompare == NULL) continue; - if (pd->type > pdCompare->type) break; - } - //put the new module at position i - lastProto = mir_strdup((char*)lParam); - for (;;i++) { - _itoa(i, str, 10); - if (DBGetContactSettingString((HANDLE)wParam, "_Filter", str, &dbv)) { - DBWriteContactSettingString((HANDLE)wParam, "_Filter", str, lastProto); - mir_free(lastProto); - break; - } - DBWriteContactSettingString((HANDLE)wParam, "_Filter", str, lastProto); - mir_free(lastProto); - lastProto = dbv.pszVal; - } - } + if (pd->type == PROTOTYPE_PROTOCOL) + db_set_s((HANDLE)wParam, "Protocol", "p", szProto); + return 0; } static INT_PTR Proto_RemoveFromContact(WPARAM wParam, LPARAM lParam) { - int i; - DBVARIANT dbv; - char str[10]; - - i = Proto_IsProtoOnContact(wParam, lParam); - if ( !i) return 1; - if (i == -1) - DBDeleteContactSetting((HANDLE)wParam, "Protocol", "p"); - else { - for (i--;;i++) { //we have to decrease i, as Proto_IsOnContact returns +1 more number than read from database - _itoa(i+1, str, 10); - if (0 != DBGetContactSettingString((HANDLE)wParam, "_Filter", str, &dbv)) { - _itoa(i, str, 10); - DBDeleteContactSetting((HANDLE)wParam, "_Filter", str); - break; - } - _itoa(i, str, 10); - DBWriteContactSettingString((HANDLE)wParam, "_Filter", str, dbv.pszVal); - mir_free(dbv.pszVal); - } + switch ( Proto_IsProtoOnContact(wParam, lParam)) { + case 0: + return 1; + case -1: + db_unset((HANDLE)wParam, "Protocol", "p"); } + return 0; } diff --git a/src/modules/protocols/protocols.cpp b/src/modules/protocols/protocols.cpp index 44b2f514bb..19a82b1add 100644 --- a/src/modules/protocols/protocols.cpp +++ b/src/modules/protocols/protocols.cpp @@ -50,9 +50,20 @@ static int CompareProtos(const PROTOCOLDESCRIPTOR* p1, const PROTOCOLDESCRIPTOR* static LIST protos(10, CompareProtos); -static INT_PTR Proto_BroadcastAck(WPARAM wParam, LPARAM lParam) +static int CompareProtos2(const PROTOCOLDESCRIPTOR* p1, const PROTOCOLDESCRIPTOR* p2) { + if (p1->type != p2->type) + return p1->type - p2->type; + + return strcmp(p1->szName, p2->szName); +} + +LIST filters(10, CompareProtos2); + +//------------------------------------------------------------------------------------ +static INT_PTR Proto_BroadcastAck(WPARAM wParam, LPARAM lParam) +{ ACKDATA *ack = (ACKDATA*)lParam; if (ack && ack->type == ACKTYPE_AVATAR && ack->hProcess) { PROTO_AVATAR_INFORMATION* ai = (PROTO_AVATAR_INFORMATION*)ack->hProcess; @@ -64,7 +75,6 @@ static INT_PTR Proto_BroadcastAck(WPARAM wParam, LPARAM lParam) } } - return NotifyEventHooks(hAckEvent, wParam, lParam); } @@ -138,6 +148,8 @@ static INT_PTR Proto_RegisterModule(WPARAM, LPARAM lParam) else *p = *pd; p->szName = mir_strdup(pd->szName); protos.insert(p); + if (p->type != PROTOTYPE_PROTOCOL) + filters.insert(p); return 0; } @@ -326,7 +338,7 @@ static INT_PTR srvProto_IsAccountEnabled(WPARAM, LPARAM lParam) bool __fastcall Proto_IsAccountLocked(PROTOACCOUNT* pa) { - return pa && DBGetContactSettingByte(NULL, pa->szModuleName, "LockMainStatus", 0) != 0; + return pa && db_get_b(NULL, pa->szModuleName, "LockMainStatus", 0) != 0; } static INT_PTR srvProto_IsAccountLocked(WPARAM, LPARAM lParam) @@ -598,48 +610,6 @@ INT_PTR CallProtoServiceInt(HANDLE hContact, const char *szModule, const char *s ///////////////////////////////////////////////////////////////////////////////////////// -INT_PTR CallContactService(HANDLE hContact, const char *szProtoService, WPARAM wParam, LPARAM lParam) -{ - int i; - DBVARIANT dbv; - INT_PTR ret; - PROTOACCOUNT* pa; - CCSDATA ccs = { hContact, szProtoService, wParam, lParam }; - - for (i=0;; i++) { - char str[10]; - _itoa(i, str, 10); - if (DBGetContactSettingString(hContact, "_Filter", str, &dbv)) - break; - - if ((ret = CallProtoServiceInt(hContact, dbv.pszVal, szProtoService, i+1, (LPARAM)&ccs)) != CALLSERVICE_NOTFOUND) { - //chain was started, exit - mir_free(dbv.pszVal); - return ret; - } - mir_free(dbv.pszVal); - } - if (DBGetContactSettingString(hContact, "Protocol", "p", &dbv)) - return 1; - - pa = Proto_GetAccount(dbv.pszVal); - if (pa == NULL || pa->ppro == NULL) - ret = 1; - else { - if (pa->bOldProto) - ret = CallProtoServiceInt(hContact, dbv.pszVal, szProtoService, (WPARAM)(-1), (LPARAM)&ccs); - else - ret = CallProtoServiceInt(hContact, dbv.pszVal, szProtoService, wParam, lParam); - if (ret == CALLSERVICE_NOTFOUND) - ret = 1; - } - - mir_free(dbv.pszVal); - return ret; -} - -///////////////////////////////////////////////////////////////////////////////////////// - static void InsertServiceListItem(int id, const char* szName) { TServiceListItem* p = (TServiceListItem*)mir_alloc(sizeof(TServiceListItem)); -- cgit v1.2.3