void msn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { MsnSession *session; MsnSlpLink *slplink; MsnP2PVersion p2p; session = cmdproc->servconn->session; slplink = msn_session_get_slplink(session, msg->remote_user); if (slplink->swboard == NULL) { /* * We will need swboard in order to change its flags. If its * NULL, something has probably gone wrong earlier on. I * didn't want to do this, but MSN 7 is somehow causing us * to crash here, I couldn't reproduce it to debug more, * and people are reporting bugs. Hopefully this doesn't * cause more crashes. Stu. */ if (cmdproc->data == NULL) g_warning("msn_p2p_msg cmdproc->data was NULL\n"); else { slplink->swboard = (MsnSwitchBoard *)cmdproc->data; slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); } } p2p = msn_slplink_get_p2p_version(slplink); msg->part = msn_slpmsgpart_new_from_data(p2p, msg->body, msg->body_len); if (msg->part) msn_slplink_process_msg(slplink, msg->part); else purple_debug_warning("msn", "P2P message failed to parse.\n"); }
static int msn_dc_process_packet(MsnDirectConn *dc, guint32 packet_length) { MsnSlpMessagePart *part; g_return_val_if_fail(dc != NULL, DC_PROCESS_ERROR); switch (dc->state) { case DC_STATE_CLOSED: break; case DC_STATE_FOO: /* FOO message is always 4 bytes long */ if (packet_length != 4 || memcmp(dc->in_buffer, "\4\0\0\0foo", 8) != 0) return DC_PROCESS_FALLBACK; dc->state = DC_STATE_HANDSHAKE; break; case DC_STATE_HANDSHAKE: if (!msn_dc_verify_handshake(dc, packet_length)) return DC_PROCESS_FALLBACK; msn_dc_send_handshake(dc); dc->state = DC_STATE_ESTABLISHED; msn_slpcall_session_init(dc->slpcall); dc->slpcall = NULL; break; case DC_STATE_HANDSHAKE_REPLY: if (!msn_dc_verify_handshake(dc, packet_length)) return DC_PROCESS_FALLBACK; dc->state = DC_STATE_ESTABLISHED; msn_slpcall_session_init(dc->slpcall); dc->slpcall = NULL; break; case DC_STATE_ESTABLISHED: if (packet_length) { part = msn_slpmsgpart_new_from_data(dc->in_buffer + 4, packet_length); if (part) { msn_slplink_process_msg(dc->slplink, part); msn_slpmsgpart_unref(part); } } /* if (dc->num_calls == 0) { msn_dc_destroy(dc); return DC_PROCESS_CLOSE; } */ break; } return DC_PROCESS_OK; }