<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -61,6 +61,9 @@ msn_message_destroy(MsnMessage *msg)
     pn_log (&quot;msg=%p&quot;, msg);
 #endif
 
+    if (msg-&gt;nak_cb)
+        msg-&gt;nak_cb(msg, msg-&gt;ack_data);
+
     /** @todo this is ugly, but we really need to kill the pending
      * transactions to avoid further ack/nak handling . */
     {</diff>
      <filename>cmd/msg.c</filename>
    </modified>
    <modified>
      <diff>@@ -205,25 +205,14 @@ pn_peer_link_remove_call(struct pn_peer_link *link,
         struct pn_peer_msg *peer_msg = e-&gt;data;
         e = e-&gt;next;
 
-        if (peer_msg-&gt;call == call)
+        if (peer_msg-&gt;call == call) {
+            peer_msg-&gt;link = NULL;
+            link-&gt;slp_msgs = g_list_remove(link-&gt;slp_msgs, peer_msg);
             pn_peer_msg_unref(peer_msg);
+        }
     }
 }
 
-void
-pn_peer_link_add_msg(struct pn_peer_link *link,
-                     struct pn_peer_msg *peer_msg)
-{
-    link-&gt;slp_msgs = g_list_append(link-&gt;slp_msgs, peer_msg);
-}
-
-void
-pn_peer_link_remove_msg(struct pn_peer_link *link,
-                        struct pn_peer_msg *peer_msg)
-{
-    link-&gt;slp_msgs = g_list_remove(link-&gt;slp_msgs, peer_msg);
-}
-
 struct pn_peer_call *
 pn_peer_link_find_slp_call(struct pn_peer_link *link,
                            const char *id)
@@ -283,6 +272,9 @@ msg_ack(MsnMessage *msg,
 
     peer_msg = data;
 
+    if (!peer_msg-&gt;link)
+        goto leave;
+
     real_size = (peer_msg-&gt;flags == 0x2) ? 0 : peer_msg-&gt;size;
 
     peer_msg-&gt;offset += msg-&gt;msnslp_header.length;
@@ -300,7 +292,9 @@ msg_ack(MsnMessage *msg,
         }
     }
 
+leave:
     peer_msg-&gt;msgs = g_list_remove(peer_msg-&gt;msgs, msg);
+    pn_peer_msg_unref(peer_msg);
 }
 
 /* We have received the message nak. */
@@ -312,9 +306,8 @@ msg_nak(MsnMessage *msg,
 
     peer_msg = data;
 
-    send_msg_part(peer_msg-&gt;link, peer_msg);
-
     peer_msg-&gt;msgs = g_list_remove(peer_msg-&gt;msgs, msg);
+    pn_peer_msg_unref(peer_msg);
 }
 
 static void
