<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>utils/libsiren/common.c</filename>
    </added>
    <added>
      <filename>utils/libsiren/common.h</filename>
    </added>
    <added>
      <filename>utils/libsiren/dct4.c</filename>
    </added>
    <added>
      <filename>utils/libsiren/dct4.h</filename>
    </added>
    <added>
      <filename>utils/libsiren/decoder.c</filename>
    </added>
    <added>
      <filename>utils/libsiren/decoder.h</filename>
    </added>
    <added>
      <filename>utils/libsiren/encoder.c</filename>
    </added>
    <added>
      <filename>utils/libsiren/encoder.h</filename>
    </added>
    <added>
      <filename>utils/libsiren/huffman.c</filename>
    </added>
    <added>
      <filename>utils/libsiren/huffman.h</filename>
    </added>
    <added>
      <filename>utils/libsiren/huffman_consts.h</filename>
    </added>
    <added>
      <filename>utils/libsiren/rmlt.c</filename>
    </added>
    <added>
      <filename>utils/libsiren/rmlt.h</filename>
    </added>
    <added>
      <filename>utils/libsiren/siren7.h</filename>
    </added>
    <added>
      <filename>utils/siren7_decoder.c</filename>
    </added>
    <added>
      <filename>utils/siren7_decoder.h</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -13,6 +13,9 @@ Original patch to add support for handwritten messages (read-only):
  * Chris Stafford
  * Gal Topper
 
+Original patch to add support for voice clips (receive-only):
+ * Chris Stafford
+
 Translators:
  * Marco de Moulin &lt;marco@point.nl&gt; (Dutch)
  * Simo Mattila &lt;simo.h.mattila@gmail.com&gt; (Finnish)</diff>
      <filename>AUTHORS</filename>
    </modified>
    <modified>
      <diff>@@ -43,7 +43,7 @@ override CFLAGS += -DPECAN_DEBUG_SLP
 # For glib &lt; 2.6 support (libpurple maniacs)
 FALLBACK_CFLAGS := -I./fix_purple
 
-LDFLAGS := -Wl,--no-undefined
+LDFLAGS := -Wl,--no-undefined,-lm
 
 prefix := $(DESTDIR)/$(PURPLE_PREFIX)
 plugin_dir := $(prefix)/lib/purple-2
@@ -88,6 +88,13 @@ ifdef CVR
 	     cvr/slpmsg.o \
 	     cvr/slpsession.o \
 	     cvr/pecan_slp_object.o
+
+  objects += utils/libsiren/common.o \
+	     utils/libsiren/dct4.o \
+	     utils/libsiren/decoder.o \
+	     utils/libsiren/huffman.o \
+	     utils/libsiren/rmlt.o \
+	     utils/siren7_decoder.o
 endif
 
 ifdef SOCKET</diff>
      <filename>Makefile</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,7 @@ Compared to Pidgin's official MSN plug-in:
  * Experimental direct connection support (fast file transfers)
  * Server-side storage for display names (private alias)
  * Support for handwritten messages (read-only)
+ * Support for voice clips (receive-only)
 
 Other features:
 </diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -65,6 +65,7 @@ typedef enum
 	MSN_CLIENT_CAP_WEBMSGR    = 0x00100,
 	MSN_CLIENT_CAP_DIRECTIM   = 0x04000,
 	MSN_CLIENT_CAP_WINKS      = 0x08000,
+	MSN_CLIENT_CAP_VOICE_CLIP = 0x40000,
 	MSN_CLIENT_CAP_SEARCH     = 0x10000
 
 } MsnClientCaps;
@@ -84,7 +85,7 @@ typedef enum
 #define MSN_CLIENT_ID_RESERVED_1   0x00
 #define MSN_CLIENT_ID_RESERVED_2   0x00
 #if defined(PECAN_CVR)
