Hans Leidekker : wordpad: Open .wri files in wordpad.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Feb 12 09:24:01 CST 2007


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

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Sat Feb 10 22:55:29 2007 +0100

wordpad: Open .wri files in wordpad.

---

 programs/wordpad/wordpad.c |  120 +++++++++++++++++++++++++++++++++++++++++++-
 tools/wine.inf             |    3 +
 2 files changed, 121 insertions(+), 2 deletions(-)

diff --git a/programs/wordpad/wordpad.c b/programs/wordpad/wordpad.c
index 9afcc5d..7269272 100644
--- a/programs/wordpad/wordpad.c
+++ b/programs/wordpad/wordpad.c
@@ -41,7 +41,8 @@ static const WCHAR wszRichEditClass[] =
 static const WCHAR wszMainWndClass[] = {'W','O','R','D','P','A','D','T','O','P',0};
 static const WCHAR wszAppTitle[] = {'W','i','n','e',' ','W','o','r','d','p','a','d',0};
 
-static HWND hMainWnd = NULL;
+static HWND hMainWnd;
+static HWND hEditorWnd;
 
 static void AddButton(HWND hwndToolBar, int nImage, int nCommand)
 {
@@ -71,9 +72,122 @@ static void AddSeparator(HWND hwndToolBa
     SendMessage(hwndToolBar, TB_ADDBUTTONS, 1, (LPARAM)&button);
 }
 
+static LPSTR stream_buffer;
+static LONG  stream_buffer_size;
+
+static DWORD CALLBACK stream_in(DWORD_PTR cookie, LPBYTE buffer, LONG cb, LONG *pcb)
+{
+    LONG size = min(stream_buffer_size, cb);
+
+    memcpy(buffer, stream_buffer, size);
+    stream_buffer_size -= size;
+    stream_buffer += size;
+    *pcb = size;
+    return 0;
+}
+
+static void DoOpenFile(LPCWSTR szFileName)
+{
+    HANDLE hFile;
+    LPSTR pTemp;
+    DWORD size;
+    DWORD dwNumRead;
+    EDITSTREAM es;
+
+    hFile = CreateFileW(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
+                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+    if (hFile == INVALID_HANDLE_VALUE)
+        return;
+
+    size = GetFileSize(hFile, NULL);
+    if (size == INVALID_FILE_SIZE)
+    {
+        CloseHandle(hFile);
+        return;
+    }
+    size++;
+
+    pTemp = HeapAlloc(GetProcessHeap(), 0, size);
+    if (!pTemp)
+    {
+        CloseHandle(hFile);
+        return;
+    }
+
+    if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL))
+    {
+        CloseHandle(hFile);
+        HeapFree(GetProcessHeap(), 0, pTemp);
+        return;
+    }
+    CloseHandle(hFile);
+    pTemp[dwNumRead] = 0;
+
+    memset(&es, 0, sizeof(es));
+    es.pfnCallback = stream_in;
+
+    stream_buffer = pTemp;
+    stream_buffer_size = size;
+
+    SendMessage(hEditorWnd, EM_STREAMIN, SF_RTF, (LPARAM)&es);
+    HeapFree(GetProcessHeap(), 0, pTemp);
+
+    SetFocus(hEditorWnd);
+}
+
+static void HandleCommandLine(LPWSTR cmdline)
+{
+    WCHAR delimiter;
+    int opt_print = 0;
+
+    /* skip white space */
+    while (*cmdline == ' ') cmdline++;
+
+    /* skip executable name */
+    delimiter = (*cmdline == '"' ? '"' : ' ');
+
+    if (*cmdline == delimiter) cmdline++;
+    while (*cmdline && *cmdline != delimiter) cmdline++;
+    if (*cmdline == delimiter) cmdline++;
+
+    while (*cmdline == ' ' || *cmdline == '-' || *cmdline == '/')
+    {
+        WCHAR option;
+
+        if (*cmdline++ == ' ') continue;
+
+        option = *cmdline;
+        if (option) cmdline++;
+        while (*cmdline == ' ') cmdline++;
+
+        switch (option)
+        {
+            case 'p':
+            case 'P':
+                opt_print = 1;
+                break;
+        }
+    }
+
+    if (*cmdline)
+    {
+        /* file name is passed on the command line */
+        if (cmdline[0] == '"')
+        {
+            cmdline++;
+            cmdline[lstrlenW(cmdline) - 1] = 0;
+        }
+        DoOpenFile(cmdline);
+        InvalidateRect(hMainWnd, NULL, FALSE);
+    }
+
+    if (opt_print)
+        MessageBox(hMainWnd, "Printing not implemented", "WordPad", MB_OK);
+}
+
 static LRESULT OnCreate( HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
-    HWND hEditorWnd, hToolBarWnd, hReBarWnd;
+    HWND hToolBarWnd, hReBarWnd;
     HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE);
     HANDLE hDLL;
     TBADDBITMAP ab;
@@ -500,6 +614,8 @@ int CALLBACK WinMain(HINSTANCE hInstance
       CW_USEDEFAULT, CW_USEDEFAULT, 680, 260, NULL, NULL, hInstance, NULL);
     ShowWindow(hMainWnd, SW_SHOWMAXIMIZED);
 
+    HandleCommandLine(GetCommandLineW());
+
     while(GetMessage(&msg,0,0,0))
     {
         if (TranslateAccelerator(hMainWnd, hAccel, &msg))
diff --git a/tools/wine.inf b/tools/wine.inf
index f5672a6..5e68a2a 100644
--- a/tools/wine.inf
+++ b/tools/wine.inf
@@ -99,6 +99,7 @@ HKCR,.msi,,2,"Msi.Package"
 HKCR,.tif,"Content Type",2,"image/tiff"
 HKCR,.tiff,"Content Type",2,"image/tiff"
 HKCR,.txt,,2,"txtfile"
+HKCR,.wri,,2,"wrifile"
 HKCR,.wav,"Content Type",2,"audio/wav"
 HKCR,.xml,"Content Type",2,"text/xml"
 HKCR,.xsl,"Content Type",2,"text/xsl"
@@ -123,6 +124,8 @@ HKCR,Msi.Package\shell\Repair\command,,2
 HKCR,Msi.Package\shell\Uninstall\command,,2,"msiexec /x %1"
 HKCR,txtfile\shell\open\command,,2,"%11%\notepad.exe %1"
 HKCR,txtfile\shell\print\command,,2,"%11%\notepad.exe /p %1"
+HKCR,wrifile\shell\open\command,,2,"%11%\wordpad.exe %1"
+HKCR,wrifile\shell\print\command,,2,"%11%\wordpad.exe /p %1"
 HKCR,http\shell\open\command,,2,"winebrowser"
 HKCR,https\shell\open\command,,2,"winebrowser"
 HKCR,mailto\shell\open\command,,2,"winebrowser %1"




More information about the wine-cvs mailing list