예제 #1
0
// 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);
}
예제 #2
0
// 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;
	}
}
예제 #3
0
// 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;
}
예제 #4
0
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;
}
예제 #5
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;
}