INT_PTR CAimProto::OnLeaveChat(WPARAM wParam, LPARAM)
{
	if (m_state != 1)
		return 0;

	MCONTACT hContact = wParam;

	DBVARIANT dbv;
	if (!getString(hContact, "ChatRoomID", &dbv)) {
		chat_leave(dbv.pszVal);
		db_free(&dbv);
	}
	return 0;
}
Exemple #2
0
INT_PTR CAimProto::OnLeaveChat(WPARAM wParam, LPARAM /*lParam*/)
{
	if (state != 1)	return 0;

	HANDLE hContact = (HANDLE)wParam;

	DBVARIANT dbv;
	if (!getString(hContact, "ChatRoomID", &dbv))
	{
		chat_leave(dbv.pszVal);
		DBFreeVariant(&dbv);
	}
	return 0;
}
Exemple #3
0
void pars_privat(void) {
    int privat;

    privat = pars_number();
    strncpy(status->nick, packet, NICK_MAXLEN);
    if (user_ignore()) return;
    strncpy(status->channel, packet, NICK_MAXLEN);
    if (!strncmp(config->nick, status->nick, NICK_MAXLEN))
        strncpy(status->channel, pars_word(), NICK_MAXLEN);
    else if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return;
    switch (privat) {
        case MSG_PRIVATJOIN:
            if (!config->packet_qchat) {
                pars_word(); status->gender = pars_number();
            }
            chat_join();
            break;
        case MSG_PRIVATLEAVE:
            if (!config->packet_qchat) {
                pars_word(); status->gender = pars_number();
            }
            chat_leave();
            break;
        case MSG_PRIVATCHAT:
            chat_rejoin();
            snprintf(message, MSG_SIZE, "<%s> %s\n", status->nick, pars_word());
            write_log(config->log_priv);
            write_str(status->channel, COL_CHAT);
            if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) &&
                (config->mode == MOD_NORMAL)) beep_chat();
            break;
        case MSG_PRIVATME:
            chat_rejoin();
            snprintf(message, MSG_SIZE, " * %s %s\n", status->nick, pars_word());
            write_log(config->log_priv);
            write_str(status->channel, COL_CHAT);
            if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) &&
                (config->mode == MOD_NORMAL)) beep_chat();
            break;
        default:
#ifdef  DEBUG
            fprintf(debug_file, "error: Unknown private type.\n");
            fflush(debug_file);
#endif  /* DEBUG */
            break;
    }
}
Exemple #4
0
int CAimProto::OnGCEvent(WPARAM wParam,LPARAM lParam) 
{
	GCHOOK *gch = (GCHOOK*) lParam;
	if (!gch) return 1;

	if (strcmp(gch->pDest->pszModule, m_szModuleName)) return 0;

	char* id = mir_t2a(gch->pDest->ptszID);
	chat_list_item* item = find_chat_by_id(id);

	if (item == NULL) return 0;

	switch (gch->pDest->iType) 
	{
		case GC_SESSION_TERMINATE: 
			aim_sendflap(item->hconn,0x04,0,NULL,item->seqno);
			Netlib_Shutdown(item->hconn);
			break;

		case GC_USER_MESSAGE:
			if (gch->ptszText && _tcslen(gch->ptszText)) 
			{
				char* msg = mir_utf8encodeT(gch->ptszText);
				aim_chat_send_message(item->hconn, item->seqno, msg);
				mir_free(msg);
			}
			break;
		case GC_USER_CHANMGR: 
			DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CHATROOM_INVITE), NULL, invite_to_chat_dialog, 
				LPARAM(new invite_chat_param(item->id, this)));
			break;

		case GC_USER_PRIVMESS:
			{
				char* sn = mir_t2a(gch->ptszUID);
				HANDLE hContact = contact_from_sn(sn);
				mir_free(sn);
				CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, 0);
			}
			break;

		case GC_USER_LOGMENU:
			switch(gch->dwData) 
			{
			case 10:
				DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CHATROOM_INVITE), NULL, invite_to_chat_dialog, 
					LPARAM(new invite_chat_param(item->id, this)));
				break;

			case 20:
				chat_leave(id);
				break;
			}
			break;
		
		case GC_USER_NICKLISTMENU: 
			{
				char *sn = mir_t2a(gch->ptszUID);
				HANDLE hContact = contact_from_sn(sn);
				mir_free(sn);

				switch (gch->dwData) 
				{
				case 10:
					CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0);
					break;

				case 20:
					CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)hContact, 0);
					break;

				case 110:
					chat_leave(id);
					break;
				}
			}
			break;

		case GC_USER_TYPNOTIFY: 
			break;
	}
	mir_free(id);

	return 0;
}
Exemple #5
0
void __cdecl CAimProto::aim_chat_negotiation(void* param)
{
	chat_list_item *item = (chat_list_item*)param;
	HANDLE hServerPacketRecver = (HANDLE)CallService(MS_NETLIB_CREATEPACKETRECVER, (WPARAM)item->hconn, 2048 * 8);

	NETLIBPACKETRECVER packetRecv = { 0 };
	packetRecv.cbSize = sizeof(packetRecv);
	packetRecv.dwTimeout = DEFAULT_KEEPALIVE_TIMER * 1000;
	for (;;) {
		int recvResult = CallService(MS_NETLIB_GETMOREPACKETS, (WPARAM)hServerPacketRecver, (LPARAM)&packetRecv);
		if (recvResult == 0)
			break;

		if (recvResult == SOCKET_ERROR) {
			if (WSAGetLastError() == ERROR_TIMEOUT) {
				if (aim_keepalive(item->hconn, item->seqno) < 0)
					break;
			}
			else
				break;
		}

		if (recvResult > 0) {
			unsigned short flap_length = 0;
			for (; packetRecv.bytesUsed < packetRecv.bytesAvailable; packetRecv.bytesUsed = flap_length) {
				if (!packetRecv.buffer)
					break;
				FLAP flap((char*)&packetRecv.buffer[packetRecv.bytesUsed], packetRecv.bytesAvailable - packetRecv.bytesUsed);
				if (!flap.len())
					break;
				flap_length += FLAP_SIZE + flap.len();
				if (flap.cmp(0x01)) {
					aim_send_cookie(item->hconn, item->seqno, item->CHAT_COOKIE_LENGTH, item->CHAT_COOKIE);//cookie challenge
					mir_free(item->CHAT_COOKIE);
					item->CHAT_COOKIE = NULL;
					item->CHAT_COOKIE_LENGTH = 0;
				}
				else if (flap.cmp(0x02)) {
					SNAC snac(flap.val(), flap.snaclen());
					if (snac.cmp(0x0001)) {
						snac_supported_families(snac, item->hconn, item->seqno);
						snac_supported_family_versions(snac, item->hconn, item->seqno);
						snac_chat_rate_limitations(snac, item->hconn, item->seqno);
						snac_error(snac);

					}
					if (snac.cmp(0x000E)) {
						snac_chat_received_message(snac, item);
						snac_chat_joined_left_users(snac, item);
						snac_error(snac);
					}
				}
				else if (flap.cmp(0x04))
					goto exit;
			}
		}
	}

exit:
	Netlib_CloseHandle(hServerPacketRecver);
	Netlib_CloseHandle(item->hconn);
	chat_leave(item->id);
	remove_chat_by_ptr(item);
	debugLogA("Chat Server Connection has ended");
}