// Pings a user. OnPing callback will be called when the server receives // the response from the user. OnDisconnect callback might be called if // a problem occurs. BOOL CNDKServer::PingUser(long lUserId) { CNDKMessage message(NDKPingClient); message.Add((long)::GetTickCount()); return SendMessageToUser(lUserId, message); }
// Translates message and does the appropriate task for message handled by // the NDK. void CNDKServer::TranslateMessage(long lUserId, CNDKMessage& message) { switch (message.GetId()) { case NDKPingServer: SendMessageToUser(lUserId, message); break; case NDKPingClient: { long lNbMilliseconds = 0; message.GetAt(0, lNbMilliseconds); OnPing(lUserId, ::GetTickCount() - lNbMilliseconds); } break; case NDKClientDisconnect: DisconnectUser(lUserId, NDKServer_ClientCloseConnection); break; default: OnMessage(lUserId, message); break; } }
// Disconnect a user. BOOL CNDKServer::DisconnectUser(long lUserId, NDKServerDisconnection disconnectionType) { CNDKMessage msg(NDKServerDisconnectClient); BOOL bResult = SendMessageToUser(lUserId, msg); if (bResult) { bResult = m_userMgr.RemoveUser(lUserId); OnDisconnect(lUserId, disconnectionType); } return bResult; }
int STSendMessage(WPARAM wParam, LPARAM lParam) { if (lParam) { CCSDATA* ccs = (CCSDATA*)lParam; char *proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)ccs->hContact, 0); if(!proto || strcmp(proto, PROTO) != 0 || DBGetContactSettingWord(ccs->hContact, PROTO, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE) { HANDLE hEvent; TFakeAckParams *tfap; hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); tfap = (TFakeAckParams *)malloc(sizeof(TFakeAckParams)); tfap->hContact = ccs->hContact; tfap->hEvent = hEvent; tfap->lParam = 0; CloseHandle( CreateThread( NULL, 0, sttFakeAckMessageFailed, tfap, 0, 0 )); SetEvent( hEvent ); return FAILED_MESSAGE_HANDLE; } int ret = 0; char *p = (char *)ccs->lParam; if(ccs->wParam & PREF_UNICODE) ret = (int)SendMessageToUserW(ccs->hContact, (wchar_t *)&p[strlen(p) + 1]); else ret = (int)SendMessageToUser(ccs->hContact, (char *)ccs->lParam); DWORD dwThreadId; HANDLE hEvent; TFakeAckParams *tfap; hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); tfap = (TFakeAckParams *)malloc(sizeof(TFakeAckParams)); tfap->hContact = ccs->hContact; tfap->hEvent = hEvent; tfap->lParam = (LPARAM)ret; CloseHandle( CreateThread( NULL, 0, sttFakeAckMessageSuccess, tfap, 0, &dwThreadId )); SetEvent( hEvent ); return ret; } return 0; }
// Sends a message to some user specified by the array of user Id. // OnDisconnect callback will be called for each user that the message // cannot be sent. BOOL CNDKServer::SendMessageToSomeUsers(const CLongArray& alUserIds, CNDKMessage& message) { BOOL bResult = TRUE; for (long lUserIndex = 0; lUserIndex < alUserIds.GetSize(); lUserIndex++) { if (!SendMessageToUser(alUserIds[lUserIndex], message)) { OnDisconnect(alUserIds[lUserIndex], NDKServer_ErrorSendingMessage); bResult = FALSE; } } return TRUE; }