<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -46,6 +46,10 @@ ifdef LIBSIREN
   LIBSIREN_LIBS := -lm
 endif
 
+ifdef PLUS_SOUNDS
+  override CFLAGS += -DRECEIVE_PLUS_SOUNDS
+endif
+
 # extra debugging
 override CFLAGS += -DPECAN_DEBUG_SLP
 </diff>
      <filename>Makefile</filename>
    </modified>
    <modified>
      <diff>@@ -12,6 +12,7 @@ Compared to Pidgin's official MSN plug-in:
  * Server-side storage for display names (private alias)
  * Support for handwritten messages (read-only)
  * Support for voice clips (receive-only)
+ * Support for Plus! sounds (receive-only)
  * Option to hide Plus! tags
 
 Other features:</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -41,6 +41,7 @@ struct MsnCmdProc
     MsnErrorCb error_handler;
 
     gpointer data; /**&lt; Extra data, like the switchboard. */
+    gpointer extra_data; /**&lt; Extra data. */
     guint cmd_count;
 
     struct MsnHistory *history;</diff>
      <filename>cmd/cmdproc_private.h</filename>
    </modified>
    <modified>
      <diff>@@ -1792,6 +1792,9 @@ init_plugin (PurplePlugin *plugin)
 
         option = purple_account_option_bool_new (_(&quot;Use user displays&quot;), &quot;use_userdisplay&quot;, TRUE);
         prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, option);