-#define MSN_CLIENT_ID_CAPABILITIES MSN_CLIENT_CAP_BASE | MSN_CLIENT_CAP_INK_GIF
+#define MSN_CLIENT_ID_CAPABILITIES MSN_CLIENT_CAP_BASE | MSN_CLIENT_CAP_INK_GIF | MSN_CLIENT_CAP_VOICE_CLIP
 #else
 #define MSN_CLIENT_ID_CAPABILITIES MSN_CLIENT_CAP_BASE
 #endif /* defined(PECAN_CVR) */</diff>
      <filename>msn.h</filename>
    </modified>
    <modified>
      <diff>@@ -28,6 +28,7 @@
 
 #if defined(PECAN_CVR)
 #include &quot;cvr/slplink.h&quot;
+#include &quot;utils/siren7_decoder.h&quot;
 #endif /* defined(PECAN_CVR) */
 
 #include &quot;session_private.h&quot;
@@ -1180,6 +1181,76 @@ control_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
     }
 }
 
+#if defined(PECAN_CVR)
+static void
+got_datacast_inform_user (MsnCmdProc *cmdproc,
+                          const char *passport,
+                          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;
+    char *file, *str;
+
+    if ((f = purple_mkstemp(&amp;file, TRUE)))
+    {
+        char *decoded_file = malloc(sizeof(file)+13);
+
+        fwrite(data, size, 1, f);
+        fclose(f);
+
+        strcpy(decoded_file, file);
+        strcat(decoded_file, &quot;_decoded.wav&quot;);
+
+        decode_wav_using_siren7 (file, decoded_file);
+
+        str = g_strdup_printf(&quot;sent you a voice clip. Click &lt;a href='file://%s'&gt;here&lt;/a&gt; to play it.&quot;, decoded_file);
+        got_datacast_inform_user(slpcall-&gt;slplink-&gt;swboard-&gt;cmdproc, slpcall-&gt;slplink-&gt;remote_user, str);
+
+        g_free(str);
+    } else {
+        pecan_error (&quot;couldn't create temporany file to store the received voice clip!\n&quot;);
+
+        str = g_strdup_printf(&quot;sent you a voice clip, but it cannot be played due to an error happened while storing the file.&quot;);
+        got_datacast_inform_user(slpcall-&gt;slplink-&gt;swboard-&gt;cmdproc, slpcall-&gt;slplink-&gt;remote_user, str);
+    }
+}
+#endif /* defined(PECAN_CVR) */
+
 static void
 datacast_msg (MsnCmdProc *cmdproc,
               MsnMessage *msg)
@@ -1204,7 +1275,19 @@ datacast_msg (MsnCmdProc *cmdproc,
     }
     else if (strcmp (id, &quot;3&quot;) == 0)
     {
-        /* voice clips */
+#if defined(PECAN_CVR)
+        const char *data;
+        MsnSlpLink *slplink;
+        MsnObject *obj;
+
+        data = g_hash_table_lookup(body, &quot;Data&quot;);
+        obj = msn_object_new_from_string(data);
+        slplink = msn_session_get_slplink(cmdproc-&gt;session, passport);
+
+        msn_slplink_request_object(slplink, data, got_voice_clip, NULL, obj);
+            
+        msn_object_destroy(obj);
+#endif /* defined(PECAN_CVR) */
     }
     else
     {</diff>
      <filename>switchboard.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8abc7cf84ee11e840d142ceb56ee1181d94ee6d3</id>
    </parent>
  </parents>
  <author>
    <name>Devid Antonio Filoni</name>
    <email>devidfil@gmail.com</email>
  </author>
  <url>http://github.com/felipec/msn-pecan/commit/b7b5c75e375a0ba74df6f7bd0c4546a01263ec68</url>
  <id>b7b5c75e375a0ba74df6f7bd0c4546a01263ec68</id>
  <committed-date>2009-01-17T08:40:03-08:00</committed-date>
  <authored-date>2009-01-03T14:23:24-08:00</authored-date>
  <message>Add support for receiving voice clips. Thanks to Chris Stafford and Youness Alaoui for this.</message>
  <tree>2f40aa63777c429c060e1aed226f948abd8609cb</tree>
  <committer>
    <name>Felipe Contreras</name>
    <email>felipe.contreras@gmail.com</email>
  </committer>
</commit>
