summaryrefslogtreecommitdiff
path: root/protocols/WebView/src/webview_services.cpp
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-03-02 12:32:44 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-03-02 12:32:55 +0300
commit931a7dc1ac0dbc7e6c1083583ced915e572f5b47 (patch)
tree9fe9a6448d44030e26aa7107ce16044ed413e0d0 /protocols/WebView/src/webview_services.cpp
parentdd7d9954042254e66e3bbbec7195c6be8b1a0663 (diff)
all protocols (even virtual ones) moved to the Protocols folder
Diffstat (limited to 'protocols/WebView/src/webview_services.cpp')
-rw-r--r--protocols/WebView/src/webview_services.cpp458
1 files changed, 458 insertions, 0 deletions
diff --git a/protocols/WebView/src/webview_services.cpp b/protocols/WebView/src/webview_services.cpp
new file mode 100644
index 0000000000..4957120181
--- /dev/null
+++ b/protocols/WebView/src/webview_services.cpp
@@ -0,0 +1,458 @@
+/*
+* A plugin for Miranda IM which displays web page text in a window Copyright
+* (C) 2005 Vincent Joyce.
+*
+* Miranda IM: the free icq client for MS Windows Copyright (C) 2000-2
+* Richard Hughes, Roland Rabien & Tristan Van de Vreede
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the Free
+* Software Foundation; either version 2 of the License, or (at your option)
+* any later version.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* for more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program; if not, write to the Free Software Foundation, Inc., 59
+* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "stdafx.h"
+#include "webview.h"
+
+static int searchId = -1;
+
+/*****************************************************************************/
+static char szInvalidChars[] = { '\\', '/', ':', '*', '?', '\"', '<', '>', '|' };
+
+int DBSettingChanged(WPARAM wParam, LPARAM lParam)
+{
+ // We can't upload changes to NULL contact
+ MCONTACT hContact = wParam;
+ if (hContact == NULL)
+ return 0;
+
+ DBCONTACTWRITESETTING *cws = (DBCONTACTWRITESETTING *)lParam;
+ if (!strcmp(cws->szModule, "CList")) {
+ int invalidpresent = 0;
+
+ char *szProto = GetContactProto(hContact);
+ if (szProto == nullptr || strcmp(szProto, MODULENAME))
+ return 0;
+
+ // A contact is renamed
+ if (!strcmp(cws->szSetting, "MyHandle")) {
+ ptrW oldName(g_plugin.getWStringA(hContact, PRESERVE_NAME_KEY));
+ if (oldName == NULL)
+ return 0;
+
+ wchar_t nick[100];
+ ptrW oldnick(db_get_wsa(hContact, "CList", "MyHandle"));
+ if (oldnick != NULL)
+ wcsncpy_s(nick, oldnick, _TRUNCATE);
+ else
+ nick[0] = 0;
+
+ for (int i = 0; i < _countof(szInvalidChars); i++) {
+ wchar_t *p = wcschr(nick, szInvalidChars[i]);
+ if (p != nullptr) {
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Invalid symbol present in contact name."));
+ *p = '_';
+ invalidpresent = 1;
+ }
+ }
+
+ if (invalidpresent) {
+ srand((unsigned)time(0));
+ wchar_t ranStr[7];
+ _itow((int)10000 * rand() / (RAND_MAX + 1.0), ranStr, 10);
+ mir_wstrcat(nick, ranStr);
+ }
+
+ if (wcschr(nick, '(') == nullptr) {
+ g_plugin.setWString(hContact, PRESERVE_NAME_KEY, nick);
+ g_plugin.setWString(hContact, "Nick", nick);
+ db_set_ws(hContact, "CList", "MyHandle", nick);
+ }
+
+ // TEST GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+ mir_snwprintf(cachedirectorypath, L"%s" _A2W(MODULENAME) L"cache\\", cachepath);
+ CreateDirectory(cachedirectorypath, nullptr);
+
+ wchar_t newcachepath[MAX_PATH + 50], renamedcachepath[MAX_PATH + 50];
+ mir_snwprintf(newcachepath, L"%s" _A2W(MODULENAME) L"cache\\%s.txt", cachepath, oldName);
+ mir_snwprintf(renamedcachepath, L"%s" _A2W(MODULENAME) L"cache\\%s.txt", cachepath, nick);
+
+ // file exists?
+ if (_waccess(newcachepath, 0) != -1) {
+ FILE *pcachefile = _wfopen(newcachepath, L"r");
+ if (pcachefile != nullptr) {
+ fclose(pcachefile);
+ if (mir_wstrcmp(newcachepath, renamedcachepath)) {
+ MoveFile(newcachepath, renamedcachepath);
+ g_plugin.setWString(hContact, CACHE_FILE_KEY, renamedcachepath);
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+int SiteDeleted(WPARAM wParam, LPARAM)
+{
+ MCONTACT hContact = wParam;
+ if (mir_strcmp(GetContactProto(hContact), MODULENAME))
+ return 0;
+
+ ptrW contactName(g_plugin.getWStringA(hContact, PRESERVE_NAME_KEY));
+
+ // TEST GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH], newcachepath[MAX_PATH + 50];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+
+ mir_snwprintf(cachedirectorypath, L"%s" _A2W(MODULENAME) L"cache\\", cachepath);
+ CreateDirectory(cachedirectorypath, nullptr);
+ mir_snwprintf(newcachepath, L"%s" _A2W(MODULENAME) L"cache\\%s.txt", cachepath, contactName);
+ // file exists?
+ if (_waccess(newcachepath, 0) != -1) {
+ FILE *pcachefile = _wfopen(newcachepath, L"r");
+ if (pcachefile != nullptr) {
+ fclose(pcachefile);
+ DeleteFile(newcachepath);
+ g_plugin.setString(hContact, CACHE_FILE_KEY, "");
+ }
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR OpenCacheDir(WPARAM, LPARAM)
+{
+ //GET NAME FOR CACHE
+ wchar_t cachepath[MAX_PATH], cachedirectorypath[MAX_PATH];
+ GetModuleFileName(g_plugin.getInst(), cachepath, _countof(cachepath));
+ wchar_t *cacheend = wcsrchr(cachepath, '\\');
+ cacheend++;
+ *cacheend = '\0';
+
+ mir_snwprintf(cachedirectorypath, L"%s" _A2W(MODULENAME) L"cache\\%s", cachepath, cacheend);
+
+ if (_waccess(cachedirectorypath, 0) != 0)
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Cache folder does not exist."));
+ else
+ ShellExecute(nullptr, L"open", cachedirectorypath, nullptr, nullptr, SW_SHOWNORMAL);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR PingWebsiteMenuCommand(WPARAM wParam, LPARAM)
+{
+ FILE *pfile = fopen("psite.bat", "r");
+ if (pfile == nullptr) {
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Missing \"psite.bat\" file."));
+ return 0;
+ }
+
+ ptrW url(g_plugin.getWStringA(wParam, "URL"));
+ if (url == NULL)
+ return 0;
+
+ wchar_t Cnick[200], *Oldnick;
+ wcsncpy(Cnick, url, _countof(Cnick));
+ if ((Oldnick = wcsstr(Cnick, L"://")) != nullptr)
+ Oldnick += 3;
+ else
+ Oldnick = Cnick;
+
+ wchar_t *Nend = wcschr(Oldnick, '/');
+ if (Nend) *Nend = '\0';
+
+ ShellExecute(nullptr, L"open", L"psite.bat", Oldnick, nullptr, SW_HIDE);
+ return 0;
+}
+
+/*****************************************************************************/
+INT_PTR StpPrcssMenuCommand(WPARAM wParam, LPARAM)
+{
+ g_plugin.setByte(wParam, STOP_KEY, 1);
+ return 0;
+}
+
+//=======================================================
+// GetCaps
+// =======================================================
+
+INT_PTR GetCaps(WPARAM wParam, LPARAM)
+{
+ switch (wParam) {
+ case PFLAGNUM_1:
+ return PF1_BASICSEARCH | PF1_ADDSEARCHRES | PF1_VISLIST;
+ case PFLAGNUM_2:
+ return g_plugin.getByte(HIDE_STATUS_ICON_KEY, 0) ? 0 : (PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND);
+ case PFLAGNUM_3:
+ return 0;
+ case PFLAGNUM_4:
+ return PF4_NOCUSTOMAUTH | PF4_NOAUTHDENYREASON;
+ case PFLAGNUM_5:
+ return PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_LIGHTDND | PF2_HEAVYDND | PF2_FREECHAT | PF2_OUTTOLUNCH | PF2_ONTHEPHONE;
+ case PFLAG_UNIQUEIDTEXT:
+ return (INT_PTR)Translate("Site URL");
+ default:
+ return 0;
+ }
+}
+
+// =======================================================
+// GetName
+// =======================================================
+
+INT_PTR GetName(WPARAM wParam, LPARAM lParam)
+{
+ mir_strncpy((char*)lParam, MODULENAME, wParam);
+ return 0;
+}
+
+//=======================================================
+// SetStatus
+// =======================================================
+
+INT_PTR SetStatus(WPARAM wParam, LPARAM)
+{
+ int oldStatus = bpStatus;
+
+ if (wParam == ID_STATUS_ONLINE)
+ wParam = ID_STATUS_ONLINE;
+ else if (wParam == ID_STATUS_OFFLINE)
+ wParam = ID_STATUS_OFFLINE;
+ else
+ wParam = ID_STATUS_ONLINE;
+
+ // broadcast the message
+ bpStatus = wParam;
+
+ ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, wParam);
+
+ // Make sure no contact has offline status for any reason on first time run
+ if (g_plugin.getByte("FirstTime", 100) == 100) {
+ for (auto &hContact : Contacts(MODULENAME))
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+
+ g_plugin.setByte("FirstTime", 1);
+ }
+
+ g_plugin.setByte(OFFLINE_STATUS, bpStatus == ID_STATUS_OFFLINE);
+ return 0;
+}
+
+//=======================================================
+// GetStatus
+// =======================================================
+
+INT_PTR GetStatus(WPARAM, LPARAM)
+{
+ if (bpStatus == ID_STATUS_ONLINE)
+ return ID_STATUS_ONLINE;
+ if (bpStatus == ID_STATUS_AWAY)
+ return ID_STATUS_AWAY;
+ if (bpStatus == ID_STATUS_NA)
+ return ID_STATUS_NA;
+ if (bpStatus == ID_STATUS_OCCUPIED)
+ return ID_STATUS_OCCUPIED;
+ if (bpStatus == ID_STATUS_DND)
+ return ID_STATUS_DND;
+ return ID_STATUS_OFFLINE;
+}
+
+//=======================================================
+// BPLoadIcon
+// =======================================================
+
+INT_PTR BPLoadIcon(WPARAM wParam, LPARAM)
+{
+ UINT id;
+
+ switch (wParam & 0xFFFF) {
+ case PLI_PROTOCOL:
+ id = IDI_SITE;
+ break;
+ default:
+ return 0;
+ }
+ return (INT_PTR)LoadImage(g_plugin.getInst(), MAKEINTRESOURCE(id), IMAGE_ICON,
+ GetSystemMetrics(wParam & PLIF_SMALL ? SM_CXSMICON : SM_CXICON),
+ GetSystemMetrics(wParam & PLIF_SMALL ? SM_CYSMICON : SM_CYICON), 0);
+}
+
+/*****************************************************************************/
+static void __cdecl BasicSearchTimerProc(wchar_t *pszNick)
+{
+ PROTOSEARCHRESULT psr = { sizeof(psr) };
+ psr.flags = PSR_UNICODE;
+ psr.nick.w = pszNick;
+
+ // broadcast the search result
+ ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)1, (LPARAM)&psr);
+ ProtoBroadcastAck(MODULENAME, NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
+
+ // exit the search
+ searchId = -1;
+ mir_free(pszNick);
+}
+
+INT_PTR BasicSearch(WPARAM, LPARAM lParam)
+{
+ if (searchId != -1)
+ return 0; // only one search at a time
+
+ searchId = 1;
+
+ // create a thread for the ID search
+ mir_forkThread<wchar_t>(BasicSearchTimerProc, mir_wstrdup((const wchar_t*)lParam));
+ return searchId;
+}
+
+/*****************************************************************************/
+INT_PTR AddToList(WPARAM, LPARAM lParam)
+{
+ PROTOSEARCHRESULT *psr = (PROTOSEARCHRESULT *)lParam;
+ DBVARIANT dbv;
+ int sameurl = 0;
+ int samename = 0;
+
+ if (psr == nullptr)
+ return 0;
+ if (psr->nick.w == nullptr) {
+ WErrorPopup((UINT_PTR)"ERROR", TranslateT("Please select site in Find/Add contacts..."));
+ return 0;
+ }
+ // if contact with the same ID was not found, add it
+ if (psr->cbSize != sizeof(PROTOSEARCHRESULT))
+ return NULL;
+ // search for existing contact
+ for (auto &hContact : Contacts(MODULENAME)) {
+ // check ID to see if the contact already exist in the database
+ if (g_plugin.getWString(hContact, "URL", &dbv))
+ continue;
+ if (!mir_wstrcmpi(psr->nick.w, dbv.pwszVal)) {
+ // remove the flag for not on list and hidden, thus make the
+ // contact visible
+ // and add them on the list
+ sameurl++;
+ if (db_get_b(hContact, "CList", "NotOnList", 1)) {
+ db_unset(hContact, "CList", "NotOnList");
+ db_unset(hContact, "CList", "Hidden");
+ }
+ }
+ db_free(&dbv);
+ }
+
+ MCONTACT hContact = db_add_contact();
+ Proto_AddToContact(hContact, MODULENAME);
+
+ /////////write to db
+ g_plugin.setByte(hContact, ON_TOP_KEY, 0);
+ g_plugin.setByte(hContact, DBLE_WIN_KEY, 1);
+ g_plugin.setString(hContact, END_STRING_KEY, "");
+ g_plugin.setByte(hContact, RWSPACE_KEY, 1);
+
+ //Convert url into a name for contact
+ wchar_t Cnick[255];
+ if (psr->nick.w != nullptr)
+ wcsncpy(Cnick, psr->nick.w, _countof(Cnick));
+ else
+ Cnick[0] = 0;
+
+ wchar_t *Oldnick = wcsstr(Cnick, L"://");
+ if (Oldnick != nullptr)
+ Oldnick += 3;
+ else
+ Oldnick = Cnick;
+
+ wchar_t *Newnick = wcsstr(Oldnick, L"www.");
+ if (Newnick != nullptr)
+ Newnick += 4;
+ else {
+ Newnick = wcsstr(Oldnick, L"WWW.");
+ if (Newnick != nullptr)
+ Newnick += 4;
+ else
+ Newnick = Oldnick;
+ }
+
+ wchar_t *Nend = wcschr(Newnick, '.');
+ if (Nend) *Nend = '\0';
+
+ for (auto &hContact2 : Contacts(MODULENAME)) {
+ if (!db_get_ws(hContact2, MODULENAME, PRESERVE_NAME_KEY, &dbv)) {
+ if (!mir_wstrcmpi(Newnick, dbv.pwszVal)) {
+ // remove the flag for not on list and hidden, thus make the
+ // contact visible
+ // and add them on the list
+ samename++;
+ if (db_get_b(hContact2, "CList", "NotOnList", 1)) {
+ db_unset(hContact2, "CList", "NotOnList");
+ db_unset(hContact2, "CList", "Hidden");
+ }
+ db_free(&dbv);
+ }
+ }
+ db_free(&dbv);
+ }
+
+ if ((sameurl > 0) || (samename > 0)) // contact has the same url or name as another contact, add rand num to name
+ {
+ srand((unsigned)time(0));
+
+ wchar_t ranStr[10];
+ _itow((int)10000 * rand() / (RAND_MAX + 1.0), ranStr, 10);
+ mir_wstrcat(Newnick, ranStr);
+ }
+ //end convert
+
+ db_set_ws(hContact, "CList", "MyHandle", Newnick);
+ g_plugin.setWString(hContact, PRESERVE_NAME_KEY, Newnick);
+ g_plugin.setWString(hContact, "Nick", Newnick);
+ g_plugin.setByte(hContact, CLEAR_DISPLAY_KEY, 1);
+ g_plugin.setString(hContact, START_STRING_KEY, "");
+ g_plugin.setWString(hContact, URL_KEY, psr->nick.w);
+ g_plugin.setWString(hContact, "Homepage", psr->nick.w);
+ g_plugin.setByte(hContact, U_ALLSITE_KEY, 1);
+ g_plugin.setWord(hContact, "Status", ID_STATUS_ONLINE);
+
+ // ignore status change
+ db_set_dw(hContact, "Ignore", "Mask", 8);
+
+ Sleep(2);
+
+ db_free(&dbv);
+
+
+ return (INT_PTR)hContact;
+}
+
+/*****************************************************************************/
+
+static void __cdecl AckFunc(void*)
+{
+ for (auto &hContact : Contacts(MODULENAME))
+ ProtoBroadcastAck(MODULENAME, hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0);
+}
+
+INT_PTR GetInfo(WPARAM, LPARAM)
+{
+ mir_forkthread(AckFunc);
+ return 1;
+}