+
+        option = purple_account_option_bool_new (_(&quot;Don't show Messenger Plus! tags&quot;), &quot;hide_msgplus_tags&quot;, TRUE);
+        prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, option);
     }
 
     purple_cmd_register (&quot;nudge&quot;, &quot;&quot;, PURPLE_CMD_P_PRPL,</diff>
      <filename>msn.c</filename>
    </modified>
    <modified>
      <diff>@@ -998,6 +998,89 @@ usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 /**************************************************************************
  * Message Handlers
  **************************************************************************/
+
+static void
+got_datacast_inform_user (MsnCmdProc *cmdproc,
+                          const char *passport,
+                          const char *str)
+{
+    PurpleAccount *account;
+    MsnSwitchBoard *swboard;
+    PecanContact *contact;
+    const char *friendly_name;
+    gchar *new_str;
+
+    account = cmdproc-&gt;session-&gt;account;
+    swboard = cmdproc-&gt;data;
+    contact = pecan_contactlist_find_contact(cmdproc-&gt;session-&gt;contactlist, passport);
+    friendly_name = pecan_contact_get_friendly_name(contact);
+    if (!friendly_name)
+        friendly_name = passport;
+
+    new_str = g_strdup_printf(&quot;%s %s&quot;, friendly_name, str);
+
+    /* Grab the conv for this swboard. If there isn't one and it's an IM then create it,
+    otherwise the smileys won't work, this needs to be fixed. */
+    if (!swboard-&gt;conv)
+    {
+        if (swboard-&gt;current_users &gt; 1)
+            swboard-&gt;conv = purple_find_chat(account-&gt;gc, swboard-&gt;chat_id);
+        else
+        {
+            swboard-&gt;conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
+                                                                  passport, account);
+            if (!swboard-&gt;conv)
+                swboard-&gt;conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, passport);
+        }
+    }
+    swboard-&gt;flag |= MSN_SB_FLAG_IM;
+
+    purple_conversation_write(swboard-&gt;conv, NULL, new_str, PURPLE_MESSAGE_SYSTEM, time(NULL));
+
+    g_free (new_str);
+}
+
+#if defined(RECEIVE_PLUS_SOUNDS)
+static void
+save_plus_sound_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
+                   const gchar *sound, size_t len, const gchar *error_message)
+{
+    FILE *f;
+    gchar *path;
+    gchar *str;
+    MsnCmdProc *cmdproc = user_data;
+    const char *passport = cmdproc-&gt;extra_data;
+
+    if ((error_message != NULL) || (len == 0))
+        return;
+
+    if (purple_mkstemp(&amp;path, TRUE))
+    {
+        gchar *path_mp3 = g_strconcat (path, &quot;.mp3&quot;, NULL);
+
+        f = fopen (path_mp3, &quot;wb&quot;);
+        fwrite(sound, len, 1, f);
+
+        str = g_strdup_printf (_(&quot;sent you a Messenger Plus! sound. Click &lt;a href='file://%s'&gt;here&lt;/a&gt; to play it.&quot;), path_mp3);
+        got_datacast_inform_user (cmdproc, passport, str);
+
+        fclose(f);
+
+        g_free (path_mp3);
+    }
+    else
+    {
+        pecan_error (&quot;couldn't create temporany file to store the received Plus! sound!\n&quot;);
+
+        str = g_strdup_printf (_(&quot;sent you a Messenger Plus! sound, but it cannot be played due to an error happened while storing the file.&quot;));
+        got_datacast_inform_user (cmdproc, passport, str);
+    }
+
+    g_free(str);
+    g_free(path);
+}
+#endif /* defined(RECEIVE_PLUS_SOUNDS) */
+
 static void
 plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
 {
@@ -1010,7 +1093,7 @@ plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
     char *body_final;
     char *alias_backup = NULL;
     size_t body_len;
-    const char *passport;
+    char *passport;
     const char *value;
 
     gc = cmdproc-&gt;session-&gt;account-&gt;gc;
@@ -1022,7 +1105,7 @@ plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
     body_enc = g_markup_escape_text(body_str, -1);
     g_free(body_str);
 
-    passport = msg-&gt;remote_user;
+    passport = strdup (msg-&gt;remote_user);
 
     buddy = purple_find_buddy(purple_connection_get_account(gc), passport);
 
@@ -1065,6 +1148,26 @@ plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
 
     swboard-&gt;flag |= MSN_SB_FLAG_IM;
 
+#if defined(RECEIVE_PLUS_SOUNDS)
+    const char *body_plus_sound = strstr (body_final, &quot;[Messenger Plus! Sound] - Data{&quot;);
+
+    if (body_plus_sound &amp;&amp; strlen (body_plus_sound) &gt; 43)
+    {
+        char *plus_sound_link = calloc (48 + 12 + 1, 1);
+
+        strcpy (plus_sound_link, &quot;http://sounds.msgpluslive.net/esnd/snd/get?hash=&quot;);
+        strncat (plus_sound_link, body_plus_sound + 31, 12);
+
+        cmdproc-&gt;extra_data = passport;
+
+        purple_util_fetch_url (plus_sound_link, TRUE, NULL, FALSE, save_plus_sound_cb, cmdproc);
+
+        free (plus_sound_link);
+
+        return;
+    }
+#endif /* defined(RECEIVE_PLUS_SOUNDS) */
+
     if (swboard-&gt;current_users &gt; 1 ||
         ((swboard-&gt;conv != NULL) &amp;&amp;
          purple_conversation_get_type(swboard-&gt;conv) == PURPLE_CONV_TYPE_CHAT))
@@ -1100,6 +1203,7 @@ plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
     }
 
     g_free(body_final);
+    g_free(passport);
 }
 
 #if defined(PECAN_CVR)
@@ -1186,44 +1290,6 @@ control_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
 
 #if defined(PECAN_LIBSIREN)
 static void
-got_datacast_inform_user (MsnCmdProc *cmdproc,
-                          const char *passport,
-                          const char *str)
-{
-    PurpleAccount *account;
-    MsnSwitchBoard *swboard;
-    PecanContact *contact;
-    const char *friendly_name;
-
-    account = cmdproc-&gt;session-&gt;account;
-    swboard = cmdproc-&gt;data;
-    contact = pecan_contactlist_find_contact(cmdproc-&gt;session-&gt;contactlist, passport);
-    friendly_name = pecan_contact_get_friendly_name(contact);
-    if (!friendly_name)
-        friendly_name = passport;
-
-    str = g_strdup_printf(&quot;%s %s&quot;, friendly_name, str);
-
-    /* Grab the conv for this swboard. If there isn't one and it's an IM then create it,
-    otherwise the smileys won't work, this needs to be fixed. */
-    if (!swboard-&gt;conv)
-    {
-        if (swboard-&gt;current_users &gt; 1)
-            swboard-&gt;conv = purple_find_chat(account-&gt;gc, swboard-&gt;chat_id);
-        else
-        {
-            swboard-&gt;conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
-                                                                  passport, account);
-            if (!swboard-&gt;conv)
-                swboard-&gt;conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, passport);
-        }
-    }
-    swboard-&gt;flag |= MSN_SB_FLAG_IM;
-
-    purple_conversation_write(swboard-&gt;conv, NULL, str, PURPLE_MESSAGE_SYSTEM, time(NULL));
-}
-
-static void
 got_voice_clip(MsnSlpCall *slpcall, const guchar *data, gsize size)
 {
     FILE *f;</diff>
      <filename>switchboard.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>5c10cb739adf2c848cce4218c6345cfcb4e312ae</id>
    </parent>
  </parents>
  <author>
    <name>Devid Antonio Filoni</name>
    <email>devidfil@gmail.com</email>
  </author>
  <url>http://github.com/felipec/msn-pecan/commit/8c5ee4fa625aa46027194fc9ce8199809fd0ab4b</url>
  <id>8c5ee4fa625aa46027194fc9ce8199809fd0ab4b</id>
  <committed-date>2009-02-05T11:39:06-08:00</committed-date>
  <authored-date>2009-02-05T09:08:27-08:00</authored-date>
  <message>Add support for receiving Plus! sounds. Patch for this by Thiago Silva and me.</message>
  <tree>ceeb89e1cfd7590899a5d46c0ab442359c180dea</tree>
  <committer>
    <name>Devid Antonio Filoni</name>
    <email>devidfil@gmail.com</email>
  </committer>
</commit>
