summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2012-10-07 11:47:00 +0000
committerGeorge Hazan <george.hazan@gmail.com>2012-10-07 11:47:00 +0000
commit08d82c6a8b0e597430aae75033fac58388139535 (patch)
treeb672e98dcce7b8f6339137822b0d9a3a11e2b4ef
parent197fe77f67654cf8c46c53376190fc321176c08b (diff)
new event filters, beginning
git-svn-id: http://svn.miranda-ng.org/main/trunk@1797 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r--src/modules/ignore/ignore.cpp452
-rw-r--r--src/modules/protocols/protochains.cpp259
-rw-r--r--src/modules/protocols/protocols.cpp60
3 files changed, 350 insertions, 421 deletions
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;i<IGNOREEVENT_MAX;i++)
+ DWORD mask = GetMask(hContact);
+ for (int i=0; i < IGNOREEVENT_MAX; i++)
if ((ignoreIdToPf1[i] == 0xFFFFFFFF && ignoreIdToPf4[i] == 0xFFFFFFFF) || (proto1Caps&ignoreIdToPf1[i] || proto4Caps&ignoreIdToPf4[i]))
SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(i, mask&(1<<i)?i+3:0));
+
SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(IGNOREEVENT_MAX, 1));
SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(IGNOREEVENT_MAX+1, 2));
}
static void SaveItemMask(HWND hwndList, HANDLE hContact, HANDLE hItem, const char *pszSetting)
{
- DWORD mask;
- int i, iImage;
-
- mask = 0;
- for (i=0;i<IGNOREEVENT_MAX;i++) {
- iImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(i, 0));
- if (iImage && iImage != 0xFF) mask|=1<<i;
+ DWORD mask = 0;
+ for (int i=0; i < IGNOREEVENT_MAX; i++) {
+ int iImage = SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(i, 0));
+ if (iImage && iImage != 0xFF)
+ mask |= 1 << i;
}
- DBWriteContactSettingDword(hContact, "Ignore", pszSetting, mask);
+ db_set_dw(hContact, "Ignore", pszSetting, mask);
}
static void SetAllContactIcons(HWND hwndList)
{
- HANDLE hContact, hItem;
- DWORD proto1Caps, proto4Caps;
- char *szProto;
-
- hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+ HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
do {
- hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0);
+ HANDLE hItem = (HANDLE)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0);
if (hItem && SendMessage(hwndList, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(IGNOREEVENT_MAX, 0)) == 0xFF) {
- szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
- if (szProto == NULL) proto1Caps = proto4Caps = 0;
- else {
- proto1Caps = CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0);
- proto4Caps = CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0);
- }
+ DWORD proto1Caps, proto4Caps;
+ char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+ if (szProto) {
+ proto1Caps = CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0);
+ proto4Caps = CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0);
+ }
+ else proto1Caps = proto4Caps = 0;
InitialiseItem(hwndList, hContact, hItem, proto1Caps, proto4Caps);
- if ( !DBGetContactSettingByte(hContact, "CList", "Hidden", 0))
+ if ( !db_get_b(hContact, "CList", "Hidden", 0))
SendMessage(hwndList, CLM_SETCHECKMARK, (WPARAM)hItem, 1);
}
- } while (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0));
+ }
+ while (hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0));
}
static INT_PTR CALLBACK DlgProcIgnoreOpts(HWND hwndDlg, UINT msg, WPARAM, LPARAM lParam)
@@ -193,148 +190,157 @@ static INT_PTR CALLBACK DlgProcIgnoreOpts(HWND hwndDlg, UINT msg, WPARAM, LPARAM
static HICON hIcons[IGNOREEVENT_MAX+2];
static HANDLE hItemAll, hItemUnknown;
- switch (msg)
- {
- case WM_INITDIALOG:
- TranslateDialogDefault(hwndDlg);
- { HIMAGELIST hIml;
- int i;
- hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), (IsWinVerXPPlus()?ILC_COLOR32:ILC_COLOR16)|ILC_MASK, 3+IGNOREEVENT_MAX, 3+IGNOREEVENT_MAX);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_SMALLDOT);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_FILLEDBLOB);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_EMPTYBLOB);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_EVENT_MESSAGE);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_EVENT_URL);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_EVENT_FILE);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_USERONLINE);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_MIRANDA);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_ADDCONTACT);
- ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_TYPING);
-
- SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml);
- for (i=0; i < SIZEOF(hIcons); i++)
- hIcons[i] = ImageList_GetIcon(hIml, 1+i, ILD_NORMAL);
- }
-
- SendDlgItemMessage(hwndDlg, IDC_ALLICON, STM_SETICON, (WPARAM)hIcons[0], 0);
- SendDlgItemMessage(hwndDlg, IDC_NONEICON, STM_SETICON, (WPARAM)hIcons[1], 0);
- SendDlgItemMessage(hwndDlg, IDC_MSGICON, STM_SETICON, (WPARAM)hIcons[2], 0);
- SendDlgItemMessage(hwndDlg, IDC_URLICON, STM_SETICON, (WPARAM)hIcons[3], 0);
- SendDlgItemMessage(hwndDlg, IDC_FILEICON, STM_SETICON, (WPARAM)hIcons[4], 0);
- SendDlgItemMessage(hwndDlg, IDC_ONLINEICON, STM_SETICON, (WPARAM)hIcons[5], 0);
- SendDlgItemMessage(hwndDlg, IDC_AUTHICON, STM_SETICON, (WPARAM)hIcons[6], 0);
- SendDlgItemMessage(hwndDlg, IDC_ADDED, STM_SETICON, (WPARAM)hIcons[7], 0);
- SendDlgItemMessage(hwndDlg, IDC_TYPINGICON, STM_SETICON, (WPARAM)hIcons[8], 0);
-
- if ( !SendMessage(GetParent(hwndDlg), PSM_ISEXPERT, 0, 0)) {
- SetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE, GetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE)&~(CLS_CHECKBOXES|CLS_GROUPCHECKBOXES|CLS_SHOWHIDDEN));
- SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_AUTOREBUILD, 0, 0);
- }
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+ {
+ HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), (IsWinVerXPPlus()?ILC_COLOR32:ILC_COLOR16)|ILC_MASK, 3+IGNOREEVENT_MAX, 3+IGNOREEVENT_MAX);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_SMALLDOT);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_FILLEDBLOB);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_EMPTYBLOB);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_EVENT_MESSAGE);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_EVENT_URL);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_EVENT_FILE);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_USERONLINE);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_MIRANDA);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_ADDCONTACT);
+ ImageList_AddIcon_IconLibLoaded(hIml, SKINICON_OTHER_TYPING);
+
+ SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hIml);
+ for (int i=0; i < SIZEOF(hIcons); i++)
+ hIcons[i] = ImageList_GetIcon(hIml, 1+i, ILD_NORMAL);
+ }
- ResetListOptions( GetDlgItem(hwndDlg, IDC_LIST));
- SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRACOLUMNS, IGNOREEVENT_MAX+2, 0);
+ SendDlgItemMessage(hwndDlg, IDC_ALLICON, STM_SETICON, (WPARAM)hIcons[0], 0);
+ SendDlgItemMessage(hwndDlg, IDC_NONEICON, STM_SETICON, (WPARAM)hIcons[1], 0);
+ SendDlgItemMessage(hwndDlg, IDC_MSGICON, STM_SETICON, (WPARAM)hIcons[2], 0);
+ SendDlgItemMessage(hwndDlg, IDC_URLICON, STM_SETICON, (WPARAM)hIcons[3], 0);
+ SendDlgItemMessage(hwndDlg, IDC_FILEICON, STM_SETICON, (WPARAM)hIcons[4], 0);
+ SendDlgItemMessage(hwndDlg, IDC_ONLINEICON, STM_SETICON, (WPARAM)hIcons[5], 0);
+ SendDlgItemMessage(hwndDlg, IDC_AUTHICON, STM_SETICON, (WPARAM)hIcons[6], 0);
+ SendDlgItemMessage(hwndDlg, IDC_ADDED, STM_SETICON, (WPARAM)hIcons[7], 0);
+ SendDlgItemMessage(hwndDlg, IDC_TYPINGICON, STM_SETICON, (WPARAM)hIcons[8], 0);
+
+ if ( !SendMessage(GetParent(hwndDlg), PSM_ISEXPERT, 0, 0)) {
+ SetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE, GetWindowLongPtr( GetDlgItem(hwndDlg, IDC_LIST), GWL_STYLE)&~(CLS_CHECKBOXES|CLS_GROUPCHECKBOXES|CLS_SHOWHIDDEN));
+ SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_AUTOREBUILD, 0, 0);
+ }
- { CLCINFOITEM cii = {0};
- cii.cbSize = sizeof(cii);
- cii.flags = CLCIIF_GROUPFONT;
- cii.pszText = TranslateT("** All contacts **");
- hItemAll = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
+ ResetListOptions( GetDlgItem(hwndDlg, IDC_LIST));
+ SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRACOLUMNS, IGNOREEVENT_MAX+2, 0);
+ {
+ CLCINFOITEM cii = { sizeof(cii) };
+ cii.flags = CLCIIF_GROUPFONT;
+ cii.pszText = TranslateT("** All contacts **");
+ hItemAll = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
+
+ cii.pszText = TranslateT("** Unknown contacts **");
+ hItemUnknown = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
+ InitialiseItem( GetDlgItem(hwndDlg, IDC_LIST), NULL, hItemUnknown, 0xFFFFFFFF, 0xFFFFFFFF);
+ }
- cii.pszText = TranslateT("** Unknown contacts **");
- hItemUnknown = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
- InitialiseItem( GetDlgItem(hwndDlg, IDC_LIST), NULL, hItemUnknown, 0xFFFFFFFF, 0xFFFFFFFF);
+ 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:
+ {
+ 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;iImage<IGNOREEVENT_MAX;iImage++)
+ SetIconsForColumn( GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, iImage, iImage+3);
+ }
+ else if (nm->iColumn == IGNOREEVENT_MAX+1) { // ignore none
+ for (int iImage = 0;iImage<IGNOREEVENT_MAX;iImage++)
+ SetIconsForColumn( GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, iImage, 0);
+ }
+ else {
+ int iImage = SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 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;iImage<IGNOREEVENT_MAX;iImage++)
- SetIconsForColumn( GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, iImage, iImage+3);
- }
- else if (nm->iColumn == IGNOREEVENT_MAX+1) { //ignore none
- for (iImage = 0;iImage<IGNOREEVENT_MAX;iImage++)
- SetIconsForColumn( GetDlgItem(hwndDlg, IDC_LIST), hItem, hItemAll, iImage, 0);
- }
- else {
- iImage = SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 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)-1;
- else mask|=1<<(lParam-1);
- DBWriteContactSettingDword((HANDLE)wParam, "Ignore", "Mask1", mask);
+ if ((lParam < 1 || lParam > 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 <m_protomod.h>
-//Protocol chain is list of integers "0".."n", with network protocol named "p"
+extern LIST<PROTOCOLDESCRIPTOR> 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<PROTOCOLDESCRIPTOR> 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<PROTOCOLDESCRIPTOR> 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));