Fix [out, size_is, unique] parameter issues.
Modified: trunk/reactos/tools/widl/ChangeLog
Modified: trunk/reactos/tools/widl/client.c
Modified: trunk/reactos/tools/widl/server.c

Modified: trunk/reactos/tools/widl/ChangeLog
--- trunk/reactos/tools/widl/ChangeLog	2005-10-16 14:24:11 UTC (rev 18498)
+++ trunk/reactos/tools/widl/ChangeLog	2005-10-16 15:27:38 UTC (rev 18499)
@@ -1,5 +1,12 @@
 ChangeLog
 
+2005-10-16 ekohl
+
+   tools/widl/client.c
+   tools/widl/server.c
+
+- Fix [out, size_is, unique] parameter issues.
+
 2005-10-09 ekohl
 
    tools/widl/client.c

Modified: trunk/reactos/tools/widl/client.c
--- trunk/reactos/tools/widl/client.c	2005-10-16 14:24:11 UTC (rev 18498)
+++ trunk/reactos/tools/widl/client.c	2005-10-16 15:27:38 UTC (rev 18499)
@@ -518,7 +518,13 @@
                         if (type != NULL)
                             type_type = type->type;
 
-                        print_client("0x11, 0x00,    /* FC_RP */\n");
+                        if (ref_attr)
+                            print_client("0x11, 0x00,    /* FC_RP */\n");
+                        else if (unique_attr)
+                            print_client("0x12, 0x00,    /* FC_UP */\n");
+                        else if (ptr_attr)
+                            print_client("0x14, 0x00,    /* FC_FP */\n");
+
                         print_client("NdrFcShort(0x02),\n");
 
                         if (string_attr)
@@ -873,10 +879,6 @@
                         if ((var->type->type == RPC_FC_CHAR ||
                              var->type->type == RPC_FC_WCHAR))
                         {
-                            if (ptr_attr)
-                            {
-                                /* FIXME: not supported yet */
-                            }
                             if (ref_attr)
                             {
                                 print_client("NdrConformantStringBufferSize(\n");
@@ -899,6 +901,10 @@
                                 nothing_printed = 1;
                                 indent--;
                             }
+                            else if (ptr_attr)
+                            {
+                                /* FIXME: not supported yet */
+                            }
                         }
                     }
                     else
@@ -910,14 +916,32 @@
                                          ((var_t *)sizeis_attr)->name);
                             fprintf(client, "\n");
 
-                            print_client("NdrConformantArrayBufferSize(\n");
-                            indent++;
-                            print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
-                            print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
-                            print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
-                                         local_type_offset + 4);
-                            indent--;
-                            nothing_printed = 1;
+                            if (ref_attr)
+                            {
+                                print_client("NdrConformantArrayBufferSize(\n");
+                                indent++;
+                                print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+                                print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
+                                print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
+                                             local_type_offset + 4);
+                                indent--;
+                                nothing_printed = 1;
+                            }
+                            else if (unique_attr)
+                            {
+                                print_client("NdrPointerBufferSize(\n");
+                                indent++;
+                                print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+                                print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
+                                print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
+                                             local_type_offset);
+                                nothing_printed = 1;
+                                indent--;
+                            }
+                            else if (ptr_attr)
+                            {
+                                /* FIXME: not supported yet */
+                            }
                         }
                     }
                 }
@@ -945,6 +969,7 @@
     int ptr_attr, ref_attr, unique_attr;
     void *sizeis_attr;
     var_t *var;
+    int default_align = 0;
 
     if (!func->args)
         return;
@@ -980,25 +1005,25 @@
                 string_attr = is_attr(var->attrs, ATTR_STRING);
                 sizeis_attr = get_attrp(var->attrs, ATTR_SIZEIS);
 
