diff --git a/programs/wordpad/wordpad.c b/programs/wordpad/wordpad.c index 9afcc5d368a..7269272e53d 100644 --- a/programs/wordpad/wordpad.c +++ b/programs/wordpad/wordpad.c @@ -41,7 +41,8 @@ static const WCHAR wszRichEditClass[] = {'R','I','C','H','E','D','I','T','2','0' 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 hwndToolBar) 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, HINSTANCE hOldInstance, LPSTR szCmdPar 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 f5672a6654f..5e68a2a0d35 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,"msiexec /f %1" 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"