@@ -354,6 +347,7 @@ send_msg_part(struct pn_peer_link *link,
     msn_message_show_readable(msg, peer_msg-&gt;info, peer_msg-&gt;text_body);
 #endif
 
+    pn_peer_msg_ref(peer_msg);
     peer_msg-&gt;msgs = g_list_append(peer_msg-&gt;msgs, msg);
 
 #ifdef MSN_DIRECTCONN
@@ -387,6 +381,9 @@ release_peer_msg(struct pn_peer_link *link,
 {
     MsnMessage *msg;
 
+    peer_msg-&gt;link = link;
+    link-&gt;slp_msgs = g_list_append(link-&gt;slp_msgs, peer_msg);
+
     peer_msg-&gt;msg = msg = msn_message_new_msnslp();
 
     switch (peer_msg-&gt;flags) {
@@ -477,7 +474,7 @@ send_ack(struct pn_peer_link *link,
 {
     struct pn_peer_msg *ack_msg;
 
-    ack_msg = pn_peer_msg_new(link);
+    ack_msg = pn_peer_msg_new();
 
     ack_msg-&gt;session_id = peer_msg-&gt;session_id;
     ack_msg-&gt;size = peer_msg-&gt;size;
@@ -635,7 +632,7 @@ pn_peer_link_process_msg(struct pn_peer_link *link,
     offset = msg-&gt;msnslp_header.offset;
 
     if (offset == 0) {
-        peer_msg = pn_peer_msg_new(link);
+        peer_msg = pn_peer_msg_new();
         peer_msg-&gt;id = msg-&gt;msnslp_header.id;
         peer_msg-&gt;session_id = msg-&gt;msnslp_header.session_id;
         peer_msg-&gt;ack_id = msg-&gt;msnslp_header.ack_id;
@@ -643,6 +640,9 @@ pn_peer_link_process_msg(struct pn_peer_link *link,
         peer_msg-&gt;flags = msg-&gt;msnslp_header.flags;
         peer_msg-&gt;msg = msg;
 
+        peer_msg-&gt;link = link;
+        link-&gt;slp_msgs = g_list_append(link-&gt;slp_msgs, peer_msg);
+
         if (peer_msg-&gt;session_id) {
             if (!peer_msg-&gt;call)
                 peer_msg-&gt;call = find_session_call(link, peer_msg-&gt;session_id);</diff>
      <filename>cvr/pn_peer_link.c</filename>
    </modified>
    <modified>
      <diff>@@ -47,10 +47,6 @@ void pn_peer_link_add_call(struct pn_peer_link *link,
                            struct pn_peer_call *call);
 void pn_peer_link_remove_call(struct pn_peer_link *link,
                               struct pn_peer_call *call);
-void pn_peer_link_add_msg(struct pn_peer_link *link,
-                          struct pn_peer_msg *peer_msg);
-void pn_peer_link_remove_msg(struct pn_peer_link *link,
-                             struct pn_peer_msg *peer_msg);
 struct pn_peer_call *pn_peer_link_find_slp_call(struct pn_peer_link *link,
                                                 const char *id);
 void pn_peer_link_queue_msg(struct pn_peer_link *link,</diff>
      <filename>cvr/pn_peer_link.h</filename>
    </modified>
    <modified>
      <diff>@@ -56,7 +56,7 @@
 #include &quot;fix_purple.h&quot;
 
 struct pn_peer_msg *
-pn_peer_msg_new(struct pn_peer_link *link)
+pn_peer_msg_new(void)
 {
     struct pn_peer_msg *peer_msg;
 
@@ -66,10 +66,6 @@ pn_peer_msg_new(struct pn_peer_link *link)
     pn_info(&quot;peer_msg=%p&quot;, peer_msg);
 #endif
 
-    peer_msg-&gt;link = link;
-
-    pn_peer_link_add_msg(link, peer_msg);
-
     peer_msg-&gt;ref_count++;
 
     return peer_msg;
@@ -78,9 +74,6 @@ pn_peer_msg_new(struct pn_peer_link *link)
 void
 pn_peer_msg_free(struct pn_peer_msg *peer_msg)
 {
-    struct pn_peer_link *link;
-    GList *cur;
-
     if (!peer_msg)
         return;
 
@@ -88,31 +81,11 @@ pn_peer_msg_free(struct pn_peer_msg *peer_msg)
     pn_info(&quot;peer_msg=%p&quot;, peer_msg);
 #endif
 
-    link = peer_msg-&gt;link;
-
     if (peer_msg-&gt;fp)
         fclose(peer_msg-&gt;fp);
 
     g_free(peer_msg-&gt;buffer);
 
-    for (cur = peer_msg-&gt;msgs; cur; cur = cur-&gt;next) {
-        /* Something is pointing to this peer_msg, so we should remove that
-         * pointer to prevent a crash. */
-        /* Ex: a user goes offline and after that we receive an ACK */
-
-        MsnMessage *msg = cur-&gt;data;
-
-#ifdef PECAN_DEBUG_SLPMSG
-        pn_info(&quot;Unlink peer_msg callbacks.\n&quot;);
-#endif
-
-        msg-&gt;ack_cb = NULL;
-        msg-&gt;nak_cb = NULL;
-        msg-&gt;ack_data = NULL;
-    }
-
-    pn_peer_link_remove_msg(link, peer_msg);
-
     g_free(peer_msg);
 }
 
@@ -236,7 +209,7 @@ sip_new(struct pn_peer_call *call,
         g_strlcat(body, content, body_len);
     }
 
-    peer_msg = pn_peer_msg_new(link);
+    peer_msg = pn_peer_msg_new();
     set_body(peer_msg, (gpointer) body, body_len);
 
     peer_msg-&gt;sip = TRUE;
@@ -491,7 +464,7 @@ got_sessionreq(struct pn_peer_call *call,
         pn_msnobj_free(obj);
 
         /* DATA PREP */
-        peer_msg = pn_peer_msg_new(link);
+        peer_msg = pn_peer_msg_new();
         peer_msg-&gt;call = call;
         peer_msg-&gt;session_id = call-&gt;session_id;
         set_body(peer_msg, NULL, 4);
@@ -501,7 +474,7 @@ got_sessionreq(struct pn_peer_call *call,
         pn_peer_link_queue_msg(link, peer_msg);
 
         /* DATA */
-        peer_msg = pn_peer_msg_new(link);
+        peer_msg = pn_peer_msg_new();
         peer_msg-&gt;call = call;
         peer_msg-&gt;flags = 0x20;
 #ifdef PECAN_DEBUG_SLP</diff>
      <filename>cvr/pn_peer_msg.c</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 struct pn_peer_call;
 struct pn_peer_link;
 
-struct pn_peer_msg *pn_peer_msg_new(struct pn_peer_link *link);
+struct pn_peer_msg *pn_peer_msg_new(void);
 void pn_peer_msg_free(struct pn_peer_msg *peer_msg);
 struct pn_peer_msg *pn_peer_msg_ref(struct pn_peer_msg *peer_msg);
 struct pn_peer_msg *pn_peer_msg_unref(struct pn_peer_msg *peer_msg);</diff>
      <filename>cvr/pn_peer_msg.h</filename>
    </modified>
    <modified>
      <diff>@@ -126,7 +126,7 @@ send_file_cb(struct pn_peer_call *call)
     struct stat st;
     PurpleXfer *xfer;
 
-    peer_msg = pn_peer_msg_new(call-&gt;link);
+    peer_msg = pn_peer_msg_new();
     peer_msg-&gt;call = call;
     peer_msg-&gt;flags = 0x1000030;
 #ifdef PECAN_DEBUG_SLP</diff>
      <filename>libpurple/xfer.c</filename>
    </modified>
    <modified>
      <diff>@@ -548,9 +548,6 @@ msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, MsnMsgErrorType error)
 {
     MsnSwitchBoard *swboard;
 
-    if ((error != MSN_MSG_ERROR_SB) &amp;&amp; msg-&gt;nak_cb)
-        msg-&gt;nak_cb(msg, msg-&gt;ack_data);
-
     swboard = cmdproc-&gt;data;
 
     if (msg-&gt;type == MSN_MSG_TEXT &amp;&amp; msn_message_get_flag (msg) != 'U')
@@ -856,15 +853,7 @@ msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 static void
 nak_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
-    MsnMessage *msg;
-
-    g_return_if_fail(cmd);
-    g_return_if_fail(cmd-&gt;trans);
-
-    msg = cmd-&gt;trans-&gt;data;
-
-    g_return_if_fail(msg);
-
+    MsnMessage *msg = cmd-&gt;trans-&gt;data;
     msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_NAK);
 }
 
@@ -874,17 +863,17 @@ ack_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
     MsnSwitchBoard *swboard;
     MsnMessage *msg;
 
-    g_return_if_fail(cmd);
-    g_return_if_fail(cmd-&gt;trans);
-
     msg = cmd-&gt;trans-&gt;data;
 
-    if (msg-&gt;ack_cb != NULL)
-        msg-&gt;ack_cb(msg, msg-&gt;ack_data);
-
     swboard = cmdproc-&gt;data;
     if (swboard)
         swboard-&gt;ack_list = g_list_remove(swboard-&gt;ack_list, msg);
+
+    if (msg-&gt;ack_cb)
+        msg-&gt;ack_cb(msg, msg-&gt;ack_data);
+
+    msg-&gt;nak_cb = NULL;
+
     msn_message_unref(msg);
 }
 </diff>
      <filename>switchboard.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>73c5a544fa00b61cb751dd43c64a7ab966ba348e</id>
    </parent>
  </parents>
  <author>
    <name>Felipe Contreras</name>
    <email>felipe.contreras@gmail.com</email>
  </author>
  <url>http://github.com/felipec/msn-pecan/commit/63e6134a7ed260a08b504ae1952d81de3b024384</url>
  <id>63e6134a7ed260a08b504ae1952d81de3b024384</id>
  <committed-date>2009-07-18T09:11:01-07:00</committed-date>
  <authored-date>2009-07-17T17:43:18-07:00</authored-date>
  <message>Reorganize peer_msg

There's no way to notify the peer_msg when the underlying msg has been
destroyed. So let's do it the other way.

Also, don't depend on peer-link so much.

Signed-off-by: Felipe Contreras &lt;felipe.contreras@gmail.com&gt;</message>
  <tree>e23b2774120377dc6709758fce27ca033d734475</tree>
  <committer>
    <name>Felipe Contreras</name>
    <email>felipe.contreras@gmail.com</email>
  </committer>
</commit>