-                if (sizeis_attr)
+                if (ref_attr)
                 {
-                    print_client("_StubMsg.MaxCount = %s;\n",
-                                 ((var_t *)sizeis_attr)->name);
-                    fprintf(client, "\n");
+                    if (sizeis_attr)
+                    {
+                        print_client("_StubMsg.MaxCount = %s;\n",
+                                     ((var_t *)sizeis_attr)->name);
+                        fprintf(client, "\n");
 
-                    print_client("NdrConformantArrayMarshall(\n");
-                    indent++;
-                    print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
-                    print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
-                    print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
-                                 local_type_offset + 4);
-                    indent--;
-                    fprintf(client, "\n");
-                    print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                    fprintf(client, "\n");
-                }
-                else if (ref_attr)
-                {
+                        print_client("NdrConformantArrayMarshall(\n");
+                        indent++;
+                        print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+                        print_client("(unsigned char __RPC_FAR *)%s,\n", var->name);
+                        print_client("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
+                                     local_type_offset + 4);
+                        indent--;
+                        fprintf(client, "\n");
+                        default_align = 1;
+                    }
+                    else
                     if (string_attr &&
                         (var->type->type == RPC_FC_CHAR || var->type->type == RPC_FC_WCHAR))
                     {
@@ -1010,8 +1035,7 @@
                                      local_type_offset + 2);
                         indent--;
                         fprintf(client, "\n");
-                        print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                        fprintf(client, "\n");
+                        default_align = 1;
                     }
                     else
                     {
@@ -1060,6 +1084,13 @@
 
                         if (size != 0)
                         {
+                            if (default_align)
+                            {
+                                print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+                                fprintf(client, "\n");
+                                default_align = 0;
+                            }
+                            else
                             if (alignment != 0)
                                 print_client("_StubMsg.Buffer += %u;\n", alignment);
 
@@ -1081,6 +1112,13 @@
                 }
                 else if (unique_attr)
                 {
+                    if (sizeis_attr)
+                    {
+                        print_client("_StubMsg.MaxCount = %s;\n",
+                                     ((var_t *)sizeis_attr)->name);
+                        fprintf(client, "\n");
+                    }
+
                     print_client("NdrPointerMarshall(\n");
                     indent++;
                     print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
@@ -1089,6 +1127,7 @@
                                  local_type_offset);
                     indent--;
                     fprintf(client, "\n");
+                    default_align = 1;
                 }
             }
             else
@@ -1140,6 +1179,14 @@
 
                     if (size != 0)
                     {
+                        if (default_align)
+                        {
+                            fprintf(client, "\n");
+                            print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+                            fprintf(client, "\n");
+                            default_align = 0;
+                        }
+                        else
                         if (alignment != 0)
                             print_client("_StubMsg.Buffer += %u;\n", alignment);
 
@@ -1170,6 +1217,7 @@
                                      local_type_offset + 4);
                         indent--;
                         fprintf(client, "\n");
+                        default_align = 1;
                     }
                 }
             }
@@ -1193,6 +1241,7 @@
     var_t *var;
     var_t *def;
     unsigned int local_type_offset = *type_offset;
+    int default_align = 0;
 
     def = func->def;
 
@@ -1236,8 +1285,7 @@
                         print_client("(unsigned char)0);\n");
                         indent--;
                         fprintf(client, "\n");
-                        print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                        fprintf(client, "\n");
+                        default_align = 1;
                     }
                     else
                     {
@@ -1251,8 +1299,7 @@
                         print_client("(unsigned char)0);\n");
                         indent--;
                         fprintf(client, "\n");
-                        print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                        fprintf(client, "\n");
+                        default_align = 1;
                     }
                 }
                 else if (is_base_type(var->type))
@@ -1304,12 +1351,9 @@
                     {
                         if (var->ptr_level == 1)
                         {
-                            fprintf(client, "\n");
-                            if (alignment != 0)
-                                print_client("_StubMsg.Buffer += %u;\n", alignment);
-
                             if (unique_attr)
                             {
+                                fprintf(client, "\n");
                                 print_client("NdrPointerUnmarshall(\n");
                                 indent++;
                                 print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
@@ -1319,9 +1363,22 @@
                                 print_client("(unsigned char)0);\n");
                                 indent--;
                                 fprintf(client, "\n");
+                                default_align = 1;
                             }
                             else
                             {
+                                fprintf(client, "\n");
+                                if (default_align)
+                                {
+                                    print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+                                    fprintf(client, "\n");
+                                    default_align = 0;
+                                }
+                                else
+                                if (alignment != 0)
+                                    print_client("_StubMsg.Buffer += %u;\n", alignment);
+
+
                                 print_client("*");
                                 write_name(client, var);
                                 fprintf(client, " = *((");
@@ -1351,6 +1408,7 @@
                         print_client("(unsigned char)0);\n");
                         indent--;
                         fprintf(client, "\n");
+                        default_align = 1;
                     }
                 }
                 else
@@ -1400,6 +1458,13 @@
         }
 
        fprintf(client, "\n");
