summaryrefslogtreecommitdiff
path: root/MySpace/proto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'MySpace/proto.cpp')
-rw-r--r--MySpace/proto.cpp153
1 files changed, 42 insertions, 111 deletions
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() {