libpurple/protocols/msn/p2p.c

changeset 31773
4de9d3a046be
parent 31772
ad88c7c133a3
child 31781
e847bafa5e00
--- a/libpurple/protocols/msn/p2p.c	Sat May 07 07:49:25 2011 +0000
+++ b/libpurple/protocols/msn/p2p.c	Sat May 07 08:43:31 2011 +0000
@@ -313,11 +313,28 @@
 }
 
 gboolean
-msn_p2p_msg_is_data(const MsnP2PHeaderFlag flags)
+msn_p2p_msg_is_data(const MsnP2PInfo *info)
 {
-	return (flags == P2P_MSN_OBJ_DATA ||
-	        flags == (P2P_WLM2009_COMP | P2P_MSN_OBJ_DATA) ||
-	        flags == P2P_FILE_DATA);
+	gboolean data = FALSE;
+
+	switch (info->version) {
+		case MSN_P2P_VERSION_ONE: {
+			guint32 flags = info->header.v1.flags;
+			data = (flags == P2P_MSN_OBJ_DATA ||
+			        flags == (P2P_WLM2009_COMP | P2P_MSN_OBJ_DATA) ||
+			        flags == P2P_FILE_DATA);
+			break;
+		}
+
+		case MSN_P2P_VERSION_TWO:
+			data = info->header.v2.message_len > 0;
+			break;
+
+		default:
+			purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+	}
+
+	return data;
 }
 
 gboolean
@@ -417,7 +434,7 @@
 			guint32 flags = msn_p2p_info_get_flags(info);
 
 			ret = flags == P2P_NO_FLAG || flags == P2P_WLM2009_COMP ||
-			      msn_p2p_msg_is_data(flags);
+			      msn_p2p_msg_is_data(info);
 			break;
 		}
 
@@ -432,6 +449,46 @@
 	return ret;
 }
 
+gboolean
+msn_p2p_info_is_ack(MsnP2PInfo *info)
+{
+	gboolean ret = FALSE;
+
+	switch (info->version) {
+		case MSN_P2P_VERSION_ONE: {
+			ret = msn_p2p_info_get_flags(info) == P2P_ACK;
+			break;
+		}
+
+		case MSN_P2P_VERSION_TWO:
+			ret = msn_tlv_gettlv(info->header.v2.header_tlv, P2P_TLV_TYPE_ACK, 1) != NULL;
+			break;
+
+		default:
+			purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+	}
+
+	return ret;
+}
+
+void
+msn_p2p_info_init_first(MsnP2PInfo *info, MsnP2PInfo *old_info)
+{
+	switch (info->version) {
+		case MSN_P2P_VERSION_ONE:
+			info->header.v1.session_id = old_info->header.v1.session_id;
+			info->header.v1.flags = old_info->header.v1.flags;
+			break;
+
+		case MSN_P2P_VERSION_TWO:
+			info->header.v2.data_tf = TF_FIRST;
+			break;
+
+		default:
+			purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version);
+	}
+}
+
 guint32
 msn_p2p_info_get_session_id(MsnP2PInfo *info)
 {
@@ -548,7 +605,7 @@
 			break;
 
 		case MSN_P2P_VERSION_TWO:
-			/* Nothing to do! */
+			flags = info->header.v2.data_tf;
 			break;
 
 		default:
@@ -723,7 +780,7 @@
 			break;
 
 		case MSN_P2P_VERSION_TWO:
-			/* Nothing to do! */
+			info->header.v2.data_tf = flags;
 			break;
 
 		default:

mercurial