Implemented interprocess DDE message posting.

diff --git a/server/queue.c b/server/queue.c
index a639ebe..150a213 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -749,7 +749,7 @@
 
         switch(msg->type)
         {
-       case MSG_OTHER_PROCESS:
+        case MSG_OTHER_PROCESS:
             msg->data_size = get_req_data_size();
             if (msg->data_size && !(msg->data = memdup( get_req_data(), msg->data_size )))
             {
@@ -771,6 +771,13 @@
             set_queue_bits( recv_queue, QS_SENDMESSAGE );
             break;
         case MSG_POSTED:
+            /* needed for posted DDE messages */
+            msg->data_size = get_req_data_size();
+            if (msg->data_size && !(msg->data = memdup( get_req_data(), msg->data_size )))
+            {
+                free( msg );
+                break;
+            }
             append_message( &recv_queue->msg_list[POST_MESSAGE], msg );
             set_queue_bits( recv_queue, QS_POSTMESSAGE );
             break;
@@ -803,8 +810,12 @@
                                    struct get_message_reply *reply,
                                    struct message *msg, enum message_kind kind )
 {
-    assert( !msg->data_size );  /* posted messages can't have data */
-
+    reply->total = msg->data_size;
+    if (msg->data_size > get_reply_max_size())
+    {
+        set_error( STATUS_BUFFER_OVERFLOW );
+        return;
+    }
     reply->type   = msg->type;
     reply->win    = msg->win;
     reply->msg    = msg->msg;
@@ -814,16 +825,22 @@
     reply->y      = msg->y;
     reply->time   = msg->time;
     reply->info   = msg->info;
-    reply->total  = 0;
 
     /* raw messages always get removed */
     if ((msg->type == MSG_HARDWARE_RAW) || (flags & GET_MSG_REMOVE))
     {
         queue->last_msg = NULL;
+        if (msg->data)
+        {
+            set_reply_data_ptr( msg->data, msg->data_size );
+            msg->data = NULL;
+            msg->data_size = 0;
+        }
         remove_queue_message( queue, msg, kind );
     }
     else  /* remember it as the last returned message */
     {
+        if (msg->data) set_reply_data( msg->data, msg->data_size );
         queue->last_msg = msg;
         queue->last_msg_kind = kind;
     }