+       if (default_align)
+       {
+           print_client("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+           fprintf(client, "\n");
+           default_align = 0;
+       }
+       else
        if (alignment != 0)
            print_client("_StubMsg.Buffer += %u;\n", alignment);
        print_client("_RetVal = *((");

Modified: trunk/reactos/tools/widl/server.c
--- trunk/reactos/tools/widl/server.c	2005-10-16 14:24:11 UTC (rev 18498)
+++ trunk/reactos/tools/widl/server.c	2005-10-16 15:27:38 UTC (rev 18499)
@@ -515,7 +515,12 @@
                         if (type != NULL)
                             type_type = type->type;
 
-                        print_server("0x11, 0x00,    /* FC_RP */\n");
+                        if (ref_attr)
+                            print_server("0x11, 0x00,    /* FC_RP */\n");
+                        else if (unique_attr)
+                            print_server("0x12, 0x00,    /* FC_UP */\n");
+                        else if (ptr_attr)
+                            print_server("0x14, 0x00,    /* FC_FP */\n");
                         print_server("NdrFcShort(0x02),\n");
 
                         if (string_attr)
@@ -622,7 +627,7 @@
     int last_size = -1;
     int in_attr;
     int out_attr;
-    int string_attr;
+    int string_attr, unique_attr;
     void *sizeis_attr;
     int empty_line;
     var_t *var;
@@ -892,6 +897,7 @@
             out_attr = is_attr(var->attrs, ATTR_OUT);
             in_attr = is_attr(var->attrs, ATTR_IN);
             string_attr = is_attr(var->attrs, ATTR_STRING);
+            unique_attr = is_attr(var->attrs, ATTR_UNIQUE);
 
             /* set 'in' attribute if neither 'in' nor 'out' is found */
             if (!out_attr && !in_attr)
@@ -899,6 +905,7 @@
 
             if (var->ptr_level == 1 &&
                 string_attr &&
+                unique_attr == 0 &&
                 (var->type->type == RPC_FC_BYTE ||
                  var->type->type == RPC_FC_CHAR ||
                  var->type->type == RPC_FC_WCHAR))
@@ -968,6 +975,7 @@
     int string_attr;
     int ptr_attr, ref_attr, unique_attr;
     void *sizeis_attr;
+    int default_align = 0;
 
     if (!func->args)
         return;
@@ -1011,23 +1019,21 @@
                             print_server("(unsigned char)0);\n");
                             indent--;
                             fprintf(server, "\n");
-                            print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                            fprintf(server, "\n");
+                            default_align = 1;
                         }
                     }
                     else if (sizeis_attr)
                     {
-                            print_server("NdrConformantArrayUnmarshall(\n");
-                            indent++;
-                            print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
-                            print_server("(unsigned char __RPC_FAR * __RPC_FAR *)&%s,\n", var->name);
-                            print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u],\n",
-                                         local_type_offset + 4);
-                            print_server("(unsigned char)0);\n");
-                            indent--;
-                            fprintf(server, "\n");
-                            print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                            fprintf(server, "\n");
+                        print_server("NdrConformantArrayUnmarshall(\n");
+                        indent++;
+                        print_server("(PMIDL_STUB_MESSAGE)&_StubMsg,\n");
+                        print_server("(unsigned char __RPC_FAR * __RPC_FAR *)&%s,\n", var->name);
+                        print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u],\n",
+                                     local_type_offset + 4);
+                        print_server("(unsigned char)0);\n");
+                        indent--;
+                        fprintf(server, "\n");
+                        default_align = 1;
                     }
                     else
                     {
@@ -1076,6 +1082,13 @@
 
                         if (size != 0)
                         {
+                            if (default_align)
+                            {
+                                print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+                                fprintf(server, "\n");
+                                default_align = 0;
+                            }
+                            else
                             if (alignment != 0)
                                 print_server("_StubMsg.Buffer += %u;\n", alignment);
 
@@ -1104,6 +1117,7 @@
                     print_server("(unsigned char)0);\n");
                     indent--;
                     fprintf(server, "\n");
+                    default_align = 1;
                 }
 
             }
