/* Copyright (C) 2012 Mataes This is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this file; see the file license.txt. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" INT_PTR CALLBACK DlgProcAddFeedOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); SetWindowText(hwndDlg, TranslateT("Add Feed")); SetDlgItemText(hwndDlg, IDC_FEEDURL, _T("http://")); SetDlgItemText(hwndDlg, IDC_TAGSEDIT, _T(TAGSDEFAULT)); SendDlgItemMessage(hwndDlg, IDC_CHECKTIME, EM_LIMITTEXT, 3, 0); SetDlgItemInt(hwndDlg, IDC_CHECKTIME, DEFAULT_UPDATE_TIME, TRUE); SendDlgItemMessage(hwndDlg, IDC_TIMEOUT_VALUE_SPIN, UDM_SETRANGE32, 0, 999); Utils_RestoreWindowPositionNoSize(hwndDlg,NULL,MODULE,"AddDlg"); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { TCHAR str[MAX_PATH]; if (!GetDlgItemText(hwndDlg, IDC_FEEDTITLE, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter Feed name"), TranslateT("Error"), MB_OK); break; } if (!GetDlgItemText(hwndDlg, IDC_FEEDURL, str, SIZEOF(str)) || lstrcmp(str, _T("http://")) == 0) { MessageBox(hwndDlg, TranslateT("Enter Feed URL"), TranslateT("Error"), MB_OK); break; } if (GetDlgItemInt(hwndDlg, IDC_CHECKTIME, false, false) < 0) { MessageBox(hwndDlg, TranslateT("Enter checking interval"), TranslateT("Error"), MB_OK); break; } if (!GetDlgItemText(hwndDlg, IDC_TAGSEDIT, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter message format"), TranslateT("Error"), MB_OK); break; } HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContact, (LPARAM)MODULE); GetDlgItemText(hwndDlg, IDC_FEEDTITLE, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "Nick", str); HWND hwndList = (HWND)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); GetDlgItemText(hwndDlg, IDC_FEEDURL, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "URL", str); db_set_b(hContact, MODULE, "CheckState", 1); db_set_dw(hContact, MODULE, "UpdateTime", GetDlgItemInt(hwndDlg, IDC_CHECKTIME, false, false)); GetDlgItemText(hwndDlg, IDC_TAGSEDIT, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "MsgFormat", str); db_set_w(hContact, MODULE, "Status", CallProtoService(MODULE, PS_GETSTATUS, 0, 0)); if (IsDlgButtonChecked(hwndDlg, IDC_USEAUTH)) { db_set_b(hContact, MODULE, "UseAuth", 1); GetDlgItemText(hwndDlg, IDC_LOGIN, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "Login", str); GetDlgItemText(hwndDlg, IDC_PASSWORD, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "Password", str); } DeleteAllItems(hwndList); UpdateList(hwndList); } case IDCANCEL: DestroyWindow(hwndDlg); break; case IDC_USEAUTH: if (IsDlgButtonChecked(hwndDlg, IDC_USEAUTH)) { EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), TRUE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), FALSE); } break; case IDC_TAGHELP: { TCHAR tszTagHelp[1024]; mir_sntprintf(tszTagHelp, SIZEOF(tszTagHelp), _T("%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s"), _T("##"), TranslateT("The title of the item."), _T("#<description>#"), TranslateT("The item synopsis."), _T("#<link>#"), TranslateT("The URL of the item."), _T("#<author>#"), TranslateT("Email address of the author of the item."), _T("#<comments>#"), TranslateT("URL of a page for comments relating to the item."), _T("#<guid>#"), TranslateT("A string that uniquely identifies the item."), _T("#<category>#"), TranslateT("Specify one or more categories that the item belongs to.") ); MessageBox(hwndDlg, tszTagHelp, TranslateT("Feed Tag Help"), MB_OK); } break; case IDC_RESET: if (MessageBox(hwndDlg, TranslateT("Are you sure?"), TranslateT("Tags Mask Reset"), MB_YESNO | MB_ICONWARNING) == IDYES) SetDlgItemText(hwndDlg, IDC_TAGSEDIT, _T(TAGSDEFAULT)); break; case IDC_DISCOVERY: EnableWindow(GetDlgItem(hwndDlg, IDC_DISCOVERY), FALSE); SetDlgItemText(hwndDlg, IDC_DISCOVERY, TranslateT("Wait...")); TCHAR tszURL[MAX_PATH] = {0}, *tszTitle = NULL; if (GetDlgItemText(hwndDlg, IDC_FEEDURL, tszURL, SIZEOF(tszURL)) || lstrcmp(tszURL, _T("http://")) != 0) tszTitle = CheckFeed(tszURL, hwndDlg); else MessageBox(hwndDlg, TranslateT("Enter Feed URL"), TranslateT("Error"), MB_OK); SetDlgItemText(hwndDlg, IDC_FEEDTITLE, tszTitle); EnableWindow(GetDlgItem(hwndDlg, IDC_DISCOVERY), TRUE); SetDlgItemText(hwndDlg, IDC_DISCOVERY, TranslateT("Check Feed")); } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: Utils_SaveWindowPosition(hwndDlg, NULL, MODULE, "AddDlg"); break; } return FALSE; } INT_PTR CALLBACK DlgProcChangeFeedOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { ItemInfo &SelItem = *(ItemInfo*)lParam; ItemInfo *nSelItem = new ItemInfo(SelItem); SetWindowText(hwndDlg, TranslateT("Change Feed")); SendDlgItemMessage(hwndDlg, IDC_CHECKTIME, EM_LIMITTEXT, 3, 0); SendDlgItemMessage(hwndDlg, IDC_TIMEOUT_VALUE_SPIN, UDM_SETRANGE32, 0, 999); HANDLE hContact; for (hContact = db_find_first(MODULE); hContact; hContact = db_find_next(hContact, MODULE)) { DBVARIANT dbNick = {0}; if (db_get_ts(hContact, MODULE, "Nick", &dbNick)) continue; else if (lstrcmp(dbNick.ptszVal, SelItem.nick) == 0) { db_free(&dbNick); DBVARIANT dbURL = {0}; if (db_get_ts(hContact, MODULE, "URL", &dbURL)) continue; else if (lstrcmp(dbURL.ptszVal, SelItem.url) == 0) { db_free(&dbURL); nSelItem->hContact = hContact; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG)nSelItem); SetDlgItemText(hwndDlg, IDC_FEEDURL, SelItem.url); SetDlgItemText(hwndDlg, IDC_FEEDTITLE, SelItem.nick); SetDlgItemInt(hwndDlg, IDC_CHECKTIME, db_get_dw(hContact, MODULE, "UpdateTime", DEFAULT_UPDATE_TIME), TRUE); DBVARIANT dbMsg = {0}; if (!db_get_ts(hContact, MODULE, "MsgFormat", &dbMsg)) { SetDlgItemText(hwndDlg, IDC_TAGSEDIT, dbMsg.ptszVal); db_free(&dbMsg); } if (db_get_b(hContact, MODULE, "UseAuth", 0)) { CheckDlgButton(hwndDlg, IDC_USEAUTH, BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), TRUE); DBVARIANT dbLogin = {0}; if (!db_get_ts(hContact, MODULE, "Login", &dbLogin)) { SetDlgItemText(hwndDlg, IDC_LOGIN, dbLogin.ptszVal); db_free(&dbLogin); } DBVARIANT dbPass = {0}; if (!db_get_ts(hContact, MODULE, "Password", &dbPass)) { SetDlgItemText(hwndDlg, IDC_PASSWORD, dbPass.ptszVal); db_free(&dbPass); } } break; } db_free(&dbURL); } db_free(&dbNick); } WindowList_Add(hChangeFeedDlgList, hwndDlg, hContact); Utils_RestoreWindowPositionNoSize(hwndDlg, hContact, MODULE, "ChangeDlg"); } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { ItemInfo *SelItem = (ItemInfo*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); TCHAR str[MAX_PATH]; if (!GetDlgItemText(hwndDlg, IDC_FEEDTITLE, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter Feed name"), TranslateT("Error"), MB_OK); break; } if (!GetDlgItemText(hwndDlg, IDC_FEEDURL, str, SIZEOF(str)) || lstrcmp(str, _T("http://")) == 0) { MessageBox(hwndDlg, TranslateT("Enter Feed URL"), TranslateT("Error"), MB_OK); break; } if (GetDlgItemInt(hwndDlg, IDC_CHECKTIME, false, false) < 0) { MessageBox(hwndDlg, TranslateT("Enter checking interval"), TranslateT("Error"), MB_OK); break; } if (!GetDlgItemText(hwndDlg, IDC_TAGSEDIT, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter message format"), TranslateT("Error"), MB_OK); break; } GetDlgItemText(hwndDlg, IDC_FEEDURL, str, SIZEOF(str)); db_set_ts(SelItem->hContact, MODULE, "URL", str); GetDlgItemText(hwndDlg, IDC_FEEDTITLE, str, SIZEOF(str)); db_set_ts(SelItem->hContact, MODULE, "Nick", str); db_set_dw(SelItem->hContact, MODULE, "UpdateTime", GetDlgItemInt(hwndDlg, IDC_CHECKTIME, false, false)); GetDlgItemText(hwndDlg, IDC_TAGSEDIT, str, SIZEOF(str)); db_set_ts(SelItem->hContact, MODULE, "MsgFormat", str); if (IsDlgButtonChecked(hwndDlg, IDC_USEAUTH)) { db_set_b(SelItem->hContact, MODULE, "UseAuth", 1); GetDlgItemText(hwndDlg, IDC_LOGIN, str, SIZEOF(str)); db_set_ts(SelItem->hContact, MODULE, "Login", str); GetDlgItemText(hwndDlg, IDC_PASSWORD, str, SIZEOF(str)); db_set_ts(SelItem->hContact, MODULE, "Password", str); } DeleteAllItems(SelItem->hwndList); UpdateList(SelItem->hwndList); } case IDCANCEL: DestroyWindow(hwndDlg); break; case IDC_USEAUTH: if (IsDlgButtonChecked(hwndDlg, IDC_USEAUTH)) { EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), TRUE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), FALSE); } break; case IDC_TAGHELP: { TCHAR tszTagHelp[1024]; mir_sntprintf(tszTagHelp, SIZEOF(tszTagHelp), _T("%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s"), _T("#<title>#"), TranslateT("The title of the item."), _T("#<description>#"), TranslateT("The item synopsis."), _T("#<link>#"), TranslateT("The URL of the item."), _T("#<author>#"), TranslateT("Email address of the author of the item."), _T("#<comments>#"), TranslateT("URL of a page for comments relating to the item."), _T("#<guid>#"), TranslateT("A string that uniquely identifies the item."), _T("#<category>#"), TranslateT("Specify one or more categories that the item belongs to.") ); MessageBox(hwndDlg, tszTagHelp, TranslateT("Feed Tag Help"), MB_OK); } break; case IDC_RESET: if (MessageBox(hwndDlg, TranslateT("Are you sure?"), TranslateT("Tags Mask Reset"), MB_YESNO | MB_ICONWARNING) == IDYES) SetDlgItemText(hwndDlg, IDC_TAGSEDIT, _T(TAGSDEFAULT)); break; case IDC_DISCOVERY: TCHAR tszURL[MAX_PATH] = {0}; if (GetDlgItemText(hwndDlg, IDC_FEEDURL, tszURL, SIZEOF(tszURL)) || lstrcmp(tszURL, _T("http://")) != 0) { EnableWindow(GetDlgItem(hwndDlg, IDC_DISCOVERY), FALSE); SetDlgItemText(hwndDlg, IDC_DISCOVERY, TranslateT("Wait...")); TCHAR *tszTitle = CheckFeed(tszURL, hwndDlg); SetDlgItemText(hwndDlg, IDC_FEEDTITLE, tszTitle); EnableWindow(GetDlgItem(hwndDlg, IDC_DISCOVERY), TRUE); SetDlgItemText(hwndDlg, IDC_DISCOVERY, TranslateT("Check Feed")); } else MessageBox(hwndDlg, TranslateT("Enter Feed URL"), TranslateT("Error"), MB_OK); } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); Utils_SaveWindowPosition(hwndDlg, hContact, MODULE, "ChangeDlg"); WindowList_Remove(hChangeFeedDlgList, hwndDlg); ItemInfo *SelItem = (ItemInfo*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); delete SelItem; break; } return FALSE; } INT_PTR CALLBACK DlgProcChangeFeedMenu(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { SetWindowText(hwndDlg, TranslateT("Change Feed")); SendDlgItemMessage(hwndDlg, IDC_CHECKTIME, UDM_SETRANGE32, 0, 999); HANDLE hContact = (HANDLE)lParam; WindowList_Add(hChangeFeedDlgList, hwndDlg, hContact); Utils_RestoreWindowPositionNoSize(hwndDlg, hContact, MODULE, "ChangeDlg"); DBVARIANT dbv; if (!db_get_ts(hContact, MODULE, "Nick", &dbv)) { SetDlgItemText(hwndDlg, IDC_FEEDTITLE, dbv.ptszVal); db_free(&dbv); } if (!db_get_ts(hContact, MODULE, "URL", &dbv)) { SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG)lParam); SetDlgItemText(hwndDlg, IDC_FEEDURL, dbv.ptszVal); db_free(&dbv); } SetDlgItemInt(hwndDlg, IDC_CHECKTIME, db_get_dw(hContact, MODULE, "UpdateTime", DEFAULT_UPDATE_TIME), TRUE); if (!db_get_ts(hContact, MODULE, "MsgFormat", &dbv)) { SetDlgItemText(hwndDlg, IDC_TAGSEDIT, dbv.ptszVal); db_free(&dbv); } if (db_get_b(hContact, MODULE, "UseAuth", 0)) { CheckDlgButton(hwndDlg, IDC_USEAUTH, BST_CHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), TRUE); if (!db_get_ts(hContact, MODULE, "Login", &dbv)) { SetDlgItemText(hwndDlg, IDC_LOGIN, dbv.ptszVal); db_free(&dbv); } if (!db_get_ts(hContact, MODULE, "Password", &dbv)) { SetDlgItemText(hwndDlg, IDC_PASSWORD, dbv.ptszVal); db_free(&dbv); } } } return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); TCHAR str[MAX_PATH]; if (!GetDlgItemText(hwndDlg, IDC_FEEDTITLE, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter Feed name"), TranslateT("Error"), MB_OK); break; } if (!GetDlgItemText(hwndDlg, IDC_FEEDURL, str, SIZEOF(str)) || lstrcmp(str, _T("http://")) == 0) { MessageBox(hwndDlg, TranslateT("Enter Feed URL"), TranslateT("Error"), MB_OK); break; } if (GetDlgItemInt(hwndDlg, IDC_CHECKTIME, false, false) < 0) { MessageBox(hwndDlg, TranslateT("Enter checking interval"), TranslateT("Error"), MB_OK); break; } if (!GetDlgItemText(hwndDlg, IDC_TAGSEDIT, str, SIZEOF(str))) { MessageBox(hwndDlg, TranslateT("Enter message format"), TranslateT("Error"), MB_OK); break; } GetDlgItemText(hwndDlg, IDC_FEEDURL, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "URL", str); GetDlgItemText(hwndDlg, IDC_FEEDTITLE, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "Nick", str); db_set_dw(hContact, MODULE, "UpdateTime", GetDlgItemInt(hwndDlg, IDC_CHECKTIME, false, false)); GetDlgItemText(hwndDlg, IDC_TAGSEDIT, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "MsgFormat", str); if (IsDlgButtonChecked(hwndDlg, IDC_USEAUTH)) { db_set_b(hContact, MODULE, "UseAuth", 1); GetDlgItemText(hwndDlg, IDC_LOGIN, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "Login", str); GetDlgItemText(hwndDlg, IDC_PASSWORD, str, SIZEOF(str)); db_set_ts(hContact, MODULE, "Password", str); } } case IDCANCEL: DestroyWindow(hwndDlg); break; case IDC_USEAUTH: if (IsDlgButtonChecked(hwndDlg, IDC_USEAUTH)) { EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), TRUE); } else { EnableWindow(GetDlgItem(hwndDlg, IDC_LOGIN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_PASSWORD), FALSE); } break; case IDC_TAGHELP: { TCHAR tszTagHelp[1024]; mir_sntprintf(tszTagHelp, SIZEOF(tszTagHelp), _T("%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s"), _T("#<title>#"), TranslateT("The title of the item."), _T("#<description>#"), TranslateT("The item synopsis."), _T("#<link>#"), TranslateT("The URL of the item."), _T("#<author>#"), TranslateT("Email address of the author of the item."), _T("#<comments>#"), TranslateT("URL of a page for comments relating to the item."), _T("#<guid>#"), TranslateT("A string that uniquely identifies the item."), _T("#<category>#"), TranslateT("Specify one or more categories that the item belongs to.") ); MessageBox(hwndDlg, tszTagHelp, TranslateT("Feed Tag Help"), MB_OK); } break; case IDC_RESET: if (MessageBox(hwndDlg, TranslateT("Are you sure?"), TranslateT("Tags Mask Reset"), MB_YESNO | MB_ICONWARNING) == IDYES) SetDlgItemText(hwndDlg, IDC_TAGSEDIT, _T(TAGSDEFAULT)); break; case IDC_DISCOVERY: TCHAR tszURL[MAX_PATH] = {0}; if (GetDlgItemText(hwndDlg, IDC_FEEDURL, tszURL, SIZEOF(tszURL)) || lstrcmp(tszURL, _T("http://")) != 0) { EnableWindow(GetDlgItem(hwndDlg, IDC_DISCOVERY), FALSE); SetDlgItemText(hwndDlg, IDC_DISCOVERY, TranslateT("Wait...")); TCHAR *tszTitle = CheckFeed(tszURL, hwndDlg); SetDlgItemText(hwndDlg, IDC_FEEDTITLE, tszTitle); EnableWindow(GetDlgItem(hwndDlg, IDC_DISCOVERY), TRUE); SetDlgItemText(hwndDlg, IDC_DISCOVERY, TranslateT("Check Feed")); } else MessageBox(hwndDlg, TranslateT("Enter Feed URL"), TranslateT("Error"), MB_OK); } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: HANDLE hContact = (HANDLE)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); Utils_SaveWindowPosition(hwndDlg, hContact, MODULE, "ChangeDlg"); WindowList_Remove(hChangeFeedDlgList, hwndDlg); } return FALSE; } INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hwndList = GetDlgItem(hwndDlg, IDC_FEEDLIST); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); CreateList(hwndList); UpdateList(hwndList); CheckDlgButton(hwndDlg, IDC_STARTUPRETRIEVE, db_get_b(NULL, MODULE, "StartupRetrieve", 1)); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ADD: CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ADDFEED), hwndDlg, DlgProcAddFeedOpts, (LPARAM)hwndList); return FALSE; case IDC_CHANGE: { ItemInfo SelItem = {0}; int sel = ListView_GetSelectionMark(hwndList); ListView_GetItemText(hwndList, sel, 0, SelItem.nick, MAX_PATH); ListView_GetItemText(hwndList, sel, 1, SelItem.url, MAX_PATH); SelItem.hwndList = hwndList; SelItem.SelNumber = sel; CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ADDFEED), hwndDlg, DlgProcChangeFeedOpts, (LPARAM)&SelItem); } return FALSE; case IDC_REMOVE: if (MessageBox(hwndDlg, TranslateT("Are you sure?"), TranslateT("Contact deleting"), MB_YESNO | MB_ICONWARNING) == IDYES) { TCHAR nick[MAX_PATH], url[MAX_PATH]; int sel = ListView_GetSelectionMark(hwndList); ListView_GetItemText(hwndList, sel, 0, nick, MAX_PATH); ListView_GetItemText(hwndList, sel, 1, url, MAX_PATH); for (HANDLE hContact = db_find_first(MODULE); hContact; hContact = db_find_next(hContact, MODULE)) { DBVARIANT dbNick = {0}; if (db_get_ts(hContact, MODULE, "Nick", &dbNick)) break; else if (lstrcmp(dbNick.ptszVal, nick) == 0) { db_free(&dbNick); DBVARIANT dbURL = {0}; if (db_get_ts(hContact, MODULE, "URL", &dbURL)) break; else if (lstrcmp(dbURL.ptszVal, url) == 0) { db_free(&dbURL); CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); ListView_DeleteItem(hwndList, sel); break; } db_free(&dbURL); } db_free(&dbNick); } } return FALSE; case IDC_IMPORT: { TCHAR FileName[MAX_PATH]; TCHAR *tszMirDir = Utils_ReplaceVarsT(_T("%miranda_path%")); OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(ofn); TCHAR tmp[MAX_PATH]; mir_sntprintf(tmp, SIZEOF(tmp), _T("%s (*.opml, *.xml)%c*.opml;*.xml%c%c"), TranslateT("OPML files"), 0, 0, 0); ofn.lpstrFilter = tmp; ofn.hwndOwner = 0; ofn.lpstrFile = FileName; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_HIDEREADONLY; ofn.lpstrInitialDir = tszMirDir; *FileName = '\0'; ofn.lpstrDefExt = _T(""); if (GetOpenFileName(&ofn)) { int bytesParsed = 0; HXML hXml = xi.parseFile(FileName, &bytesParsed, NULL); if(hXml != NULL) { BYTE isTitleUTF = 0, isURLUTF = 0, isSiteURLUTF = 0, isGroupUTF = 0; HXML node = xi.getChildByPath(hXml, _T("opml/body/outline"), 0); if ( !node) node = xi.getChildByPath(hXml, _T("body/outline"), 0); if (node) { while (node) { int outlineAttr = xi.getAttrCount(node); int outlineChildsCount = xi.getChildCount(node); TCHAR *type = (TCHAR *)xi.getAttrValue(node, _T("type")); if ( !type && !outlineChildsCount) { HXML tmpnode = node; node = xi.getNextNode(node); if ( !node) { do { node = tmpnode; node = xi.getParent(node); tmpnode = node; node = xi.getNextNode(node); if (node) break; } while (lstrcmpi(xi.getName(node), _T("body"))); } } else if (!type && outlineChildsCount) node = xi.getFirstChild(node); else if (type) { TCHAR *title = NULL, *url = NULL, *siteurl = NULL, *group = NULL, *utfgroup = NULL; for (int i = 0; i < outlineAttr; i++) { if (!lstrcmpi(xi.getAttrName(node, i), _T("title"))) { title = mir_utf8decodeT(_T2A(xi.getAttrValue(node, xi.getAttrName(node, i)))); if ( !title) { isTitleUTF = 0; title = (TCHAR *)xi.getAttrValue(node, xi.getAttrName(node, i)); } else isTitleUTF = 1; continue; } if (!lstrcmpi(xi.getAttrName(node, i), _T("xmlUrl"))) { url = mir_utf8decodeT(_T2A(xi.getAttrValue(node, xi.getAttrName(node, i)))); if ( !url) { isURLUTF = 0; url = (TCHAR *)xi.getAttrValue(node, xi.getAttrName(node, i)); } else isURLUTF = 1; continue; } if (!lstrcmpi(xi.getAttrName(node, i), _T("htmlUrl"))) { siteurl = mir_utf8decodeT(_T2A(xi.getAttrValue(node, xi.getAttrName(node, i)))); if ( !siteurl) { isSiteURLUTF = 0; siteurl = (TCHAR *)xi.getAttrValue(node, xi.getAttrName(node, i)); } else isSiteURLUTF = 1; continue; } if (title && url && siteurl) break; } HXML parent = xi.getParent(node); while (lstrcmpi(xi.getName(parent), _T("body"))) { for (int i = 0; i < xi.getAttrCount(parent); i++) { if (!lstrcmpi(xi.getAttrName(parent, i), _T("title"))) { if ( !group) group = (TCHAR *)xi.getAttrValue(parent, xi.getAttrName(parent, i)); else { TCHAR tmpgroup[1024]; mir_sntprintf(tmpgroup, SIZEOF(tmpgroup), _T("%s\\%s"), xi.getAttrValue(parent, xi.getAttrName(parent, i)), group); group = tmpgroup; } break; } } parent = xi.getParent(parent); } if (group) { utfgroup = mir_utf8decodeT(_T2A(group)); if ( !utfgroup) { isGroupUTF = 0; utfgroup = group; } else isGroupUTF = 1; } HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_ADD, 0, 0); CallService(MS_PROTO_ADDTOCONTACT, (WPARAM)hContact, (LPARAM)MODULE); db_set_ts(hContact, MODULE, "Nick", title); db_set_ts(hContact, MODULE, "URL", url); db_set_ts(hContact, MODULE, "Homepage", siteurl); db_set_b(hContact, MODULE, "CheckState", 1); db_set_dw(hContact, MODULE, "UpdateTime", DEFAULT_UPDATE_TIME); db_set_ts(hContact, MODULE, "MsgFormat", _T(TAGSDEFAULT)); db_set_w(hContact, MODULE, "Status", CallProtoService(MODULE, PS_GETSTATUS, 0, 0)); if (utfgroup) { db_set_ts(hContact, "CList", "Group", utfgroup); int hGroup = 1; char *group_name; BYTE GroupExist = 0; do { group_name = (char *)CallService(MS_CLIST_GROUPGETNAME, (WPARAM)hGroup, 0); if (group_name != NULL && !strcmp(group_name, _T2A(utfgroup))) { GroupExist = 1; break; } hGroup++; } while (group_name); if(!GroupExist) CallService(MS_CLIST_GROUPCREATE, 0, (LPARAM)utfgroup); } if (isTitleUTF) mir_free(title); if (isURLUTF) mir_free(url); if (isGroupUTF) mir_free(utfgroup); if (isSiteURLUTF) mir_free(siteurl); HXML tmpnode = node; node = xi.getNextNode(node); if ( !node) { do { node = tmpnode; node = xi.getParent(node); tmpnode = node; node = xi.getNextNode(node); if (node) break; } while (lstrcmpi(xi.getName(tmpnode), _T("body"))); } } } } else MessageBox(NULL, TranslateT("Not valid import file."), TranslateT("Error"), MB_OK | MB_ICONERROR); xi.destroyNode(hXml); } else MessageBox(NULL, TranslateT("Not valid import file."), TranslateT("Error"), MB_OK | MB_ICONERROR); DeleteAllItems(hwndList); UpdateList(hwndList); } mir_free(tszMirDir); } return FALSE; case IDC_EXPORT: { TCHAR FileName[MAX_PATH]; TCHAR *tszMirDir = Utils_ReplaceVarsT(_T("%miranda_path%")); OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(ofn); TCHAR tmp[MAX_PATH]; mir_sntprintf(tmp, SIZEOF(tmp), _T("%s (*.opml)%c*.opml%c%c"), TranslateT("OPML files"), 0, 0, 0); ofn.lpstrFilter = tmp; ofn.hwndOwner = 0; ofn.lpstrFile = FileName; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_HIDEREADONLY | OFN_SHAREAWARE | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT; ofn.lpstrInitialDir = tszMirDir; *FileName = '\0'; ofn.lpstrDefExt = _T(""); if (GetSaveFileName(&ofn)) { HXML hXml = xi.createNode(_T("opml"), NULL, FALSE); xi.addAttr(hXml, _T("version"), _T("1.0")); HXML header = xi.addChild(hXml, _T("head"), NULL); HXML title = xi.addChild(header, _T("title"), _T("Miranda NG NewsAggregator plugin export")); header = xi.addChild(hXml, _T("body"), NULL); for (HANDLE hContact = db_find_first(MODULE); hContact; hContact = db_find_next(hContact, MODULE)) { TCHAR *title = NULL, *url = NULL, *siteurl = NULL, *group = NULL; DBVARIANT dbv = {0}; if (!db_get_ts(hContact, MODULE, "Nick", &dbv)) { title = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } if (!db_get_ts(hContact, MODULE, "URL", &dbv)) { url = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } if (!db_get_ts(hContact, MODULE, "Homepage", &dbv)) { siteurl = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } if (!db_get_ts(hContact, "CList", "Group", &dbv)) { group = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } HXML elem = header; if (group) { TCHAR *section = _tcstok(group, _T("\\")); while (section != NULL) { HXML existgroup = xi.getChildByAttrValue(header, _T("outline"), _T("title"), section); if ( !existgroup) { elem = xi.addChild(elem, _T("outline"), NULL); xi.addAttr(elem, _T("title"), section); xi.addAttr(elem, _T("text"), section); } else { elem = existgroup; } section = _tcstok(NULL, _T("\\")); } elem = xi.addChild(elem, _T("outline"), NULL); } else elem = xi.addChild(elem, _T("outline"), NULL); xi.addAttr(elem, _T("text"), title); xi.addAttr(elem, _T("title"), title); xi.addAttr(elem, _T("type"), _T("rss")); xi.addAttr(elem, _T("xmlUrl"), url); xi.addAttr(elem, _T("htmlUrl"), siteurl); mir_free(title); mir_free(url); mir_free(siteurl); mir_free(group); } xi.toFile(hXml, FileName, 1); xi.destroyNode(hXml); } } return FALSE; case IDC_STARTUPRETRIEVE: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } break; case WM_NOTIFY: { NMHDR *hdr = (NMHDR *)lParam; switch (hdr->code) { case PSN_APPLY: { db_set_b(NULL, MODULE, "StartupRetrieve", IsDlgButtonChecked(hwndDlg, IDC_STARTUPRETRIEVE)); int i = 0; for (HANDLE hContact = db_find_first(MODULE); hContact; hContact = db_find_next(hContact, MODULE)) { db_set_b(hContact, MODULE, "CheckState", ListView_GetCheckState(hwndList, i)); if (!ListView_GetCheckState(hwndList, i)) db_set_b(hContact, "CList", "Hidden", 1); else db_unset(hContact,"CList","Hidden"); i += 1; } } break; case NM_DBLCLK: { ItemInfo SelItem = {0}; int sel = ListView_GetHotItem(hwndList); if (sel != -1) { ListView_GetItemText(hwndList, sel, 0, SelItem.nick, MAX_PATH); ListView_GetItemText(hwndList, sel, 1, SelItem.url, MAX_PATH); SelItem.hwndList = hwndList; SelItem.SelNumber = sel; CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ADDFEED), hwndDlg, DlgProcChangeFeedOpts, (LPARAM)&SelItem); } break; } case LVN_ITEMCHANGED: { NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; if (((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK) && !UpdateListFlag) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } } } }//end* switch (msg) return FALSE; } INT OptInit(WPARAM wParam, LPARAM lParam) { OPTIONSDIALOGPAGE odp = { sizeof(odp) }; odp.position = 100000000; odp.hInstance = hInst; odp.flags = ODPF_BOLDGROUPS; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS); odp.pszGroup = LPGEN("Network"); odp.pszTitle = LPGEN("News Aggregator"); odp.pfnDlgProc = UpdateNotifyOptsProc; Options_AddPage(wParam, &odp); return 0; }