From 4649bcfc2b1cbbe2f004d7bec963a7528866c072 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 15 Jul 2012 16:44:52 +0000 Subject: =?UTF-8?q?z=20ca=C5=82ym=20szacunkiem=20dla=20naszych=20polskich?= =?UTF-8?q?=20u=C5=BCytkownik=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.miranda-ng.org/main/trunk@977 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Gadu-Gadu/services.cpp | 330 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 protocols/Gadu-Gadu/services.cpp (limited to 'protocols/Gadu-Gadu/services.cpp') diff --git a/protocols/Gadu-Gadu/services.cpp b/protocols/Gadu-Gadu/services.cpp new file mode 100644 index 0000000000..921553fadb --- /dev/null +++ b/protocols/Gadu-Gadu/services.cpp @@ -0,0 +1,330 @@ +//////////////////////////////////////////////////////////////////////////////// +// Gadu-Gadu Plugin for Miranda IM +// +// Copyright (c) 2003-2009 Adam Strzelecki +// Copyright (c) 2009-2012 Bartosz Białek +// +// 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 "gg.h" +#include + +////////////////////////////////////////////////////////// +// Status mode -> DB +char *gg_status2db(int status, const char *suffix) +{ + char *prefix; + static char str[64]; + + switch(status) { + case ID_STATUS_AWAY: prefix = "Away"; break; + case ID_STATUS_NA: prefix = "Na"; break; + case ID_STATUS_DND: prefix = "Dnd"; break; + case ID_STATUS_OCCUPIED: prefix = "Occupied"; break; + case ID_STATUS_FREECHAT: prefix = "FreeChat"; break; + case ID_STATUS_ONLINE: prefix = "On"; break; + case ID_STATUS_OFFLINE: prefix = "Off"; break; + case ID_STATUS_INVISIBLE: prefix = "Inv"; break; + case ID_STATUS_ONTHEPHONE: prefix = "Otp"; break; + case ID_STATUS_OUTTOLUNCH: prefix = "Otl"; break; + default: return NULL; + } + strncpy(str, prefix, sizeof(str)); + strncat(str, suffix, sizeof(str) - strlen(str)); + return str; +} + +////////////////////////////////////////////////////////// +// gets protocol status + +char* GGPROTO::getstatusmsg(int status) +{ + switch(status) { + case ID_STATUS_ONLINE: + return modemsg.online; + break; + case ID_STATUS_DND: + return modemsg.dnd; + break; + case ID_STATUS_FREECHAT: + return modemsg.freechat; + break; + case ID_STATUS_INVISIBLE: + return modemsg.invisible; + break; + case ID_STATUS_AWAY: + default: + return modemsg.away; + } +} + +////////////////////////////////////////////////////////// +// sets specified protocol status + +int GGPROTO::refreshstatus(int status) +{ + if (status == ID_STATUS_OFFLINE) + { + disconnect(); + return TRUE; + } + + if (!isonline()) + { + DWORD exitCode = 0; + GetExitCodeThread(pth_sess.hThread, &exitCode); + if (exitCode == STILL_ACTIVE) + return TRUE; +#ifdef DEBUGMODE + netlog("gg_refreshstatus(): Going to connect..."); +#endif + threadwait(&pth_sess); + pth_sess.hThread = forkthreadex(&GGPROTO::mainthread, NULL, &pth_sess.dwThreadId); + } + else + { + char *szMsg = NULL; + // Select proper msg + EnterCriticalSection(&modemsg_mutex); + szMsg = mir_strdup(getstatusmsg(status)); + LeaveCriticalSection(&modemsg_mutex); + if (szMsg) + { + netlog("gg_refreshstatus(): Setting status and away message."); + EnterCriticalSection(&sess_mutex); + gg_change_status_descr(sess, status_m2gg(status, szMsg != NULL), szMsg); + LeaveCriticalSection(&sess_mutex); + } + else + { + netlog("gg_refreshstatus(): Setting just status."); + EnterCriticalSection(&sess_mutex); + gg_change_status(sess, status_m2gg(status, 0)); + LeaveCriticalSection(&sess_mutex); + } + // Change status of the contact with our own UIN (if got yourself added to the contact list) + changecontactstatus(db_get_b(NULL, m_szModuleName, GG_KEY_UIN, 0), status_m2gg(status, szMsg != NULL), szMsg, 0, 0, 0, 0); + broadcastnewstatus(status); + mir_free(szMsg); + } + + return TRUE; +} + +////////////////////////////////////////////////////////// +// normalize gg status + +int gg_normalizestatus(int status) +{ + switch(status) { + case ID_STATUS_ONLINE: return ID_STATUS_ONLINE; + case ID_STATUS_DND: return ID_STATUS_DND; + case ID_STATUS_FREECHAT: return ID_STATUS_FREECHAT; + case ID_STATUS_OFFLINE: return ID_STATUS_OFFLINE; + case ID_STATUS_INVISIBLE: return ID_STATUS_INVISIBLE; + } + return ID_STATUS_AWAY; +} + +////////////////////////////////////////////////////////// +// gets avatar capabilities + +INT_PTR GGPROTO::getavatarcaps(WPARAM wParam, LPARAM lParam) +{ + switch (wParam) { + case AF_MAXSIZE: + ((POINT *)lParam)->x = ((POINT *)lParam)->y = 200; + return 0; + case AF_FORMATSUPPORTED: + return (lParam == PA_FORMAT_JPEG || lParam == PA_FORMAT_GIF || lParam == PA_FORMAT_PNG); + case AF_ENABLED: + return db_get_b(NULL, m_szModuleName, GG_KEY_ENABLEAVATARS, GG_KEYDEF_ENABLEAVATARS); + case AF_DONTNEEDDELAYS: + return 1; + case AF_MAXFILESIZE: + return 307200; + case AF_FETCHALWAYS: + return 1; + } + return 0; +} + +////////////////////////////////////////////////////////// +// gets avatar information + +INT_PTR GGPROTO::getavatarinfo(WPARAM wParam, LPARAM lParam) +{ + PROTO_AVATAR_INFORMATIONT *pai = (PROTO_AVATAR_INFORMATIONT *)lParam; + char *AvatarHash = NULL, *AvatarSavedHash = NULL; + char *AvatarURL = NULL; + INT_PTR result = GAIR_NOAVATAR; + DBVARIANT dbv; + uin_t uin = (uin_t)db_get_b(pai->hContact, m_szModuleName, GG_KEY_UIN, 0); + + netlog("gg_getavatarinfo(): Requesting avatar information for %d.", uin); + + pai->filename[0] = 0; + pai->format = PA_FORMAT_UNKNOWN; + + if (!uin || !db_get_b(NULL, m_szModuleName, GG_KEY_ENABLEAVATARS, GG_KEYDEF_ENABLEAVATARS)) + return GAIR_NOAVATAR; + + if (!db_get_b(pai->hContact, m_szModuleName, GG_KEY_AVATARREQUESTED, GG_KEYDEF_AVATARREQUESTED)) { + requestAvatar(pai->hContact, 1); + return (wParam & GAIF_FORCE) != 0 ? GAIR_WAITFOR : GAIR_NOAVATAR; + } + db_unset(pai->hContact, m_szModuleName, GG_KEY_AVATARREQUESTED); + + pai->format = db_get_b(pai->hContact, m_szModuleName, GG_KEY_AVATARTYPE, GG_KEYDEF_AVATARTYPE); + + if (!db_get_s(pai->hContact, m_szModuleName, GG_KEY_AVATARURL, &dbv, DBVT_ASCIIZ)) { + AvatarURL = mir_strdup(dbv.pszVal); + DBFreeVariant(&dbv); + } + + if (AvatarURL != NULL && strlen(AvatarURL) > 0) { + char *AvatarName = strrchr(AvatarURL, '/'); + AvatarName++; + AvatarHash = gg_avatarhash(AvatarName); + } + + if (!db_get_s(pai->hContact, m_szModuleName, GG_KEY_AVATARHASH, &dbv, DBVT_ASCIIZ)) { + AvatarSavedHash = mir_strdup(dbv.pszVal); + DBFreeVariant(&dbv); + } + + if (AvatarHash != NULL && AvatarSavedHash != NULL) { + getAvatarFilename(pai->hContact, pai->filename, SIZEOF(pai->filename)); + if (!strcmp(AvatarHash, AvatarSavedHash) && !_taccess(pai->filename, 0)) { + result = GAIR_SUCCESS; + } + else if ((wParam & GAIF_FORCE) != 0) { + netlog("gg_getavatarinfo(): Contact %d changed avatar.", uin); + _tremove(pai->filename); + db_set_s(pai->hContact, m_szModuleName, GG_KEY_AVATARHASH, AvatarHash); + getAvatar(pai->hContact, AvatarURL); + result = GAIR_WAITFOR; + } + } + else if ((wParam & GAIF_FORCE) != 0) { + if (AvatarHash == NULL && AvatarSavedHash != NULL) { + netlog("gg_getavatarinfo(): Contact %d deleted avatar.", uin); + getAvatarFilename(pai->hContact, pai->filename, sizeof(pai->filename)); + _tremove(pai->filename); + db_unset(pai->hContact, m_szModuleName, GG_KEY_AVATARHASH); + db_unset(pai->hContact, m_szModuleName, GG_KEY_AVATARURL); + db_unset(pai->hContact, m_szModuleName, GG_KEY_AVATARTYPE); + } + else if (AvatarHash != NULL && AvatarSavedHash == NULL) { + netlog("gg_getavatarinfo(): Contact %d set avatar.", uin); + db_set_s(pai->hContact, m_szModuleName, GG_KEY_AVATARHASH, AvatarHash); + getAvatar(pai->hContact, AvatarURL); + result = GAIR_WAITFOR; + } + } + + mir_free(AvatarHash); + mir_free(AvatarSavedHash); + mir_free(AvatarURL); + + return result; +} + +////////////////////////////////////////////////////////// +// gets avatar + +INT_PTR GGPROTO::getmyavatar(WPARAM wParam, LPARAM lParam) +{ + TCHAR *szFilename = (TCHAR*)wParam; + int len = (int)lParam; + + netlog("gg_getmyavatar(): Requesting user avatar."); + + if (szFilename == NULL || len <= 0) + return -1; + + if (!db_get_b(NULL, m_szModuleName, GG_KEY_ENABLEAVATARS, GG_KEYDEF_ENABLEAVATARS)) + return -2; + + getAvatarFilename(NULL, szFilename, len); + return _taccess(szFilename, 0); +} + +////////////////////////////////////////////////////////// +// sets avatar + +INT_PTR GGPROTO::setmyavatar(WPARAM wParam, LPARAM lParam) +{ + TCHAR *szFilename = (TCHAR*)lParam; + + if (!db_get_b(NULL, m_szModuleName, GG_KEY_ENABLEAVATARS, GG_KEYDEF_ENABLEAVATARS)) + return -2; + + if (szFilename == NULL) { + MessageBox(NULL, + TranslateT("To remove your Gadu-Gadu avatar, you must use the MojaGeneracja.pl website."), + m_tszUserName, MB_OK | MB_ICONINFORMATION); + return -1; + } + + TCHAR szMyFilename[MAX_PATH]; + getAvatarFilename(NULL, szMyFilename, SIZEOF(szMyFilename)); + if ( _tcscmp(szFilename, szMyFilename) && !CopyFile(szFilename, szMyFilename, FALSE)) { + netlog("gg_setmyavatar(): Failed to set user avatar. File %s could not be created/overwritten.", szMyFilename); + return -1; + } + + setAvatar(szMyFilename); + return 0; +} + +////////////////////////////////////////////////////////// +// gets protocol status message + +INT_PTR GGPROTO::getmyawaymsg(WPARAM wParam, LPARAM lParam) +{ + INT_PTR res = 0; + char *szMsg; + + EnterCriticalSection(&modemsg_mutex); + szMsg = getstatusmsg(wParam ? gg_normalizestatus(wParam) : m_iStatus); + if (isonline() && szMsg) + res = (lParam & SGMA_UNICODE) ? (INT_PTR)mir_a2u(szMsg) : (INT_PTR)mir_strdup(szMsg); + LeaveCriticalSection(&modemsg_mutex); + return res; +} + +////////////////////////////////////////////////////////// +// gets account manager GUI + +extern INT_PTR CALLBACK gg_acc_mgr_guidlgproc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +INT_PTR GGPROTO::get_acc_mgr_gui(WPARAM wParam, LPARAM lParam) +{ + return (INT_PTR) CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_ACCMGRUI), (HWND)lParam, gg_acc_mgr_guidlgproc, (LPARAM)this); +} + +////////////////////////////////////////////////////////// +// leaves (terminates) conference + +INT_PTR GGPROTO::leavechat(WPARAM wParam, LPARAM lParam) +{ + HANDLE hContact = (HANDLE)wParam; + if (hContact) + CallService(MS_DB_CONTACT_DELETE, (WPARAM)hContact, 0); + + return 0; +} -- cgit v1.2.3