Add small utility to download/install Firefox Modified: trunk/reactos/apps/utils/directory.xml Added: trunk/reactos/apps/utils/getfirefox/ Added: trunk/reactos/apps/utils/getfirefox/En.rc Added: trunk/reactos/apps/utils/getfirefox/firefox.ico Added: trunk/reactos/apps/utils/getfirefox/getfirefox.c Added: trunk/reactos/apps/utils/getfirefox/getfirefox.rc Added: trunk/reactos/apps/utils/getfirefox/getfirefox.xml Added: trunk/reactos/apps/utils/getfirefox/precomp.h Added: trunk/reactos/apps/utils/getfirefox/resource.h Modified: trunk/reactos/bootdata/packages/reactos.dff Modified: trunk/reactos/lib/syssetup/install.c Modified: trunk/reactos/lib/syssetup/resource.h Modified: trunk/reactos/lib/syssetup/syssetup_En.rc _____
Modified: trunk/reactos/apps/utils/directory.xml --- trunk/reactos/apps/utils/directory.xml 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/apps/utils/directory.xml 2005-12-12 00:23:07 UTC (rev 20096) @@ -2,6 +2,9 @@
<directory name="net"> <xi:include href="net/directory.xml" /> </directory> +<directory name="getfirefox"> + <xi:include href="getfirefox/getfirefox.xml" /> +</directory> <directory name="shutdown"> <xi:include href="shutdown/shutdown.xml" /> </directory> Property changes on: trunk/reactos/apps/utils/getfirefox ___________________________________________________________________ Name: svn:ignore + GNUmakefile _____
Added: trunk/reactos/apps/utils/getfirefox/En.rc --- trunk/reactos/apps/utils/getfirefox/En.rc 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/apps/utils/getfirefox/En.rc 2005-12-12 00:23:07 UTC (rev 20096) @@ -0,0 +1,44 @@
+/* + * PROJECT: ReactOS utilities + * LICENSE: GPL - See COPYING in the top level directory + * FILE: apps/utils/getfirefox/En.rc + * PURPOSE: English resources + * COPYRIGHT: Copyright 2004 Mike McCormack for CodeWeavers + * Copyright 2005 Ge van Geldorp (gvg@reactos.org) + */ +/* + * Based on Wine dlls/shdocvw/En.rc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +IDD_GETFIREFOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76 +STYLE DS_MODALFRAME | DS_CENTER | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Downloading Firefox" +FONT 8, "MS Shell Dlg" +{ + CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER|PBS_SMOOTH,10,10, 200,12 + LTEXT "", IDC_STATUS, 10, 30, 200, 10, SS_CENTER + CHECKBOX "Remove "Get Firefox" from Start Menu when done", IDC_REMOVE, + 10, 44, 200, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 85, 58, 50, 15, WS_GROUP | WS_TABSTOP +} + +STRINGTABLE +BEGIN + IDS_START_MENU_NAME "Get Firefox" +END Property changes on: trunk/reactos/apps/utils/getfirefox/En.rc ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: trunk/reactos/apps/utils/getfirefox/firefox.ico (Binary files differ) Property changes on: trunk/reactos/apps/utils/getfirefox/firefox.ico ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + application/octet-stream _____
Added: trunk/reactos/apps/utils/getfirefox/getfirefox.c --- trunk/reactos/apps/utils/getfirefox/getfirefox.c 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/apps/utils/getfirefox/getfirefox.c 2005-12-12 00:23:07 UTC (rev 20096) @@ -0,0 +1,378 @@
+/* + * PROJECT: ReactOS utilities + * LICENSE: GPL - See COPYING in the top level directory + * FILE: apps/utils/getfirefox/getfirefox.c + * PURPOSE: Main program + * COPYRIGHT: Copyright 2001 John R. Sheets (for CodeWeavers) + * Copyright 2004 Mike McCormack (for CodeWeavers) + * Copyright 2005 Ge van Geldorp (gvg@reactos.org) + */ +/* + * Based on Wine dlls/shdocvw/shdocvw_main.c + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include <precomp.h> + +#define NDEBUG +#include <debug.h> + +#define DOWNLOAD_URL L"http://links.reactos.org/getfirefox" + +typedef struct _IBindStatusCallbackImpl + { + const IBindStatusCallbackVtbl *vtbl; + LONG ref; + HWND hDialog; + BOOL *pbCancelled; + } IBindStatusCallbackImpl; + +static HRESULT WINAPI +dlQueryInterface(IBindStatusCallback* This, REFIID riid, void** ppvObject) +{ + if (NULL == ppvObject) + { + return E_POINTER; + } + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IBindStatusCallback)) + { + IBindStatusCallback_AddRef( This ); + *ppvObject = This; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI +dlAddRef(IBindStatusCallback* iface) +{ + IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface; + + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI +dlRelease(IBindStatusCallback* iface) +{ + IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface; + DWORD ref = InterlockedDecrement(&This->ref); + + if( !ref ) + { + DestroyWindow( This->hDialog ); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI +dlOnStartBinding(IBindStatusCallback* iface, DWORD dwReserved, IBinding* pib) +{ + DPRINT1("OnStartBinding not implemented\n"); + + return S_OK; +} + +static HRESULT WINAPI +dlGetPriority(IBindStatusCallback* iface, LONG* pnPriority) +{ + DPRINT1("GetPriority not implemented\n"); + + return S_OK; +} + +static HRESULT WINAPI +dlOnLowResource( IBindStatusCallback* iface, DWORD reserved) +{ + DPRINT1("OnLowResource not implemented\n"); + + return S_OK; +} + +static HRESULT WINAPI +dlOnProgress(IBindStatusCallback* iface, ULONG ulProgress, + ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) +{ + IBindStatusCallbackImpl *This = (IBindStatusCallbackImpl *) iface; + HWND Item; + LONG r; + WCHAR OldText[100]; + + Item = GetDlgItem(This->hDialog, IDC_PROGRESS); + if (NULL != Item && 0 != ulProgressMax) + { + SendMessageW(Item, PBM_SETPOS, (ulProgress * 100) / ulProgressMax, 0); + } + + Item = GetDlgItem(This->hDialog, IDC_STATUS); + if (NULL != Item) + { + SendMessageW(Item, WM_GETTEXT, sizeof(OldText) / sizeof(OldText[0]), + (LPARAM) OldText); + if (sizeof(OldText) / sizeof(OldText[0]) - 1 <= wcslen(OldText) || + 0 != wcscmp(OldText, szStatusText)) + { + SendMessageW(Item, WM_SETTEXT, 0, (LPARAM) szStatusText); + } + } + + SetLastError(0); + r = GetWindowLongPtrW(This->hDialog, GWLP_USERDATA); + if (0 != r || 0 != GetLastError()) + { + *This->pbCancelled = TRUE; + DPRINT("Cancelled\n"); + return E_ABORT; + } + + return S_OK; +} + +static HRESULT WINAPI +dlOnStopBinding(IBindStatusCallback* iface, HRESULT hresult, LPCWSTR szError) +{ + DPRINT1("OnStopBinding not implemented\n"); + + return S_OK; +} + +static HRESULT WINAPI +dlGetBindInfo(IBindStatusCallback* iface, DWORD* grfBINDF, BINDINFO* pbindinfo) +{ + DPRINT1("GetBindInfo not implemented\n"); + + return S_OK; +} + +static HRESULT WINAPI +dlOnDataAvailable(IBindStatusCallback* iface, DWORD grfBSCF, + DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed) +{ + DPRINT1("OnDataAvailable implemented\n"); + + return S_OK; +} + +static HRESULT WINAPI +dlOnObjectAvailable(IBindStatusCallback* iface, REFIID riid, IUnknown* punk) +{ + DPRINT1("OnObjectAvailable implemented\n"); + + return S_OK; +} + +static const IBindStatusCallbackVtbl dlVtbl = +{ + dlQueryInterface, + dlAddRef, + dlRelease, + dlOnStartBinding, + dlGetPriority, + dlOnLowResource, + dlOnProgress, + dlOnStopBinding, + dlGetBindInfo, + dlOnDataAvailable, + dlOnObjectAvailable +}; + +static IBindStatusCallback* +CreateDl(HWND Dlg, BOOL *pbCancelled) +{ + IBindStatusCallbackImpl *This; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(IBindStatusCallbackImpl)); + This->vtbl = &dlVtbl; + This->ref = 1; + This->hDialog = Dlg; + This->pbCancelled = pbCancelled; + + return (IBindStatusCallback*) This; +} + +static BOOL +GetShortcutName(LPWSTR ShortcutName) +{ + if (! SHGetSpecialFolderPathW(0, ShortcutName, CSIDL_PROGRAMS, FALSE)) + { + return FALSE; + } + if (NULL == PathAddBackslashW(ShortcutName)) + { + return FALSE; + } + if (0 == LoadStringW(GetModuleHandle(NULL), IDS_START_MENU_NAME, + ShortcutName + wcslen(ShortcutName), + MAX_PATH - wcslen(ShortcutName))) + { + return FALSE; + } + if (MAX_PATH - 5 < wcslen(ShortcutName)) + { + return FALSE; + } + wcscat(ShortcutName, L".lnk"); + + return TRUE; +} + +static DWORD WINAPI +ThreadFunc(LPVOID Context) +{ + static const WCHAR szUrl[] = DOWNLOAD_URL; + IBindStatusCallback *dl; + WCHAR path[MAX_PATH], ShortcutName[MAX_PATH]; + LPWSTR p; + STARTUPINFOW si; + PROCESS_INFORMATION pi; + HWND Dlg = (HWND) Context; + DWORD r; + BOOL bCancelled = FALSE; + BOOL bTempfile = FALSE; + + /* built the path for the download */ + p = wcsrchr(szUrl, L'/'); + if (NULL == p) + { + goto end; + } + if (! GetTempPathW(MAX_PATH, path)) + { + goto end; + } + wcscat(path, p + 1); + + /* download it */ + bTempfile = TRUE; + dl = CreateDl(Context, &bCancelled); + r = URLDownloadToFileW(NULL, szUrl, path, 0, dl); + if (NULL != dl) + { + IBindStatusCallback_Release(dl); + } + if (S_OK != r || bCancelled ) + { + goto end; + } + ShowWindow(Dlg, SW_HIDE); + + /* run it */ + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + r = CreateProcessW(path, NULL, NULL, NULL, 0, 0, NULL, NULL, &si, &pi); + if (0 == r) + { + goto end; + } + CloseHandle(pi.hThread); + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + + if (BST_CHECKED == SendMessageW(GetDlgItem(Dlg, IDC_REMOVE), BM_GETCHECK, + 0, 0) && + GetShortcutName(ShortcutName)) + { + DeleteFileW(ShortcutName); + } + +end: + if (bTempfile) + { + DeleteFileW(path); + } + EndDialog(Dlg, 0); + return 0; +} + +static INT_PTR CALLBACK +dlProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + HANDLE Thread; + DWORD ThreadId; + HWND Item; + HICON Icon; + WCHAR ShortcutName[MAX_PATH]; + + switch (Msg) + { + case WM_INITDIALOG: + Icon = LoadIconW((HINSTANCE) GetWindowLongPtr(Dlg, GWLP_HINSTANCE), + MAKEINTRESOURCEW(IDI_ICON_MAIN)); + if (NULL != Icon) + { + SendMessageW(Dlg, WM_SETICON, ICON_BIG, (LPARAM) Icon); + SendMessageW(Dlg, WM_SETICON, ICON_SMALL, (LPARAM) Icon); + } + SetWindowLongPtrW(Dlg, GWLP_USERDATA, 0); + Item = GetDlgItem(Dlg, IDC_PROGRESS); + if (NULL != Item) + { + SendMessageW(Item, PBM_SETRANGE, 0, MAKELPARAM(0,100)); + SendMessageW(Item, PBM_SETPOS, 0, 0); + } + Item = GetDlgItem(Dlg, IDC_REMOVE); + if (NULL != Item) + { + if (GetShortcutName(ShortcutName) && + INVALID_FILE_ATTRIBUTES != GetFileAttributesW(ShortcutName)) + { + SendMessageW(Item, BM_SETCHECK, BST_CHECKED, 0); + } + else + { + SendMessageW(Item, BM_SETCHECK, BST_UNCHECKED, 0); + ShowWindow(Item, SW_HIDE); + } + } + Thread = CreateThread(NULL, 0, ThreadFunc, Dlg, 0, &ThreadId); + if (NULL == Thread) + { + return FALSE; + } + CloseHandle(Thread); + return TRUE; + + case WM_COMMAND: + if (wParam == IDCANCEL) + { + SetWindowLongPtrW(Dlg, GWLP_USERDATA, 1); + } + return FALSE; + + default: + return FALSE; + } +} + + +/********************************************************************** * + * Main program + */ +int +main(int argc, char *argv[]) +{ + InitCommonControls(); + + DialogBoxW(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDD_GETFIREFOX), 0, + dlProc); + + return 0; +} Property changes on: trunk/reactos/apps/utils/getfirefox/getfirefox.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: trunk/reactos/apps/utils/getfirefox/getfirefox.rc --- trunk/reactos/apps/utils/getfirefox/getfirefox.rc 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/apps/utils/getfirefox/getfirefox.rc 2005-12-12 00:23:07 UTC (rev 20096) @@ -0,0 +1,25 @@
+/* + * PROJECT: ReactOS utilities + * LICENSE: GPL - See COPYING in the top level directory + * FILE: apps/utils/getfirefox/getfirefox.rc + * PURPOSE: Language-independent resources + * COPYRIGHT: Copyright 2005 Ge van Geldorp (gvg@reactos.org) + */ + +#include <windows.h> +#include "resource.h" + +#define REACTOS_STR_FILE_DESCRIPTION "Firefox downloader\0" +#define REACTOS_STR_INTERNAL_NAME "getfirefox\0" +#define REACTOS_STR_ORIGINAL_FILENAME "getfirefox.exe\0" +#include <reactos/version.rc> + +/* + * Note: this icon is the "default logo" referenced here: + * http://www.mozilla.org/foundation/trademarks/faq.html (under "What are the + * Mozilla Trademarks and Logos?"). Don't use the official Firefox logo as it + * is trademarked. + */ +1 ICON "firefox.ico" + +#include "En.rc" Property changes on: trunk/reactos/apps/utils/getfirefox/getfirefox.rc ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: trunk/reactos/apps/utils/getfirefox/getfirefox.xml --- trunk/reactos/apps/utils/getfirefox/getfirefox.xml 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/apps/utils/getfirefox/getfirefox.xml 2005-12-12 00:23:07 UTC (rev 20096) @@ -0,0 +1,17 @@
+<module name="getfirefox" type="win32gui" installbase="system32" installname="getfirefox.exe"> + <include base="getfirefox">.</include> + <define name="UNICODE" /> + <define name="_UNICODE" /> + <define name="__USE_W32API" /> + <define name="WINVER">0x0501</define> + <define name="_WIN32_IE>0x0600</define> + <library>comctl32</library> + <library>ntdll</library> + <library>shell32</library> + <library>shlwapi</library> + <library>urlmon</library> + <library>uuid</library> + <pch>precomp.h</pch> + <file>getfirefox.c</file> + <file>getfirefox.rc</file> +</module> Property changes on: trunk/reactos/apps/utils/getfirefox/getfirefox.xml ___________________________________________________________________ Name: svn:eol-style + native _____
Added: trunk/reactos/apps/utils/getfirefox/precomp.h --- trunk/reactos/apps/utils/getfirefox/precomp.h 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/apps/utils/getfirefox/precomp.h 2005-12-12 00:23:07 UTC (rev 20096) @@ -0,0 +1,19 @@
+/* + * PROJECT: ReactOS utilities + * LICENSE: GPL - See COPYING in the top level directory + * FILE: apps/utils/getfirefox/precomp.h + * PURPOSE: Precompiled header file + * COPYRIGHT: Copyright 2005 Ge van Geldorp (gvg@reactos.org) + */ + +#define COBJMACROS +#define NTOS_MODE_USER +#define WIN32_NO_STATUS +#include <windows.h> +#include <ndk/ntndk.h> +#include <commctrl.h> +#include <shlobj.h> +#include <shlwapi.h> +#include <urlmon.h> + +#include "resource.h" Property changes on: trunk/reactos/apps/utils/getfirefox/precomp.h ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: trunk/reactos/apps/utils/getfirefox/resource.h --- trunk/reactos/apps/utils/getfirefox/resource.h 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/apps/utils/getfirefox/resource.h 2005-12-12 00:23:07 UTC (rev 20096) @@ -0,0 +1,17 @@
+/* + * PROJECT: ReactOS utilities + * LICENSE: GPL - See COPYING in the top level directory + * FILE: apps/utils/getfirefox/resource.h + * PURPOSE: Resource constants + * COPYRIGHT: Copyright 2005 Ge van Geldorp (gvg@reactos.org) + */ + +#define IDI_ICON_MAIN 1 + +#define IDD_GETFIREFOX 100 + +#define IDC_PROGRESS 1000 +#define IDC_STATUS 1001 +#define IDC_REMOVE 1002 + +#define IDS_START_MENU_NAME 1100 Property changes on: trunk/reactos/apps/utils/getfirefox/resource.h ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Modified: trunk/reactos/bootdata/packages/reactos.dff --- trunk/reactos/bootdata/packages/reactos.dff 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/bootdata/packages/reactos.dff 2005-12-12 00:23:07 UTC (rev 20096) @@ -227,6 +227,7 @@
apps\utils\ps\ps.exe 1 apps\utils\rosperf\rosperf.exe 1 apps\utils\shutdown\shutdown.exe 1 +apps\utils\getfirefox\getfirefox.exe 1 media\fonts\c0419bt_.ttf 3 media\fonts\c0582bt_.ttf 3 media\fonts\c0583bt_.ttf 3 _____
Modified: trunk/reactos/lib/syssetup/install.c --- trunk/reactos/lib/syssetup/install.c 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/lib/syssetup/install.c 2005-12-12 00:23:07 UTC (rev 20096) @@ -415,6 +415,7 @@
/* create program startmenu shortcuts */ CreateShortcut(CSIDL_PROGRAMS, NULL, _T("winefile.lnk"), _T("winefile.exe"), IDS_CMT_WINEFILE); CreateShortcut(CSIDL_PROGRAMS, NULL, _T("ibrowser.lnk"), _T("ibrowser.exe"), IDS_CMT_IBROWSER); + CreateShortcut(CSIDL_PROGRAMS, NULL, _T("Get Firefox.lnk"), _T("getfirefox.exe"), IDS_CMT_GETFIREFOX);
/* create and fill Accessories subfolder */ if (CreateShortcutFolder(CSIDL_PROGRAMS, IDS_ACCESSORIES, sAccessories, 256)) { _____
Modified: trunk/reactos/lib/syssetup/resource.h --- trunk/reactos/lib/syssetup/resource.h 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/lib/syssetup/resource.h 2005-12-12 00:23:07 UTC (rev 20096) @@ -96,6 +96,7 @@
#define IDS_CMT_SOLITAIRE 3216 #define IDS_CMT_WINEMINE 3217 #define IDS_CMT_IBROWSER 3218 +#define IDS_CMT_GETFIREFOX 3219
#define IDS_REACTOS_SETUP 3300 #define IDS_UNKNOWN_ERROR 3301 _____
Modified: trunk/reactos/lib/syssetup/syssetup_En.rc --- trunk/reactos/lib/syssetup/syssetup_En.rc 2005-12-12 00:06:38 UTC (rev 20095) +++ trunk/reactos/lib/syssetup/syssetup_En.rc 2005-12-12 00:23:07 UTC (rev 20096) @@ -183,7 +183,8 @@
STRINGTABLE BEGIN IDS_CMT_WINEFILE "Launch Winefile" - IDS_CMT_IBROWSER "Launch iBrowser" + IDS_CMT_IBROWSER "Launch iBrowser" + IDS_CMT_GETFIREFOX "Download/install Firefox" END
STRINGTABLE