From 6ad2fdede0ae25dc0d56b5e45f6b9aa876e93b68 Mon Sep 17 00:00:00 2001 From: sje Date: Tue, 3 Jul 2007 06:26:19 +0000 Subject: don't strip links in tags get avatars! woohoo :) git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@248 4f64403b-2f21-0410-a795-97e2b3489a10 --- MySpace/proto.cpp | 153 +++++++++++++++--------------------------------------- 1 file changed, 42 insertions(+), 111 deletions(-) (limited to 'MySpace/proto.cpp') diff --git a/MySpace/proto.cpp b/MySpace/proto.cpp index c7133a3..48d65ad 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; + ret = PF4_SUPPORTTYPING | PF4_AVATARS; break; case PFLAGNUM_5: //ret = PF2_INVISIBLE; @@ -92,37 +92,18 @@ int GetStatus(WPARAM wParam,LPARAM lParam) { return status; } -typedef struct tag_TFakeAckParams -{ - HANDLE hEvent; - HANDLE hContact; - LPARAM lParam; -} TFakeAckParams; +void __cdecl sttFakeAckMessageSuccess(void *param) { + HANDLE hContact = (HANDLE)param; -static DWORD CALLBACK sttFakeAckMessageSuccess( LPVOID param ) -{ - TFakeAckParams *tParam = ( TFakeAckParams* )param; - WaitForSingleObject( tParam->hEvent, INFINITE ); - - Sleep( 100 ); - ProtoBroadcastAck(MODULE, tParam->hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, ( HANDLE )tParam->lParam, 0 ); - - CloseHandle( tParam->hEvent ); - delete tParam; - return 0; + SleepEx( 10, TRUE ); + ProtoBroadcastAck(MODULE, hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)1, 0 ); } -static DWORD CALLBACK sttFakeAckMessageFailed( LPVOID param ) -{ - TFakeAckParams *tParam = ( TFakeAckParams* )param; - WaitForSingleObject( tParam->hEvent, INFINITE ); +void __cdecl sttFakeAckMessageFailed(void *param) { + HANDLE hContact = (HANDLE)param; - Sleep( 100 ); - ProtoBroadcastAck(MODULE, tParam->hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)FAILED_MESSAGE_HANDLE, tParam->lParam); - - CloseHandle( tParam->hEvent ); - delete tParam; - return 0; + SleepEx( 10, TRUE ); + ProtoBroadcastAck(MODULE, hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)FAILED_MESSAGE_HANDLE, 0); } int ProtoSendMessage(WPARAM wParam, LPARAM lParam) { @@ -132,18 +113,7 @@ int ProtoSendMessage(WPARAM wParam, LPARAM lParam) { int uid; if((uid = DBGetContactSettingDword(ccs->hContact, MODULE, "UID", 0)) == 0 || status == ID_STATUS_OFFLINE) { - HANDLE hEvent; - TFakeAckParams *tfap; - - hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); - - tfap = new TFakeAckParams; - tfap->hContact = ccs->hContact; - tfap->hEvent = hEvent; - tfap->lParam = 0; - - CloseHandle( CreateThread( NULL, 0, sttFakeAckMessageFailed, tfap, 0, 0 )); - SetEvent( hEvent ); + mir_forkthread(sttFakeAckMessageFailed, ccs->hContact); return FAILED_MESSAGE_HANDLE; } @@ -153,7 +123,6 @@ int ProtoSendMessage(WPARAM wParam, LPARAM lParam) { WideCharToMultiByte(CP_UTF8, 0, messagew, -1, msg_utf, MAX_MESSAGE_SIZE, 0, 0); } else { //} else if(ccs->wParam & PREF_UTF) { - // message is utf8 encoded - you can use mir_utf8decode (m_system.h) to make it wide strncpy(msg_utf, message, MAX_MESSAGE_SIZE); } msg_utf[MAX_MESSAGE_SIZE-1] = 0; @@ -171,22 +140,8 @@ int ProtoSendMessage(WPARAM wParam, LPARAM lParam) { msg.add_string("msg", msg_fmt); SendMessage(msg); - HANDLE hEvent; - TFakeAckParams *tfap; - - hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); - - int ret = msg_id++; - - tfap = new TFakeAckParams; - tfap->hContact = ccs->hContact; - tfap->hEvent = hEvent; - tfap->lParam = (LPARAM)ret; - - CloseHandle( CreateThread( NULL, 0, sttFakeAckMessageSuccess, tfap, 0, 0 )); - SetEvent( hEvent ); - - return ret; + mir_forkthread(sttFakeAckMessageSuccess, ccs->hContact); + return 1; } int ProtoSendMessageW(WPARAM wParam, LPARAM lParam) { @@ -325,71 +280,30 @@ int AddToList(WPARAM wParam, LPARAM lParam) { return (int)hContact; } -static DWORD CALLBACK sttRecvAway( LPVOID param ) -{ - TFakeAckParams *tParam = ( TFakeAckParams* )param; - WaitForSingleObject( tParam->hEvent, INFINITE ); - - Sleep( 100 ); +void __cdecl sttRecvAway(void *param) { + HANDLE hContact = (HANDLE)param; DBVARIANT dbv; char buff[512]; buff[0] = 0; - if(!DBGetContactSettingStringUtf(tParam->hContact, MODULE, "StatusMsg", &dbv) && strlen(dbv.pszVal)) { - strncpy(buff, dbv.pszVal, 512); - buff[511] = 0; + if(!DBGetContactSettingStringUtf(hContact, MODULE, "StatusMsg", &dbv) && strlen(dbv.pszVal)) { + mir_snprintf(buff, 512, "%s", dbv.pszVal); DBFreeVariant(&dbv); } - - CCSDATA ccs = {0}; - PROTORECVEVENT pre = {0}; - - ccs.hContact = tParam->hContact; - ccs.szProtoService = PSR_AWAYMSG; - ccs.wParam = 0; - ccs.lParam = (LPARAM)⪯ - - pre.timestamp = (DWORD)time(0); - if(strlen(buff)) - pre.szMessage = buff; - else - pre.szMessage = 0; - - CallService(MS_PROTO_CHAINRECV, 0, (LPARAM)&ccs); - - CloseHandle( tParam->hEvent ); - delete tParam; - return 0; + ProtoBroadcastAck(MODULE, hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, (LPARAM)buff); } int GetAwayMsg(WPARAM wParam, LPARAM lParam) { CCSDATA* ccs = (CCSDATA*)lParam; + if ( ccs == NULL ) + return 0; - HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); - - TFakeAckParams *tfap = new TFakeAckParams; - tfap->hContact = ccs->hContact; - tfap->hEvent = hEvent; - tfap->lParam = 0; - - CloseHandle( CreateThread( NULL, 0, sttRecvAway, tfap, 0, 0 )); - SetEvent( hEvent ); + mir_forkthread(sttRecvAway, ccs->hContact); return 1; } -int RecvAwayMsg(WPARAM wParam, LPARAM lParam) { - CCSDATA* ccs = (CCSDATA*)lParam; - PROTORECVEVENT* pre = (PROTORECVEVENT*)ccs->lParam; - - ProtoBroadcastAck(MODULE, ccs->hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, (LPARAM)pre->szMessage); - - return 0; -} - - - int SetAwayMsg(WPARAM wParam, LPARAM lParam) { int status = (int)wParam; char *msg = (char *)lParam; @@ -418,6 +332,26 @@ int SendTyping(WPARAM wParam, LPARAM lParam) { return 0; } +int GetAvatarInfo(WPARAM wParam,LPARAM lParam) { + if (DBGetContactSettingByte(0, MODULE, "EnableAvatars", 1) == 0) + return GAIR_NOAVATAR; + + PROTO_AVATAR_INFORMATION* AI = ( PROTO_AVATAR_INFORMATION* )lParam; + + DBVARIANT dbv; + if(!DBGetContactSetting(AI->hContact, MODULE, "AvatarFilename", &dbv)) { + strncpy(AI->filename, dbv.pszVal, sizeof(AI->filename)); + DBFreeVariant(&dbv); + return GAIR_SUCCESS; + } else if((wParam && GAIF_FORCE) != 0 && status > ID_STATUS_OFFLINE && !DBGetContactSetting(AI->hContact, MODULE, "ImageURL", &dbv)) { + DownloadAvatar(AI->hContact, dbv.pszVal); + DBFreeVariant(&dbv); + return GAIR_WAITFOR; + } else + return GAIR_NOAVATAR; +} + + int ContactDeleted(WPARAM wParam, LPARAM lParam) { HANDLE hContact = (HANDLE)wParam; int uid = DBGetContactSettingDword(hContact, MODULE, "UID", 0); @@ -444,11 +378,9 @@ int ContactDeleted(WPARAM wParam, LPARAM lParam) { 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; @@ -486,15 +418,14 @@ void CreateProtoServices() { hServices[i++] = CreateProtoServiceFunction(MODULE, PS_ADDTOLIST, AddToList); hServices[i++] = CreateProtoServiceFunction(MODULE, PSS_GETAWAYMSG, GetAwayMsg); - hServices[i++] = CreateProtoServiceFunction(MODULE, PSR_AWAYMSG, RecvAwayMsg); hServices[i++] = CreateProtoServiceFunction(MODULE, PS_SETAWAYMSG, SetAwayMsg); hServices[i++] = CreateProtoServiceFunction(MODULE, PSS_USERISTYPING, SendTyping); + + hServices[i++] = CreateProtoServiceFunction(MODULE, PS_GETAVATARINFO, GetAvatarInfo); // remember to modify the NUM_FILTER_SERVICES #define above if you add more services! hEventContactDeleted = HookEvent(ME_DB_CONTACT_DELETED, ContactDeleted); - - //my_space_server_running = false; } void DeinitProto() { -- cgit v1.2.3