Add small utility to download/install Firefox

svn path=/trunk/; revision=20096
This commit is contained in:
Gé van Geldorp 2005-12-12 00:23:07 +00:00
parent 32ae60b9b2
commit 507a9d518e
12 changed files with 508 additions and 1 deletions

View file

@ -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>

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -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;
}

View file

@ -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"

View file

@ -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>

View file

@ -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"

View file

@ -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

View file

@ -227,6 +227,7 @@ apps\utils\net\whois\whois.exe 1
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

View file

@ -415,6 +415,7 @@ InstallReactOS (HINSTANCE hInstance)
/* 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)) {

View file

@ -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

View file

@ -183,7 +183,8 @@ END
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