summaryrefslogtreecommitdiff
path: root/MySpace/proto.cpp
diff options
context:
space:
mode:
authorsje <sje@4f64403b-2f21-0410-a795-97e2b3489a10>2007-07-09 16:27:12 +0000
committersje <sje@4f64403b-2f21-0410-a795-97e2b3489a10>2007-07-09 16:27:12 +0000
commit92916d3d9d67abf583b875486d54b1c20ad5883f (patch)
tree02bb5eb09274a73717dffac3120864eb9e3ea3ac /MySpace/proto.cpp
parent68368a3478231511990298a666289c920319206e (diff)
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
Diffstat (limited to 'MySpace/proto.cpp')
-rw-r--r--MySpace/proto.cpp99
1 files changed, 64 insertions, 35 deletions
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, "<p><f f='Times' h='16'><c v='black'><b v='white'>%s</b></c></f></p>", 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, "<p><f f='Times' h='16'><c v='black'><b v='white'>%s</b></c></f></p>", 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() {