@@ -1156,6 +1170,13 @@
 
                     if (size != 0)
                     {
+                        if (default_align)
+                        {
+                            print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+                            fprintf(server, "\n");
+                            default_align = 0;
+                        }
+                        else
                         if (alignment != 0)
                             print_server("_StubMsg.Buffer += %u;\n", alignment);
 
@@ -1185,6 +1206,7 @@
                         print_server("(unsigned char)0);\n");
                         indent--;
                         fprintf(server, "\n");
+                        default_align = 1;
                     }
                 }
             }
@@ -1208,6 +1230,7 @@
     int ptr_attr, ref_attr, unique_attr;
     void *sizeis_attr;
     unsigned int local_type_offset = *type_offset;
+    int default_align = 0;
 
     def = func->def;
 
@@ -1249,8 +1272,7 @@
                                      local_type_offset + 4);
                         indent--;
                         fprintf(server, "\n");
-                        print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                        fprintf(server, "\n");
+                        default_align = 1;
                     }
                     else
                     {
@@ -1269,8 +1291,7 @@
                                      local_type_offset + 4);
                         indent--;
                         fprintf(server, "\n");
-                        print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
-                        fprintf(server, "\n");
+                        default_align = 1;
                     }
                 }
                 else if (is_base_type(var->type))
@@ -1320,9 +1341,6 @@
 
                     if (size != 0)
                     {
-                        if (alignment != 0)
-                            print_server("_StubMsg.Buffer += %u;\n", alignment);
-
                         if (var->ptr_level == 1)
                         {
                             if (unique_attr)
@@ -1335,9 +1353,20 @@
                                              local_type_offset);
                                 indent--;
                                 fprintf(server, "\n");
+                                default_align = 1;
                             }
                             else
                             {
+                                if (default_align)
+                                {
+                                    print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+                                    fprintf(server, "\n");
+                                    default_align = 0;
+                                }
+                                else
+                                if (alignment != 0)
+                                    print_server("_StubMsg.Buffer += %u;\n", alignment);
+
                                 fprintf(server, "\n");
                                 print_server("*((");
                                 write_type(server, var->type, NULL, var->tname);
@@ -1369,6 +1398,7 @@
                     print_server("(PFORMAT_STRING)&__MIDL_TypeFormatString.Format[%u]);\n",
                                  local_type_offset + 4);
                     indent--;
+                    default_align = 1;
                 }
             }
 
@@ -1411,6 +1441,13 @@
         }
 
         fprintf(server, "\n");
+        if (default_align)
+        {
+            print_server("_StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~0x3);\n");
+            fprintf(server, "\n");
+            default_align = 0;
+        }
+        else
         if (alignment != 0)
             print_server("_StubMsg.Buffer += %u;\n", alignment);
         print_server("*((");
@@ -1450,7 +1487,7 @@
 static void cleanup_return_buffer(func_t *func, unsigned int *type_offset)
 {
     var_t *var;
-    int string_attr;
+    int string_attr, unique_attr;
     void *sizeis_attr;
     unsigned int local_type_offset = *type_offset;
 
@@ -1464,8 +1501,9 @@
         {
             sizeis_attr = get_attrp(var->attrs, ATTR_SIZEIS);
             string_attr = is_attr(var->attrs, ATTR_STRING);
+            unique_attr = is_attr(var->attrs, ATTR_UNIQUE);
 
-            if (sizeis_attr != NULL)
+            if (sizeis_attr != NULL && unique_attr == 0)
             {
                 if (first_arg == 0)
                     fprintf(server, "\n");