summaryrefslogtreecommitdiff
path: root/protocols/Tlen/src/tlen_presence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Tlen/src/tlen_presence.cpp')
-rw-r--r--protocols/Tlen/src/tlen_presence.cpp341
1 files changed, 0 insertions, 341 deletions
diff --git a/protocols/Tlen/src/tlen_presence.cpp b/protocols/Tlen/src/tlen_presence.cpp
deleted file mode 100644
index 3e12761582..0000000000
--- a/protocols/Tlen/src/tlen_presence.cpp
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
-
-Tlen Protocol Plugin for Miranda NG
-Copyright (C) 2002-2004 Santithorn Bunchua
-Copyright (C) 2004-2009 Piotr Piastucki
-
-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 "tlen_list.h"
-#include "tlen_avatar.h"
-
-void TlenProcessPresence(XmlNode *node, TlenProtocol *proto)
-{
- MCONTACT hContact;
- XmlNode *showNode, *statusNode;
- TLEN_LIST_ITEM *item;
- char *from, *type, *nick, *show;
- int status, laststatus = ID_STATUS_OFFLINE;
- char *p;
-
- if ((from=TlenXmlGetAttrValue(node, "from")) != nullptr) {
- if (TlenListExist(proto, LIST_CHATROOM, from)); //TlenGroupchatProcessPresence(node, userdata);
-
- else {
- type = TlenXmlGetAttrValue(node, "type");
- item = TlenListGetItemPtr(proto, LIST_ROSTER, from);
- if (item != nullptr) {
- if (proto->tlenOptions.enableAvatars) {
- TlenProcessPresenceAvatar(proto, node, item);
- }
- }
- if (type == nullptr || (!mir_strcmp(type, "available"))) {
- if ((nick=TlenLocalNickFromJID(from)) != nullptr) {
- if ((hContact=TlenHContactFromJID(proto, from)) == NULL)
- hContact = TlenDBCreateContact(proto, from, nick, FALSE);
- if (!TlenListExist(proto, LIST_ROSTER, from)) {
- proto->debugLogA("Receive presence online from %s (who is not in my roster)", from);
- TlenListAdd(proto, LIST_ROSTER, from);
- }
- status = ID_STATUS_ONLINE;
- if ((showNode=TlenXmlGetChild(node, "show")) != nullptr) {
- if ((show=showNode->text) != nullptr) {
- if (!mir_strcmp(show, "away")) status = ID_STATUS_AWAY;
- else if (!mir_strcmp(show, "xa")) status = ID_STATUS_NA;
- else if (!mir_strcmp(show, "dnd")) status = ID_STATUS_DND;
- else if (!mir_strcmp(show, "chat")) status = ID_STATUS_FREECHAT;
- else if (!mir_strcmp(show, "unavailable")) {
- // Always show invisible (on old Tlen client) as invisible (not offline)
- status = ID_STATUS_OFFLINE;
- }
- }
- }
-
- statusNode = TlenXmlGetChild(node, "status");
- if (statusNode)
- p = TlenTextDecode(statusNode->text);
- else
- p = nullptr;
- TlenListAddResource(proto, LIST_ROSTER, from, status, statusNode?p:nullptr);
- if (p != nullptr && *p) {
- char* statusMsg_utf8 = mir_utf8encode(p);
- db_set_utf(hContact, "CList", "StatusMsg", statusMsg_utf8);
- mir_free(statusMsg_utf8);
- mir_free(p);
- } else {
- db_unset(hContact, "CList", "StatusMsg");
- }
- // Determine status to show for the contact and request version information
- if (item != nullptr) {
- laststatus = item->status;
- item->status = status;
- }
- if (strchr(from, '@') != nullptr || db_get_b(NULL, proto->m_szModuleName, "ShowTransport", TRUE) == TRUE) {
- if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != status)
- db_set_w(hContact, proto->m_szModuleName, "Status", (WORD) status);
- }
- if (item != nullptr) {
- if (!item->infoRequested) {
- int iqId = TlenSerialNext(proto);
- item->infoRequested = TRUE;
- TlenSend( proto, "<iq type='get' id='" TLEN_IQID "%d'><query xmlns='jabber:iq:info' to='%s'></query></iq>", iqId, from);
- }
- if (proto->tlenOptions.enableVersion && !item->versionRequested) {
- item->versionRequested = TRUE;
- if (proto->m_iStatus != ID_STATUS_INVISIBLE) {
- TlenSend( proto, "<message to='%s' type='iq'><iq type='get'><query xmlns='jabber:iq:version'/></iq></message>", from );
- }
- }
- }
- proto->debugLogA("%s (%s) online, set contact status to %d", nick, from, status);
- mir_free(nick);
- }
- }
- else if (!mir_strcmp(type, "unavailable")) {
- if (!TlenListExist(proto, LIST_ROSTER, from)) {
- proto->debugLogA("Receive presence offline from %s (who is not in my roster)", from);
- TlenListAdd(proto, LIST_ROSTER, from);
- }
- else {
- TlenListRemoveResource(proto, LIST_ROSTER, from);
- }
- status = ID_STATUS_OFFLINE;
- statusNode = TlenXmlGetChild(node, "status");
- if (statusNode) {
- if (proto->tlenOptions.offlineAsInvisible) {
- status = ID_STATUS_INVISIBLE;
- }
- p = TlenTextDecode(statusNode->text);
- }
- else
- p = nullptr;
- TlenListAddResource(proto, LIST_ROSTER, from, status, p);
- if ((hContact=TlenHContactFromJID(proto, from)) != NULL) {
- if (p != nullptr && *p) {
- char* statusMsg_utf8 = mir_utf8encode(p);
- db_set_utf(hContact, "CList", "StatusMsg", statusMsg_utf8);
- mir_free(statusMsg_utf8);
- mir_free(p);
- } else {
- db_unset(hContact, "CList", "StatusMsg");
- }
- }
- if ((item=TlenListGetItemPtr(proto, LIST_ROSTER, from)) != nullptr) {
- // Determine status to show for the contact based on the remaining resources
- item->status = status;
- item->versionRequested = FALSE;
- item->infoRequested = FALSE;
- }
- if ((hContact=TlenHContactFromJID(proto, from)) != NULL) {
- if (strchr(from, '@') != nullptr || db_get_b(NULL, proto->m_szModuleName, "ShowTransport", TRUE) == TRUE) {
- if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != status)
- db_set_w(hContact, proto->m_szModuleName, "Status", (WORD) status);
- }
- if (item != nullptr && item->isTyping) {
- item->isTyping = FALSE;
- CallService(MS_PROTO_CONTACTISTYPING, hContact, PROTOTYPE_CONTACTTYPING_OFF);
- }
- proto->debugLogA("%s offline, set contact status to %d", from, status);
- }
- }
- else if (!mir_strcmp(type, "subscribe")) {
- if (strchr(from, '@') == nullptr) {
- // automatically send authorization allowed to agent/transport
- TlenSend(proto, "<presence to='%s' type='subscribed'/>", from);
- }
- else if ((nick=TlenNickFromJID(from)) != nullptr) {
- proto->debugLogA("%s (%s) requests authorization", nick, from);
- TlenDBAddAuthRequest(proto, from, nick);
- mir_free(nick);
- }
- }
- else if (!mir_strcmp(type, "subscribed")) {
- if ((item=TlenListGetItemPtr(proto, LIST_ROSTER, from)) != nullptr) {
- if (item->subscription == SUB_FROM) item->subscription = SUB_BOTH;
- else if (item->subscription == SUB_NONE) {
- item->subscription = SUB_TO;
- }
- }
- }
- }
- }
-}
-
-/* change status and status msg on own contact on contact list (if present) */
-void setOwnStatusOnCList(TlenProtocol *proto, int status, char *statusMsg)
-{
- ptrA ownJid(db_get_sa(NULL, proto->m_szModuleName, "jid"));
- MCONTACT hContact = TlenHContactFromJID(proto, ownJid);
- if(hContact){
- if (db_get_w(hContact, proto->m_szModuleName, "Status", ID_STATUS_OFFLINE) != status)
- db_set_w(hContact, proto->m_szModuleName, "Status", (WORD)status);
- if (statusMsg != nullptr && *statusMsg) {
- char* statusMsg_utf8 = mir_utf8encode(statusMsg);
- db_set_utf(hContact, "CList", "StatusMsg", statusMsg_utf8);
- mir_free(statusMsg_utf8);
- } else {
- db_unset(hContact, "CList", "StatusMsg");
- }
- }
-}
-
-static void TlenSendPresenceTo(TlenProtocol *proto, int status, char*)
-{
- char *showBody, *statusMsg, *presenceType;
- char *ptr = nullptr;
-
- if (!proto->isOnline) return;
-
- // Send <presence/> update for status (we won't handle ID_STATUS_OFFLINE here)
- // Note: tlenModeMsg is already encoded using TlenTextEncode()
- mir_cslock lck(proto->modeMsgMutex);
-
- showBody = nullptr;
- statusMsg = nullptr;
- presenceType = nullptr;
- switch (status) {
- case ID_STATUS_ONLINE:
- showBody = "available";
- statusMsg = proto->modeMsgs.szOnline;
- break;
- case ID_STATUS_AWAY:
- case ID_STATUS_ONTHEPHONE:
- case ID_STATUS_OUTTOLUNCH:
- showBody = "away";
- statusMsg = proto->modeMsgs.szAway;
- break;
- case ID_STATUS_NA:
- showBody = "xa";
- statusMsg = proto->modeMsgs.szNa;
- break;
- case ID_STATUS_DND:
- case ID_STATUS_OCCUPIED:
- showBody = "dnd";
- statusMsg = proto->modeMsgs.szDnd;
- break;
- case ID_STATUS_FREECHAT:
- showBody = "chat";
- statusMsg = proto->modeMsgs.szFreechat;
- break;
- case ID_STATUS_INVISIBLE:
- presenceType = "invisible";
- statusMsg = proto->modeMsgs.szInvisible;
- break;
- case ID_STATUS_OFFLINE:
- presenceType = "unavailable";
- if (db_get_b(NULL, proto->m_szModuleName, "LeaveOfflineMessage", FALSE)) {
- int offlineMessageOption = db_get_w(NULL, proto->m_szModuleName, "OfflineMessageOption", 0);
- if (offlineMessageOption == 0) {
- switch (proto->m_iStatus) {
- case ID_STATUS_ONLINE:
- ptr = mir_strdup(proto->modeMsgs.szOnline);
- break;
- case ID_STATUS_AWAY:
- case ID_STATUS_ONTHEPHONE:
- case ID_STATUS_OUTTOLUNCH:
- ptr = mir_strdup(proto->modeMsgs.szAway);
- break;
- case ID_STATUS_NA:
- ptr = mir_strdup(proto->modeMsgs.szNa);
- break;
- case ID_STATUS_DND:
- case ID_STATUS_OCCUPIED:
- ptr = mir_strdup(proto->modeMsgs.szDnd);
- break;
- case ID_STATUS_FREECHAT:
- ptr = mir_strdup(proto->modeMsgs.szFreechat);
- break;
- case ID_STATUS_INVISIBLE:
- ptr = mir_strdup(proto->modeMsgs.szInvisible);
- break;
- }
- } else if (offlineMessageOption == 99) {
-
- } else if (offlineMessageOption < 7) {
- DBVARIANT dbv;
- const char *statusNames[] = {"OnDefault", "AwayDefault", "NaDefault", "DndDefault", "FreeChatDefault", "InvDefault"};
- if (!db_get(NULL, "SRAway", statusNames[offlineMessageOption-1], &dbv)) {
- int i;
- char substituteStr[128];
- ptr = mir_strdup(dbv.pszVal);
- db_free(&dbv);
- for (i=0;ptr[i];i++) {
- if (ptr[i] != '%') continue;
- if (!_strnicmp(ptr+i,"%time%",6))
- GetTimeFormatA(LOCALE_USER_DEFAULT,TIME_NOSECONDS,nullptr,nullptr,substituteStr,sizeof(substituteStr));
- else if (!_strnicmp(ptr+i,"%date%",6))
- GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,nullptr,nullptr,substituteStr,sizeof(substituteStr));
- else continue;
- if (mir_strlen(substituteStr)>6) ptr=(char*)mir_realloc(ptr,mir_strlen(ptr)+1+mir_strlen(substituteStr)-6);
- memmove(ptr+i+mir_strlen(substituteStr),ptr+i+6,mir_strlen(ptr)-i-5);
- memcpy(ptr+i,substituteStr,mir_strlen(substituteStr));
- }
- }
- }
- }
- mir_free(statusMsg);
- statusMsg = ptr;
- break;
- default:
- // Should not reach here
- break;
- }
- proto->m_iStatus = status;
- if (presenceType) {
- if (statusMsg != nullptr && *statusMsg)
- TlenSend(proto, "<presence type='%s'><status>%s</status></presence>", presenceType, ptrA(TlenTextEncode(statusMsg)));
- else
- TlenSend(proto, "<presence type='%s'></presence>", presenceType);
- } else {
- if (statusMsg != nullptr && *statusMsg)
- TlenSend(proto, "<presence><show>%s</show><status>%s</status></presence>", showBody, ptrA(TlenTextEncode(statusMsg)));
- else
- TlenSend(proto, "<presence><show>%s</show></presence>", showBody);
- }
-
- setOwnStatusOnCList(proto, proto->m_iStatus, statusMsg);
-}
-
-
-
-void TlenSendPresence(TlenProtocol *proto, int statusIn)
-{
- int statusOut;
- switch (statusIn) {
- case ID_STATUS_ONLINE:
- case ID_STATUS_OFFLINE:
- case ID_STATUS_NA:
- case ID_STATUS_FREECHAT:
- case ID_STATUS_INVISIBLE:
- statusOut = statusIn;
- break;
- case ID_STATUS_AWAY:
- case ID_STATUS_ONTHEPHONE:
- case ID_STATUS_OUTTOLUNCH:
- default:
- statusOut = ID_STATUS_AWAY;
- break;
- case ID_STATUS_DND:
- case ID_STATUS_OCCUPIED:
- statusOut = ID_STATUS_DND;
- break;
- }
- TlenSendPresenceTo(proto, statusOut, nullptr);
-}
-
-