Implement DceErrorInqText (Take 3)
Bill Medland
billmedland at mercuryspeed.com
Wed Dec 22 11:34:45 CST 2004
Bill Medland (billmedland at mercuryspeed.com)
Implement DceErrorInqText
Index: wine/dlls/rpcrt4/rpcrt4.spec
===================================================================
RCS file: /home/wine/wine/dlls/rpcrt4/rpcrt4.spec,v
retrieving revision 1.50
diff -u -r1.50 rpcrt4.spec
--- wine/dlls/rpcrt4/rpcrt4.spec 18 Oct 2004 19:37:42 -0000 1.50
+++ wine/dlls/rpcrt4/rpcrt4.spec 22 Dec 2004 17:32:17 -0000
@@ -1,5 +1,5 @@
-@ stub DceErrorInqTextA
-@ stub DceErrorInqTextW
+@ stdcall DceErrorInqTextA (long ptr)
+@ stdcall DceErrorInqTextW (long ptr)
@ stdcall -private DllRegisterServer() RPCRT4_DllRegisterServer
@ stub MesBufferHandleReset
Index: wine/dlls/rpcrt4/rpcrt4_main.c
===================================================================
RCS file: /home/wine/wine/dlls/rpcrt4/rpcrt4_main.c,v
retrieving revision 1.50
diff -u -r1.50 rpcrt4_main.c
--- wine/dlls/rpcrt4/rpcrt4_main.c 22 Sep 2004 02:46:39 -0000 1.50
+++ wine/dlls/rpcrt4/rpcrt4_main.c 22 Dec 2004 17:32:17 -0000
@@ -748,3 +748,55 @@
return TRUE;
}
+
+/* DceErrorInqText
+ *
+ * Notes
+ * 1. On passing a NULL pointer the code does bomb out.
+ * 2. The size of the required buffer is not defined in the documentation.
+ * It appears to be 255 or 256. It is at least 251 and less than 277
+ * 3. The function is defined to return RPC_S_INVALID_ARG but I don't know
+ * of any value for which it does.
+ * 4. The MSDN documentation currently declares that the second argument is
+ * unsigned char *, even for the W version. I don't believe it.
+ */
+
+#define MAX_RPC_ERROR_TEXT 255
+/* or is it 256 */
+
+RPC_STATUS RPC_ENTRY DceErrorInqTextW (unsigned long e, unsigned short *b)
+{
+ DWORD count;
+ count = FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, e, 0, b, MAX_RPC_ERROR_TEXT, NULL);
+ if (!count)
+ {
+ count = FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, RPC_S_NOT_RPC_ERROR, 0, b, MAX_RPC_ERROR_TEXT, NULL);
+ if (!count)
+ {
+ ERR ("Failed to translate error");
+ return RPC_S_INVALID_ARG;
+ }
+ }
+ return RPC_S_OK;
+}
+
+RPC_STATUS RPC_ENTRY DceErrorInqTextA (unsigned long e, unsigned char *b)
+{
+ RPC_STATUS status;
+ WCHAR buffer [MAX_RPC_ERROR_TEXT];
+ if ((status = DceErrorInqTextW (e, buffer)) == RPC_S_OK)
+ {
+ if (!WideCharToMultiByte(CP_ACP, 0, buffer, -1, b, MAX_RPC_ERROR_TEXT,
+ NULL, NULL))
+ {
+ ERR ("Failed to translate error");
+ status = RPC_S_INVALID_ARG;
+ }
+ }
+ return status;
+}
+
Index: wine/dlls/rpcrt4/tests/rpc.c
===================================================================
RCS file: /home/wine/wine/dlls/rpcrt4/tests/rpc.c,v
retrieving revision 1.5
diff -u -r1.5 rpc.c
--- wine/dlls/rpcrt4/tests/rpc.c 26 Jan 2004 20:23:34 -0000 1.5
+++ wine/dlls/rpcrt4/tests/rpc.c 22 Dec 2004 17:32:17 -0000
@@ -28,6 +28,7 @@
#include "wine/unicode.h"
#include "rpc.h"
+#include "rpcdce.h"
static UUID Uuid_Table[10] = {
{ 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }, /* 0 (null) */
@@ -122,8 +123,52 @@
}
}
+void TestDceErrorInqText (void)
+{
+ char bufferInvalid [1024];
+ char buffer [1024]; /* The required size is not documented but would
+ * appear to be 255 or 256.
+ */
+ DWORD dwCount;
+
+ dwCount = FormatMessageA (FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, RPC_S_NOT_RPC_ERROR, 0, bufferInvalid,
+ sizeof(bufferInvalid)/sizeof(bufferInvalid[0]), NULL);
+
+ /* A random sample of DceErrorInqText */
+ /* 0 is success */
+ ok ((DceErrorInqTextA (0, buffer) == RPC_S_OK),
+ "DceErrorInqTextA(0...)\n");
+ /* A real RPC_S error */
+ ok ((DceErrorInqTextA (RPC_S_INVALID_STRING_UUID, buffer) == RPC_S_OK),
+ "DceErrorInqTextA(valid...)\n");
+
+ if (dwCount)
+ {
+ /* A message for which FormatMessage should fail
+ * which should return RPC_S_OK and the
+ * fixed "not valid" message
+ */
+ ok ((DceErrorInqTextA (35, buffer) == RPC_S_OK &&
+ strcmp (buffer, bufferInvalid) == 0),
+ "DceErrorInqTextA(unformattable...)\n");
+ /* One for which FormatMessage should succeed but
+ * DceErrorInqText should "fail"
+ * 3814 is generally quite a long message
+ */
+ ok ((DceErrorInqTextA (3814, buffer) == RPC_S_OK &&
+ strcmp (buffer, bufferInvalid) == 0),
+ "DceErrorInqTextA(deviation...)\n");
+ }
+ else
+ ok (0, "Cannot set up for DceErrorInqText\n");
+}
+
START_TEST( rpc )
{
trace ( " ** Uuid Conversion and Comparison Tests **\n" );
UuidConversionAndComparison();
+ trace ( " ** DceErrorInqText **\n");
+ TestDceErrorInqText();
}
More information about the wine-patches
mailing list