Index: CMakeLists.txt =================================================================== --- CMakeLists.txt (revision 51900) +++ CMakeLists.txt (working copy) @@ -29,7 +29,7 @@ set_module_type(rapps win32gui) target_link_libraries(rapps uuid) -add_importlibs(rapps advapi32 comctl32 gdi32 urlmon user32 shell32 shlwapi msvcrt kernel32 ntdll) +add_importlibs(rapps advapi32 comctl32 gdi32 wininet user32 shell32 shlwapi msvcrt kernel32 ntdll) add_dependencies(rapps rappsmsg) add_message_headers(rappsmsg.mc) add_cd_file(TARGET rapps DESTINATION reactos/system32 FOR all) Index: lang/en-US.rc =================================================================== --- lang/en-US.rc (revision 51900) +++ lang/en-US.rc (working copy) @@ -48,7 +48,7 @@ END END -IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 250, 144 +IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 250, 200 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Settings" FONT 8, "MS Shell Dlg" @@ -64,9 +64,17 @@ PUSHBUTTON "&Choose", IDC_CHOOSE, 187, 85, 50, 14 AUTOCHECKBOX "&Delete program installer after installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 - PUSHBUTTON "Default", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14 - PUSHBUTTON "OK", IDOK, 116, 124, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 181, 124, 60, 14 + GROUPBOX "Proxy", -1,4,116,240,61 + CONTROL "System proxy settings",IDC_PROXY_DEFAULT,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,15,130,87,10 + CONTROL "Direct (No proxy)",IDC_NO_PROXY,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,15,145,71,10 + CONTROL "Proxy",IDC_USE_PROXY,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,15,160,35,10 + EDITTEXT IDC_PROXY_SERVER,50,160,70,14,ES_AUTOHSCROLL + LTEXT "No proxy for",-1,122,160,42,8 + EDITTEXT IDC_NO_PROXY_FOR,165,160,70,14,ES_AUTOHSCROLL + + PUSHBUTTON "Default",IDC_DEFAULT_SETTINGS,8,180,60,14 + PUSHBUTTON "OK",IDOK,116,180,60,14 + PUSHBUTTON "Cancel",IDCANCEL,181,180,60,14 END IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 216, 97 Index: loaddlg.c =================================================================== --- loaddlg.c (revision 51900) +++ loaddlg.c (working copy) @@ -34,185 +34,15 @@ #include #include #include -#include +#include static PAPPLICATION_INFO AppInfo; static HICON hIcon = NULL; -typedef struct _IBindStatusCallbackImpl -{ - const IBindStatusCallbackVtbl *vtbl; - LONG ref; - HWND hDialog; - BOOL *pbCancelled; -} IBindStatusCallbackImpl; - static -HRESULT WINAPI -dlQueryInterface(IBindStatusCallback* This, REFIID riid, void** ppvObject) -{ - if (!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) -{ - return S_OK; -} - -static -HRESULT WINAPI -dlGetPriority(IBindStatusCallback* iface, LONG* pnPriority) -{ - return S_OK; -} - -static -HRESULT WINAPI -dlOnLowResource( IBindStatusCallback* iface, DWORD reserved) -{ - 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_DOWNLOAD_PROGRESS); - if (Item && ulProgressMax) - { - SendMessageW(Item, PBM_SETPOS, ((ULONGLONG)ulProgress * 100) / ulProgressMax, 0); - } - - Item = GetDlgItem(This->hDialog, IDC_DOWNLOAD_STATUS); - if (Item && szStatusText) - { - 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; - return E_ABORT; - } - - return S_OK; -} - -static -HRESULT WINAPI -dlOnStopBinding(IBindStatusCallback* iface, HRESULT hresult, LPCWSTR szError) -{ - return S_OK; -} - -static -HRESULT WINAPI -dlGetBindInfo(IBindStatusCallback* iface, DWORD* grfBINDF, BINDINFO* pbindinfo) -{ - return S_OK; -} - -static -HRESULT WINAPI -dlOnDataAvailable(IBindStatusCallback* iface, DWORD grfBSCF, - DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed) -{ - return S_OK; -} - -static -HRESULT WINAPI -dlOnObjectAvailable(IBindStatusCallback* iface, REFIID riid, IUnknown* punk) -{ - 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(), HEAP_ZERO_MEMORY, sizeof(IBindStatusCallbackImpl)); - if (!This) return NULL; - - This->vtbl = &dlVtbl; - This->ref = 1; - This->hDialog = Dlg; - This->pbCancelled = pbCancelled; - - return (IBindStatusCallback*) This; -} - -static DWORD WINAPI ThreadFunc(LPVOID Context) { - IBindStatusCallback *dl; WCHAR path[MAX_PATH]; LPWSTR p; STARTUPINFOW si; @@ -222,6 +52,17 @@ BOOL bCancelled = FALSE; BOOL bTempfile = FALSE; BOOL bCab = FALSE; + HINTERNET hInternet = NULL; + HINTERNET hURL = NULL; + HANDLE hFile = INVALID_HANDLE_VALUE; + DWORD dwRead = 1; + DWORD dwWritten; + DWORD ulProgress = 0; + DWORD ulProgressMax = 0; + DWORD dwIndex = 0; + URL_COMPONENTS urlComponents; + BYTE buf[1024]; + DWORD dwSize = sizeof(buf); /* built the path for the download */ p = wcsrchr(AppInfo->szUrlDownload, L'/'); @@ -257,11 +98,62 @@ /* download it */ bTempfile = TRUE; - dl = CreateDl(Context, &bCancelled); - r = URLDownloadToFileW(NULL, AppInfo->szUrlDownload, path, 0, dl); - if (dl) IBindStatusCallback_Release(dl); - if (S_OK != r) goto end; - else if (bCancelled) goto end; + switch(SettingsInfo.Proxy) + { + case 0: /* preconfig */ + hInternet = InternetOpenW(L"rapps", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); + break; + case 1: /* direct (no proxy) */ + hInternet = InternetOpenW(L"rapps", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + break; + case 2: /* use proxy */ + hInternet = InternetOpenW(L"rapps", INTERNET_OPEN_TYPE_PROXY, SettingsInfo.szProxyServer, SettingsInfo.szNoProxyFor, 0); + break; + default: + break; + } + if(hInternet == NULL) + goto end; + hURL = InternetOpenUrlW(hInternet, AppInfo->szUrlDownload, L"", 0, INTERNET_FLAG_NO_CACHE_WRITE, 0); + if(hURL == NULL) + goto end; + if(InternetCrackUrlW(AppInfo->szUrlDownload, wcslen(AppInfo->szUrlDownload), 0, &urlComponents)) + { + if(urlComponents.nScheme == INTERNET_SCHEME_HTTP || urlComponents.nScheme == INTERNET_SCHEME_HTTPS) + { + if(HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH, buf, &dwSize, &dwIndex)) + { + ulProgressMax = wcstoul(buf, buf+dwSize, 10); + } + } + if(urlComponents.nScheme == INTERNET_SCHEME_FTP) + { + ulProgressMax = FtpGetFileSize(hURL, &dwSize); + } + } + hFile = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if(hFile == INVALID_HANDLE_VALUE) + goto end; + while(InternetReadFile(hURL, buf, sizeof(buf), &dwRead) && (dwRead > 0) && !bCancelled) + { + HWND Item; + if(!WriteFile(hFile, buf, dwRead, &dwWritten, NULL)) + { + bCancelled = TRUE; + break; + } + if(ulProgressMax) + { + ulProgress += dwRead; + Item = GetDlgItem(Dlg, IDC_DOWNLOAD_PROGRESS); + if(Item) + { + SendMessageW(Item, PBM_SETPOS, ((ULONGLONG)ulProgress * 100) / ulProgressMax, 0); + } + } + } + if (bCancelled) + goto end; ShowWindow(Dlg, SW_HIDE); @@ -276,6 +168,12 @@ CloseHandle(pi.hProcess); end: + if(hFile != INVALID_HANDLE_VALUE) + CloseHandle(hFile); + if(hURL != NULL) + InternetCloseHandle(hURL); + if(hInternet != NULL) + InternetCloseHandle(hInternet); if (bTempfile) { if (bCancelled || (SettingsInfo.bDelInstaller && !bCab)) Index: rapps.h =================================================================== --- rapps.h (revision 51900) +++ rapps.h (working copy) @@ -89,6 +89,10 @@ INT Top; INT Right; INT Bottom; + /* proxy */ + INT Proxy; + WCHAR szProxyServer[MAX_PATH]; + WCHAR szNoProxyFor[MAX_PATH]; } SETTINGS_INFO, *PSETTINGS_INFO; Index: rapps.rbuild =================================================================== --- rapps.rbuild (revision 51900) +++ rapps.rbuild (working copy) @@ -9,7 +9,7 @@ advapi32 comctl32 gdi32 - urlmon + wininet user32 uuid shell32 Index: resource.h =================================================================== --- resource.h (revision 51900) +++ resource.h (working copy) @@ -45,6 +45,11 @@ #define IDC_INSTALL_TEXT 1010 #define IDC_CD_INSTALL 1011 #define IDC_DOWNLOAD_INSTALL 1012 +#define IDC_PROXY_DEFAULT 1013 +#define IDC_NO_PROXY 1014 +#define IDC_USE_PROXY 1015 +#define IDC_PROXY_SERVER 1016 +#define IDC_NO_PROXY_FOR 1017 /* Dialogs */ #define IDD_SETTINGS_DIALOG 300 Index: settingsdlg.c =================================================================== --- settingsdlg.c (revision 51900) +++ settingsdlg.c (working copy) @@ -49,6 +49,13 @@ SetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT), Info.szDownloadDir); + + CheckRadioButton(hDlg, IDC_PROXY_DEFAULT, IDC_USE_PROXY, IDC_PROXY_DEFAULT+Info.Proxy); + + SetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER), + Info.szProxyServer); + SetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), + Info.szNoProxyFor); } static @@ -88,6 +95,18 @@ IS_CHECKED(NewSettingsInfo.bDelInstaller, IDC_DEL_AFTER_INSTALL); break; + case IDC_PROXY_DEFAULT: + NewSettingsInfo.Proxy = 0; + break; + + case IDC_NO_PROXY: + NewSettingsInfo.Proxy = 1; + break; + + case IDC_USE_PROXY: + NewSettingsInfo.Proxy = 2; + break; + case IDC_DEFAULT_SETTINGS: FillDafaultSettings(&NewSettingsInfo); InitSettingsControls(hDlg, NewSettingsInfo); @@ -96,11 +115,21 @@ case IDOK: { WCHAR szDir[MAX_PATH]; + WCHAR szProxy[MAX_PATH]; + WCHAR szNoProxy[MAX_PATH]; DWORD dwAttr; GetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT), szDir, MAX_PATH); + GetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER), + szProxy, MAX_PATH); + wcscpy(NewSettingsInfo.szProxyServer, szProxy); + + GetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), + szNoProxy, MAX_PATH); + wcscpy(NewSettingsInfo.szNoProxyFor, szNoProxy); + dwAttr = GetFileAttributesW(szDir); if (dwAttr != INVALID_FILE_ATTRIBUTES && (dwAttr & FILE_ATTRIBUTE_DIRECTORY)) Index: winmain.c =================================================================== --- winmain.c (revision 51900) +++ winmain.c (working copy) @@ -29,6 +29,10 @@ pSettingsInfo->Top = 0; pSettingsInfo->Right = 680; pSettingsInfo->Bottom = 450; + + pSettingsInfo->Proxy = 0; + wcscpy(pSettingsInfo->szProxyServer, L""); + wcscpy(pSettingsInfo->szNoProxyFor, L""); } static BOOL