Andrew Nguyen : dxdiag: Add code for plain-text information output.

Alexandre Julliard julliard at winehq.org
Tue Jun 14 11:57:48 CDT 2011


Module: wine
Branch: master
Commit: 8d37cfed44fe95de7f26a9da8200d83a3b051f24
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8d37cfed44fe95de7f26a9da8200d83a3b051f24

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Tue Jun 14 08:02:12 2011 -0500

dxdiag: Add code for plain-text information output.

---

 programs/dxdiag/output.c |  136 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 134 insertions(+), 2 deletions(-)

diff --git a/programs/dxdiag/output.c b/programs/dxdiag/output.c
index effe2a2..5176f69 100644
--- a/programs/dxdiag/output.c
+++ b/programs/dxdiag/output.c
@@ -18,26 +18,157 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
 #include <assert.h>
+#include <stdio.h>
 
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 #include "dxdiag_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
 
+static char output_buffer[1024];
+static const char crlf[2] = "\r\n";
+
+static BOOL output_text_header(HANDLE hFile, const char *caption)
+{
+    DWORD len = strlen(caption);
+    DWORD total_len = 3 * (len + sizeof(crlf));
+    char *ptr = output_buffer;
+
+    assert(total_len <= sizeof(output_buffer));
+
+    memset(ptr, '-', len);
+    ptr += len;
+
+    memcpy(ptr, crlf, sizeof(crlf));
+    ptr += sizeof(crlf);
+
+    memcpy(ptr, caption, len);
+    ptr += len;
+
+    memcpy(ptr, crlf, sizeof(crlf));
+    ptr += sizeof(crlf);
+
+    memset(ptr, '-', len);
+    ptr += len;
+
+    memcpy(ptr, crlf, sizeof(crlf));
+    ptr += sizeof(crlf);
+
+    return WriteFile(hFile, output_buffer, total_len, NULL, NULL);
+}
+
+static BOOL output_text_field(HANDLE hFile, const char *field_name, DWORD field_width, const WCHAR *value)
+{
+    DWORD value_lenW = strlenW(value);
+    DWORD value_lenA = WideCharToMultiByte(CP_ACP, 0, value, value_lenW, NULL, 0, NULL, NULL);
+    DWORD total_len = field_width + sizeof(": ") - 1 + value_lenA + sizeof(crlf);
+    char sprintf_fmt[1 + 10 + 3 + 1];
+    char *ptr = output_buffer;
+
+    assert(total_len <= sizeof(output_buffer));
+
+    sprintf(sprintf_fmt, "%%%us: ", field_width);
+    ptr += sprintf(ptr, sprintf_fmt, field_name);
+
+    ptr += WideCharToMultiByte(CP_ACP, 0, value, value_lenW, ptr, value_lenA, NULL, NULL);
+
+    memcpy(ptr, crlf, sizeof(crlf));
+    ptr += sizeof(crlf);
+
+    return WriteFile(hFile, output_buffer, total_len, NULL, NULL);
+}
+
+static BOOL output_crlf(HANDLE hFile)
+{
+    return WriteFile(hFile, crlf, sizeof(crlf), NULL, NULL);
+}
+
+static BOOL output_text_information(struct dxdiag_information *dxdiag_info, const WCHAR *filename)
+{
+    const struct information_block
+    {
+        const char *caption;
+        size_t field_width;
+        struct information_field
+        {
+            const char *field_name;
+            const WCHAR *value;
+        } fields[50];
+    } output_table[] =
+    {
+        {"System Information", 19,
+            {
+                {"Time of this report", dxdiag_info->system_info.szTimeEnglish},
+                {"Machine name", dxdiag_info->system_info.szMachineNameEnglish},
+                {"Operating System", dxdiag_info->system_info.szOSExLongEnglish},
+                {"Language", dxdiag_info->system_info.szLanguagesEnglish},
+                {"System Manufacturer", dxdiag_info->system_info.szSystemManufacturerEnglish},
+                {"System Model", dxdiag_info->system_info.szSystemManufacturerEnglish},
+                {"BIOS", dxdiag_info->system_info.szSystemManufacturerEnglish},
+                {"Processor", dxdiag_info->system_info.szProcessorEnglish},
+                {"Memory", dxdiag_info->system_info.szPhysicalMemoryEnglish},
+                {"Page File", dxdiag_info->system_info.szPageFileEnglish},
+                {"Windows Dir", dxdiag_info->system_info.szWindowsDir},
+                {"DirectX Version", dxdiag_info->system_info.szDirectXVersionLongEnglish},
+                {"DX Setup Parameters", dxdiag_info->system_info.szSetupParamEnglish},
+                {"DxDiag Version", dxdiag_info->system_info.szDxDiagVersion},
+                {NULL, NULL},
+            }
+        },
+    };
+
+    HANDLE hFile;
+    size_t i;
+
+    hFile = CreateFileW(filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+                        NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+    if (hFile == INVALID_HANDLE_VALUE)
+    {
+        WINE_ERR("File creation failed, last error %u\n", GetLastError());
+        return FALSE;
+    }
+
+    for (i = 0; i < sizeof(output_table)/sizeof(output_table[0]); i++)
+    {
+        const struct information_field *fields = output_table[i].fields;
+        unsigned int j;
+
+        output_text_header(hFile, output_table[i].caption);
+        for (j = 0; fields[j].field_name; j++)
+            output_text_field(hFile, fields[j].field_name, output_table[i].field_width, fields[j].value);
+        output_crlf(hFile);
+    }
+
+    CloseHandle(hFile);
+    return FALSE;
+}
+
+static BOOL output_xml_information(struct dxdiag_information *dxdiag_info, const WCHAR *filename)
+{
+    WINE_FIXME("XML information output is not implemented\n");
+    return FALSE;
+}
+
 static struct output_backend
 {
     const WCHAR filename_ext[5];
+    BOOL (*output_handler)(struct dxdiag_information *, const WCHAR *filename);
 } output_backends[] =
 {
     /* OUTPUT_TEXT */
     {
         {'.','t','x','t',0},
+        output_text_information,
     },
     /* OUTPUT_XML */
     {
         {'.','x','m','l',0},
+        output_xml_information,
     },
 };
 
@@ -50,6 +181,7 @@ const WCHAR *get_output_extension(enum output_type type)
 
 BOOL output_dxdiag_information(struct dxdiag_information *dxdiag_info, const WCHAR *filename, enum output_type type)
 {
-    WINE_FIXME("File information output is not implemented\n");
-    return FALSE;
+    assert(type > OUTPUT_NONE && type <= sizeof(output_backends)/sizeof(output_backends[0]));
+
+    return output_backends[type - 1].output_handler(dxdiag_info, filename);
 }




More information about the wine-cvs mailing list