<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1233,7 +1233,7 @@ rng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
     /* msn_switchboard_add_user(swboard, cmd-&gt;params[4]); */
 
     if (!msn_switchboard_connect(swboard, host, port))
-        msn_switchboard_destroy(swboard);
+        msn_switchboard_close(swboard);
 
     g_free(host);
 }</diff>
      <filename>notification.c</filename>
    </modified>
    <modified>
      <diff>@@ -129,7 +129,7 @@ close_cb (PecanNode *conn,
         pecan_error (&quot;connection error: (SB)&quot;);
     }
 
-    msn_switchboard_destroy (swboard);
+    msn_switchboard_close (swboard);
 }
 
 /**************************************************************************
@@ -279,12 +279,6 @@ msn_switchboard_unref (MsnSwitchBoard *swboard)
 }
 
 void
-msn_switchboard_destroy (MsnSwitchBoard *swboard)
-{
-    msn_switchboard_unref (swboard);
-}
-
-void
 msn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key)
 {
     g_return_if_fail(swboard);
@@ -826,7 +820,7 @@ bye_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
     if (swboard-&gt;conv == NULL)
     {
         /* This is a helper switchboard */
-        msn_switchboard_destroy(swboard);
+        msn_switchboard_close(swboard);
     }
     else if ((swboard-&gt;current_users &gt; 1) ||
              (purple_conversation_get_type(swboard-&gt;conv) == PURPLE_CONV_TYPE_CHAT))
@@ -835,12 +829,12 @@ bye_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
         purple_conv_chat_remove_user(PURPLE_CONV_CHAT(swboard-&gt;conv), user, NULL);
         swboard-&gt;current_users--;
         if (swboard-&gt;current_users == 0)
-            msn_switchboard_destroy(swboard);
+            msn_switchboard_close(swboard);
     }
     else
     {
         /* This is a switchboard used for a im session */
-        msn_switchboard_destroy(swboard);
+        msn_switchboard_close(swboard);
     }
 }
 
@@ -885,8 +879,11 @@ joi_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
     if (!session-&gt;http_method)
         send_clientcaps(swboard);
 
-    if (swboard-&gt;closed)
+    if (swboard-&gt;to_close)
+    {
         msn_switchboard_close(swboard);
+        msn_switchboard_unref(swboard);
+    }
 }
 
 static void
@@ -1280,7 +1277,7 @@ got_swboard(MsnCmdProc *cmdproc, MsnCommand *cmd)
     msn_parse_socket(cmd-&gt;params[2], &amp;host, &amp;port);
 
     if (!msn_switchboard_connect(swboard, host, port))
-        msn_switchboard_destroy(swboard);
+        msn_switchboard_close(swboard);
 
     g_free(host);
 }
@@ -1331,11 +1328,23 @@ msn_switchboard_close(MsnSwitchBoard *swboard)
 {
     g_return_if_fail(swboard);
 
+    if (swboard-&gt;closed)
+        return;
+
+    swboard-&gt;closed = TRUE;
     swboard-&gt;conv = NULL;
 
+    /* Don't let a write error destroy the switchboard before we do. */
+    msn_switchboard_ref(swboard);
+
+    if (swboard-&gt;chat_id)
+        g_hash_table_remove (swboard-&gt;session-&gt;chats, GINT_TO_POINTER (swboard-&gt;chat_id));
+    else
+        g_hash_table_remove (swboard-&gt;session-&gt;conversations, swboard-&gt;im_user);
+
     if (swboard-&gt;error != MSN_SB_ERROR_NONE)
     {
-        msn_switchboard_destroy(swboard);
+        msn_switchboard_unref(swboard);
     }
     else if (g_queue_is_empty(swboard-&gt;msg_queue) ||
              !swboard-&gt;session-&gt;connected)
@@ -1343,16 +1352,15 @@ msn_switchboard_close(MsnSwitchBoard *swboard)
         MsnCmdProc *cmdproc;
         cmdproc = swboard-&gt;cmdproc;
 
-        /* Don't let a write error destroy the switchboard before we do. */
-        msn_switchboard_ref(swboard);
         msn_cmdproc_send_quick(cmdproc, &quot;OUT&quot;, NULL, NULL);
 
-        msn_switchboard_destroy(swboard);
         msn_switchboard_unref(swboard);
     }
     else
     {
-        swboard-&gt;closed = TRUE;
+        /* Messages are still pending */
+        /* Destroy the switchboard when they are sent. */
+        swboard-&gt;to_close = TRUE;
     }
 }
 </diff>
      <filename>switchboard.c</filename>
    </modified>
    <modified>
      <diff>@@ -87,8 +87,9 @@ struct MsnSwitchBoard
                                   switchboard. */
     gboolean ready;			/**&lt; A flag that states if this switchboard is
                                           ready to be used. */
-    gboolean closed;		/**&lt; A flag that states if the switchboard has
-                                  been closed by the user. */
+    gboolean closed; /**&lt; The switchboard has been closed. */
+    gboolean to_close; /**&lt; The switchboard should be closed after sending the
+                         queued messages. */
 
     int current_users;
     int total_users;</diff>
      <filename>switchboard.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>55c931a2ef733aed4ce264d382781b341e326304</id>
    </parent>
  </parents>
  <author>
    <name>Felipe Contreras</name>
    <email>felipe.contreras@gmail.com</email>
  </author>
  <url>http://github.com/felipec/msn-pecan/commit/7a54d5b60806a9d42500987f345ba8760788edd7</url>
  <id>7a54d5b60806a9d42500987f345ba8760788edd7</id>
  <committed-date>2008-06-29T13:13:59-07:00</committed-date>
  <authored-date>2008-06-24T22:45:58-07:00</authored-date>
  <message>Switchboard close fixes.</message>
  <tree>b2aa19b5d3425b5531f152b4e7d2d5b0cde76fff</tree>
  <committer>
    <name>Felipe Contreras</name>
    <email>felipe.contreras@gmail.com</email>
  </committer>
</commit>
