From: Lee Schroeder Date: Tue, 18 Sep 2018 21:55:44 +0000 (-0600) Subject: [DWNL] Localize the File Download utility (#853) X-Git-Tag: 0.4.12-dev~764 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=08be1648f95464d41b8f86d42c476db04c3a0f0c [DWNL] Localize the File Download utility (#853) Also, changed header string to include a start time stamp similar to the one in wget. CORE-14498 --- diff --git a/base/applications/network/dwnl/CMakeLists.txt b/base/applications/network/dwnl/CMakeLists.txt index ac0517d4786..1bd84579ae5 100644 --- a/base/applications/network/dwnl/CMakeLists.txt +++ b/base/applications/network/dwnl/CMakeLists.txt @@ -1,8 +1,11 @@ -add_executable(dwnl dwnl.c) +include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/conutils) + +add_executable(dwnl dwnl.c dwnl.rc) set_module_type(dwnl win32cui UNICODE) +target_link_libraries(dwnl conutils ${PSEH_LIB}) target_link_libraries(dwnl uuid) -add_importlibs(dwnl urlmon wininet msvcrt kernel32) +add_importlibs(dwnl urlmon wininet msvcrt user32 kernel32) if(MSVC) add_importlibs(dwnl ntdll) diff --git a/base/applications/network/dwnl/dwnl.c b/base/applications/network/dwnl/dwnl.c index 827565367e8..4de7eda54e2 100644 --- a/base/applications/network/dwnl/dwnl.c +++ b/base/applications/network/dwnl/dwnl.c @@ -1,8 +1,11 @@ #define COBJMACROS #include #include -#include +#include #include +#include + +#include "resource.h" /* FIXME: add correct definitions to urlmon.idl */ #ifdef UNICODE @@ -19,8 +22,8 @@ typedef struct { const IBindStatusCallbackVtbl* lpIBindStatusCallbackVtbl; LONG ref; - TCHAR szHostName[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - TCHAR szMimeType[128]; + WCHAR szHostName[INTERNET_MAX_HOST_NAME_LENGTH + 1]; + WCHAR szMimeType[128]; UINT64 Size; UINT64 Progress; UINT bResolving : 1; @@ -39,10 +42,10 @@ CBindStatusCallback_Destroy(CBindStatusCallback *This) } static void -write_status(LPCTSTR lpFmt, ...) +write_status(LPCWSTR lpFmt, ...) { va_list args; - TCHAR szTxt[128]; + WCHAR szTxt[128]; CONSOLE_SCREEN_BUFFER_INFO csbi; va_start(args, lpFmt); @@ -51,17 +54,19 @@ write_status(LPCTSTR lpFmt, ...) if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) { - _tprintf(_T("\r%*.*s"), -(csbi.dwSize.X - 1), csbi.dwSize.X - 1, szTxt); + ConPrintf(StdOut, L"\r%*.*s", -(csbi.dwSize.X - 1), csbi.dwSize.X - 1, szTxt); } else { - _putts(szTxt); + ConPuts(StdOut, szTxt); } } static void CBindStatusCallback_UpdateProgress(CBindStatusCallback *This) { + WCHAR szMessage[MAX_PATH]; + /* FIXME: better output */ if (This->Size != 0) { @@ -71,12 +76,16 @@ CBindStatusCallback_UpdateProgress(CBindStatusCallback *This) if (Percentage > 99) Percentage = 99; - write_status(_T("%2d%% (%I64u bytes downloaded)"), Percentage, This->Progress); + LoadStringW(NULL, IDS_BYTES_DOWNLOADED_FULL, szMessage, ARRAYSIZE(szMessage)); + + write_status(szMessage, Percentage, This->Progress); } else { + LoadStringW(NULL, IDS_BYTES_DOWNLOADED, szMessage, ARRAYSIZE(szMessage)); + /* Unknown size */ - write_status(_T("%I64u bytes downloaded"), This->Progress); + write_status(szMessage, This->Progress); } } @@ -168,10 +177,10 @@ CBindStatusCallback_OnProgress(IBindStatusCallback *iface, case BINDSTATUS_FINDINGRESOURCE: if (!This->bResolving) { - _tcscpy(This->szHostName, szStatusText); + wcscpy(This->szHostName, szStatusText); This->bResolving = TRUE; - _tprintf(_T("Resolving %s... "), This->szHostName); + ConResPrintf(StdOut, IDS_RESOLVING, This->szHostName); } break; @@ -179,14 +188,16 @@ CBindStatusCallback_OnProgress(IBindStatusCallback *iface, This->bConnecting = TRUE; This->bSendingReq = FALSE; This->bBeginTransfer = FALSE; - This->szMimeType[0] = _T('\0'); + This->szMimeType[0] = L'\0'; if (This->bResolving) { - _tprintf(_T("done.\n")); - _tprintf(_T("Connecting to %s[%s]... "), This->szHostName, szStatusText); + ConResPrintf(StdOut, IDS_DONE); + ConResPrintf(StdOut, IDS_CONNECTING_TO_FULL, This->szHostName, szStatusText); } else - _tprintf(_T("Connecting to %s... "), szStatusText); + { + ConResPrintf(StdOut, IDS_CONNECTING_TO, szStatusText); + } break; case BINDSTATUS_REDIRECTING: @@ -194,24 +205,24 @@ CBindStatusCallback_OnProgress(IBindStatusCallback *iface, This->bConnecting = FALSE; This->bSendingReq = FALSE; This->bBeginTransfer = FALSE; - This->szMimeType[0] = _T('\0'); - _tprintf(_T("Redirecting to %s... "), szStatusText); + This->szMimeType[0] = L'\0'; + ConResPrintf(StdOut, IDS_REDIRECTING_TO, szStatusText); break; case BINDSTATUS_SENDINGREQUEST: This->bBeginTransfer = FALSE; - This->szMimeType[0] = _T('\0'); + This->szMimeType[0] = L'\0'; if (This->bResolving || This->bConnecting) - _tprintf(_T("done.\n")); + ConResPrintf(StdOut, IDS_DONE); if (!This->bSendingReq) - _tprintf(_T("Sending request... ")); + ConResPrintf(StdOut, IDS_SEND_REQUEST); This->bSendingReq = TRUE; break; case BINDSTATUS_MIMETYPEAVAILABLE: - _tcscpy(This->szMimeType, szStatusText); + wcscpy(This->szMimeType, szStatusText); break; case BINDSTATUS_BEGINDOWNLOADDATA: @@ -219,24 +230,23 @@ CBindStatusCallback_OnProgress(IBindStatusCallback *iface, This->Size = (UINT64)ulProgressMax; if (This->bSendingReq) - _tprintf(_T("done.\n")); + ConResPrintf(StdOut, IDS_DONE); if (!This->bBeginTransfer && This->Size != 0) { - if (This->szMimeType[0] != _T('\0')) - _tprintf(_T("Length: %I64u [%s]\n"), This->Size, This->szMimeType); + if (This->szMimeType[0] != L'\0') + ConResPrintf(StdOut, IDS_LENGTH_FULL, This->Size, This->szMimeType); else - _tprintf(_T("Length: %I64u\n"), This->Size); + ConResPrintf(StdOut, IDS_LENGTH, This->Size); } - _tprintf(_T("\n")); + ConPuts(StdOut, L"\n"); This->bBeginTransfer = TRUE; break; case BINDSTATUS_ENDDOWNLOADDATA: - write_status(_T("File saved.")); - _tprintf(_T("\n")); + ConResPrintf(StdOut, IDS_FILE_SAVED); break; case BINDSTATUS_DOWNLOADINGDATA: @@ -319,7 +329,7 @@ CreateBindStatusCallback(void) static int get_display_url(IN LPURL_COMPONENTS purl, - OUT TCHAR *szBuffer, + OUT LPWSTR szBuffer, IN PDWORD pdwBufferSize) { URL_COMPONENTS urlc; @@ -336,23 +346,24 @@ get_display_url(IN LPURL_COMPONENTS purl, } static int -download_file(IN LPCTSTR pszUrl, - IN LPCTSTR pszFile OPTIONAL) +download_file(IN LPCWSTR pszUrl, + IN LPCWSTR pszFile OPTIONAL) { - TCHAR szScheme[INTERNET_MAX_SCHEME_LENGTH + 1]; - TCHAR szHostName[INTERNET_MAX_HOST_NAME_LENGTH + 1]; - TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH + 1]; - TCHAR szPassWord[INTERNET_MAX_PASSWORD_LENGTH + 1]; - TCHAR szUrlPath[INTERNET_MAX_PATH_LENGTH + 1]; - TCHAR szExtraInfo[INTERNET_MAX_PATH_LENGTH + 1]; - TCHAR szUrl[INTERNET_MAX_URL_LENGTH + 1]; + WCHAR szScheme[INTERNET_MAX_SCHEME_LENGTH + 1]; + WCHAR szHostName[INTERNET_MAX_HOST_NAME_LENGTH + 1]; + WCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH + 1]; + WCHAR szPassWord[INTERNET_MAX_PASSWORD_LENGTH + 1]; + WCHAR szUrlPath[INTERNET_MAX_PATH_LENGTH + 1]; + WCHAR szExtraInfo[INTERNET_MAX_PATH_LENGTH + 1]; + WCHAR szUrl[INTERNET_MAX_URL_LENGTH + 1]; DWORD dwUrlLen; LPTSTR pszFilePart; URL_COMPONENTS urlc; IBindStatusCallback *pbsc; int iRet; + SYSTEMTIME sysTime; - if (pszFile != NULL && pszFile[0] == _T('\0')) + if (pszFile != NULL && pszFile[0] == L'\0') pszFile = NULL; urlc.dwStructSize = sizeof(urlc); @@ -368,7 +379,7 @@ download_file(IN LPCTSTR pszUrl, urlc.dwUrlPathLength = sizeof(szUrlPath) / sizeof(szUrlPath[0]); urlc.lpszExtraInfo = szExtraInfo; urlc.dwExtraInfoLength = sizeof(szExtraInfo) / sizeof(szExtraInfo[0]); - if (!InternetCrackUrl(pszUrl, _tcslen(pszUrl), ICU_ESCAPE, &urlc)) + if (!InternetCrackUrl(pszUrl, wcslen(pszUrl), ICU_ESCAPE, &urlc)) return DWNL_E_LASTERROR; if (urlc.nScheme != INTERNET_SCHEME_FTP && @@ -381,15 +392,15 @@ download_file(IN LPCTSTR pszUrl, if (urlc.nScheme == INTERNET_SCHEME_FTP && urlc.dwUserNameLength == 0 && urlc.dwPasswordLength == 0) { - _tcscpy(szUserName, _T("anonymous")); - urlc.dwUserNameLength = _tcslen(szUserName); + wcscpy(szUserName, L"anonymous"); + urlc.dwUserNameLength = wcslen(szUserName); } /* FIXME: Get file name from server */ if (urlc.dwUrlPathLength == 0 && pszFile == NULL) return DWNL_E_NEEDTARGETFILENAME; - pszFilePart = _tcsrchr(szUrlPath, _T('/')); + pszFilePart = wcsrchr(szUrlPath, L'/'); if (pszFilePart != NULL) pszFilePart++; @@ -411,7 +422,12 @@ download_file(IN LPCTSTR pszUrl, if (iRet <= 0) return iRet; - _tprintf(_T("Download `%s\'\n\t=> `%s\'\n"), szUrl, pszFile); + GetLocalTime(&sysTime); + + ConPrintf(StdOut, L"--%d-%d-%d %d:%d:%d-- %s\n\t=> %s\n", + sysTime.wYear, sysTime.wMonth, sysTime.wDay, + sysTime.wHour, sysTime.wMinute, sysTime.wSecond, + szUrl, pszFile); /* Generate the URL to download */ dwUrlLen = sizeof(szUrl) / sizeof(szUrl[0]); @@ -435,19 +451,19 @@ download_file(IN LPCTSTR pszUrl, static int print_err(int iErr) { - write_status(_T("")); + write_status(L""); if (iErr == DWNL_E_LASTERROR) { if (GetLastError() == ERROR_SUCCESS) { /* File not found */ - _ftprintf(stderr, _T("\nERROR: Download failed.\n")); + ConResPrintf(StdErr, IDS_ERROR_DOWNLOAD); } else { /* Display last error code */ - _ftprintf(stderr, _T("\nERROR: %u\n"), GetLastError()); + ConResPrintf(StdErr, IDS_ERROR_CODE, GetLastError()); } } else @@ -455,11 +471,11 @@ print_err(int iErr) switch (iErr) { case DWNL_E_NEEDTARGETFILENAME: - _ftprintf(stderr, _T("\nERROR: Cannot determine filename, please specify a destination file name.\n")); + ConResPrintf(StdErr, IDS_ERROR_FILENAME); break; case DWNL_E_UNSUPPORTEDSCHEME: - _ftprintf(stderr, _T("\nERROR: Unsupported protocol.\n")); + ConResPrintf(StdErr, IDS_ERROR_PROTOCOL); break; } } @@ -467,13 +483,16 @@ print_err(int iErr) return 1; } -int _tmain(int argc, TCHAR **argv) +int wmain(int argc, WCHAR **argv) { int iErr, iRet = 0; + /* Initialize the Console Standard Streams */ + ConInitStdStreams(); + if(argc != 2 && argc != 3) { - _tprintf(_T("Usage: dwnl URL [DESTINATION]")); + ConResPrintf(StdOut, IDS_USAGE); return 2; } diff --git a/base/applications/network/dwnl/dwnl.rc b/base/applications/network/dwnl/dwnl.rc new file mode 100644 index 00000000000..79739f4f121 --- /dev/null +++ b/base/applications/network/dwnl/dwnl.rc @@ -0,0 +1,16 @@ +#include + +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS File Download Utility" +#define REACTOS_STR_INTERNAL_NAME "dwnl" +#define REACTOS_STR_ORIGINAL_FILENAME "dwnl.exe" +#include + +/* UTF-8 */ +#pragma code_page(65001) +#ifdef LANGUAGE_EN_US + #include "lang/en-US.rc" +#endif diff --git a/base/applications/network/dwnl/lang/en-US.rc b/base/applications/network/dwnl/lang/en-US.rc new file mode 100644 index 00000000000..a62ce99a14e --- /dev/null +++ b/base/applications/network/dwnl/lang/en-US.rc @@ -0,0 +1,25 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE +BEGIN + IDS_USAGE "Usage: dwnl URL [DESTINATION]\n" + IDS_RESOLVING "Resolving %s... " + IDS_DONE "done.\n" + IDS_LENGTH_FULL "Length: %I64u [%s]\n" + IDS_LENGTH "Length: %I64u\n" + IDS_FILE_SAVED "\nFile saved.\n" + IDS_CONNECTING_TO_FULL "Connecting to %s [%s]... " + IDS_CONNECTING_TO "Connecting to %s... " + IDS_REDIRECTING_TO "Redirecting to %s... " + IDS_SEND_REQUEST "Sending request... " + IDS_BYTES_DOWNLOADED "%I64u bytes downloaded" + IDS_BYTES_DOWNLOADED_FULL "%2d%% (%I64u byte(s) downloaded)" +END + +STRINGTABLE +BEGIN + IDS_ERROR_DOWNLOAD "\nERROR: Download failed.\n" + IDS_ERROR_CODE "\nERROR: %u\n" + IDS_ERROR_FILENAME "\nERROR: Cannot determine filename, please specify a destination file name.\n" + IDS_ERROR_PROTOCOL "\nERROR: Unsupported protocol.\n" +END diff --git a/base/applications/network/dwnl/resource.h b/base/applications/network/dwnl/resource.h new file mode 100644 index 00000000000..a729bc0cdac --- /dev/null +++ b/base/applications/network/dwnl/resource.h @@ -0,0 +1,22 @@ +#ifndef RESOURCE_H +#define RESOURCE_H + +#define IDS_USAGE 0 +#define IDS_RESOLVING 1 +#define IDS_DONE 2 +#define IDS_LENGTH_FULL 3 +#define IDS_LENGTH 4 +#define IDS_FILE_SAVED 5 +#define IDS_CONNECTING_TO_FULL 6 +#define IDS_CONNECTING_TO 7 +#define IDS_REDIRECTING_TO 8 +#define IDS_SEND_REQUEST 9 +#define IDS_BYTES_DOWNLOADED 10 +#define IDS_BYTES_DOWNLOADED_FULL 11 + +#define IDS_ERROR_DOWNLOAD 12 +#define IDS_ERROR_CODE 13 +#define IDS_ERROR_FILENAME 14 +#define IDS_ERROR_PROTOCOL 15 + +#endif /* RESOURCE_H */