From 92916d3d9d67abf583b875486d54b1c20ad5883f Mon Sep 17 00:00:00 2001 From: sje Date: Mon, 9 Jul 2007 16:27:12 +0000 Subject: fix for 'add permanently to list' functions limit max message length 'correctly' (thx Jeff) git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@262 4f64403b-2f21-0410-a795-97e2b3489a10 --- MySpace/proto.cpp | 99 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 35 deletions(-) (limited to 'MySpace/proto.cpp') diff --git a/MySpace/proto.cpp b/MySpace/proto.cpp index 31517e2..9dc0815 100644 --- a/MySpace/proto.cpp +++ b/MySpace/proto.cpp @@ -24,7 +24,7 @@ int GetCaps(WPARAM wParam,LPARAM lParam) { ret = PF2_ONLINE | PF2_SHORTAWAY | PF2_INVISIBLE; break; case PFLAGNUM_4: - ret = PF4_SUPPORTTYPING | PF4_AVATARS; + ret = PF4_SUPPORTTYPING | PF4_AVATARS | PF4_SUPPORTIDLE | PF4_IMSENDUTF; break; case PFLAGNUM_5: //ret = PF2_INVISIBLE; @@ -109,7 +109,7 @@ void __cdecl sttFakeAckMessageFailed(void *param) { int ProtoSendMessage(WPARAM wParam, LPARAM lParam) { CCSDATA *ccs = (CCSDATA *) lParam; char *message = (char *)ccs->lParam; - char msg_utf[MAX_MESSAGE_SIZE], msg_fmt[MAX_MESSAGE_SIZE]; + char msg_utf[MAX_MESSAGE_SIZE + 1], msg_fmt[MAX_MESSAGE_SIZE + 128]; int uid; if((uid = DBGetContactSettingDword(ccs->hContact, MODULE, "UID", 0)) == 0 || status == ID_STATUS_OFFLINE) { @@ -118,18 +118,19 @@ int ProtoSendMessage(WPARAM wParam, LPARAM lParam) { } // TODO: process 'message' and/or 'messagew' below - if(ccs->wParam & PREF_UNICODE) { + if(ccs->wParam & PREF_UTF) { + strncpy(msg_utf, message, MAX_MESSAGE_SIZE); + } else if(ccs->wParam & PREF_UNICODE) { wchar_t *messagew = (wchar_t *)&message[strlen(message)+1]; WideCharToMultiByte(CP_UTF8, 0, messagew, -1, msg_utf, MAX_MESSAGE_SIZE, 0, 0); } else { - //} else if(ccs->wParam & PREF_UTF) { strncpy(msg_utf, message, MAX_MESSAGE_SIZE); } - msg_utf[MAX_MESSAGE_SIZE-1] = 0; + msg_utf[MAX_MESSAGE_SIZE] = 0; - entitize_xml(msg_utf, MAX_MESSAGE_SIZE); - encode_smileys(msg_utf, MAX_MESSAGE_SIZE); - mir_snprintf(msg_fmt, MAX_MESSAGE_SIZE, "

%s

", msg_utf); + entitize_xml(msg_utf, MAX_MESSAGE_SIZE + 1); + encode_smileys(msg_utf, MAX_MESSAGE_SIZE + 1); + mir_snprintf(msg_fmt, MAX_MESSAGE_SIZE + 1, "

%s

", msg_utf); ClientNetMessage msg; msg.add_int("bm", 1); @@ -387,32 +388,34 @@ int ContactDeleted(WPARAM wParam, LPARAM lParam) { HANDLE hContact = (HANDLE)wParam; int uid = DBGetContactSettingDword(hContact, MODULE, "UID", 0); if(uid) { - ClientNetMessage msg_del; - msg_del.add_string("delbuddy", ""); - msg_del.add_int("sesskey", sesskey); - msg_del.add_int("delprofileid", uid); - SendMessage(msg_del); - - ClientNetMessage msg_persist; - msg_persist.add_int("persist", 1); - msg_persist.add_int("sesskey", sesskey); - msg_persist.add_int("cmd", 515); - msg_persist.add_int("dsn", 0); - msg_persist.add_int("uid", DBGetContactSettingDword(0, MODULE, "UID", 0)); - msg_persist.add_int("lid", 8); - msg_persist.add_int("rid", req_id++); - char body[1024]; - mir_snprintf(body, 1024, "ContactID=%d", uid); - msg_persist.add_string("body", body); - SendMessage(msg_persist); - - ClientNetMessage msg_block; - msg_block.add_string("blocklist", ""); - msg_block.add_int("sesskey", sesskey); - char idlist[1024]; - mir_snprintf(idlist, 1024, "a-|%d|b-|%d", uid, uid); - msg_block.add_string("idlist", idlist); - SendMessage(msg_block); + if(DBGetContactSettingByte(hContact, "CList", "NotOnList", 0) == 0) { + ClientNetMessage msg_del; + msg_del.add_string("delbuddy", ""); + msg_del.add_int("sesskey", sesskey); + msg_del.add_int("delprofileid", uid); + SendMessage(msg_del); + + ClientNetMessage msg_persist; + msg_persist.add_int("persist", 1); + msg_persist.add_int("sesskey", sesskey); + msg_persist.add_int("cmd", 515); + msg_persist.add_int("dsn", 0); + msg_persist.add_int("uid", DBGetContactSettingDword(0, MODULE, "UID", 0)); + msg_persist.add_int("lid", 8); + msg_persist.add_int("rid", req_id++); + char body[1024]; + mir_snprintf(body, 1024, "ContactID=%d", uid); + msg_persist.add_string("body", body); + SendMessage(msg_persist); + + ClientNetMessage msg_block; + msg_block.add_string("blocklist", ""); + msg_block.add_int("sesskey", sesskey); + char idlist[1024]; + mir_snprintf(idlist, 1024, "a-|%d|b-|%d", uid, uid); + msg_block.add_string("idlist", idlist); + SendMessage(msg_block); + } } return 0; } @@ -434,10 +437,35 @@ int IdleChanged(WPARAM wParam, LPARAM lParam) { return 0; } +int SettingChanged(WPARAM wParam, LPARAM lParam) { + if(!wParam) return 0; + + DBCONTACTWRITESETTING *dbcws = (DBCONTACTWRITESETTING*)lParam; + if(strcmp(dbcws->szModule, "CList") != 0) return 0; + if(strcmp(dbcws->szSetting, "NotOnList") != 0) return 0; + + if(dbcws->value.type != DBVT_DELETED && dbcws->value.bVal != 0) return 0; + + HANDLE hContact = (HANDLE)wParam; + char *proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if(proto == 0 || strcmp(proto, MODULE) != 0) return 0; + + int uid = DBGetContactSettingDword(hContact, MODULE, "UID", 0); + + ClientNetMessage msg_add; + msg_add.add_string("addbuddy", ""); + msg_add.add_int("sesskey", sesskey); + msg_add.add_int("newprofileid", DBGetContactSettingDword(hContact, MODULE, "UID", 0)); + msg_add.add_string("reason", ""); + + SendMessage(msg_add); + return 0; +} + #define NUM_FILTER_SERVICES 17 HANDLE hServices[NUM_FILTER_SERVICES]; -HANDLE hEventContactDeleted, hEventIdle; +HANDLE hEventContactDeleted, hEventIdle, hEventSettingChanged; void CreateProtoServices() { // create our services int i = 0; @@ -467,6 +495,7 @@ void CreateProtoServices() { hEventContactDeleted = HookEvent(ME_DB_CONTACT_DELETED, ContactDeleted); hEventIdle = HookEvent(ME_IDLE_CHANGED, IdleChanged); + hEventSettingChanged = HookEvent(ME_DB_CONTACT_SETTINGCHANGED, SettingChanged); } void DeinitProto() { -- cgit v1.2.3