ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
December 2024
----- 2025 -----
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
17 participants
106 discussions
Start a n
N
ew thread
[reactos] 01/01: [WINMM] PlaySound: Fix user-specific environment variables handling (#7536)
by Thamatip Chitpong
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=92231340ec071bd7a461d…
commit 92231340ec071bd7a461d8a941b4cd82b865bc81 Author: Thamatip Chitpong <thamatip.chitpong(a)reactos.org> AuthorDate: Sat Dec 7 09:15:11 2024 +0700 Commit: GitHub <noreply(a)github.com> CommitDate: Sat Dec 7 09:15:11 2024 +0700 [WINMM] PlaySound: Fix user-specific environment variables handling (#7536) Correctly retrieve user-specific environment variables when impersonating. Addendum to commit f18111b64120806529e93404f21b6320f211ec39. CORE-13951 --- dll/win32/winmm/CMakeLists.txt | 2 +- dll/win32/winmm/playsound.c | 60 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/dll/win32/winmm/CMakeLists.txt b/dll/win32/winmm/CMakeLists.txt index aca0942d4be..2566277f94d 100644 --- a/dll/win32/winmm/CMakeLists.txt +++ b/dll/win32/winmm/CMakeLists.txt @@ -30,7 +30,7 @@ endif() set_module_type(winmm win32dll) target_link_libraries(winmm wine ${PSEH_LIB} oldnames) -add_importlibs(winmm advapi32 user32 msvcrt kernel32 ntdll) +add_importlibs(winmm userenv advapi32 user32 msvcrt kernel32 ntdll) add_pch(winmm winemm.h SOURCE) add_cd_file(TARGET winmm DESTINATION reactos/system32 FOR all) diff --git a/dll/win32/winmm/playsound.c b/dll/win32/winmm/playsound.c index df532f05cfd..991299a0a7f 100644 --- a/dll/win32/winmm/playsound.c +++ b/dll/win32/winmm/playsound.c @@ -26,6 +26,7 @@ #include "winemm.h" #include <winternl.h> +#include <userenv.h> WINE_DEFAULT_DEBUG_CHANNEL(winmm); @@ -39,6 +40,61 @@ typedef struct tagWINE_PLAYSOUND static WINE_PLAYSOUND *PlaySoundCurrent; static BOOL bPlaySoundStop; +/* An impersonation-aware equivalent of ExpandEnvironmentStringsW */ +static DWORD PlaySound_ExpandEnvironmentStrings(LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize) +{ + HANDLE hToken; + DWORD dwError; + DWORD dwLength = 0; + + if (!OpenThreadToken(GetCurrentThread(), + TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_DUPLICATE, + TRUE, + &hToken)) + { + dwError = GetLastError(); + + if (dwError == ERROR_NO_TOKEN) + { + /* We are not impersonating, forward this to ExpandEnvironmentStrings */ + return ExpandEnvironmentStringsW(lpSrc, lpDst, nSize); + } + + ERR("OpenThreadToken failed (0x%x)\n", dwError); + return 0; + } + + if (!ExpandEnvironmentStringsForUserW(hToken, lpSrc, lpDst, nSize)) + { + dwError = GetLastError(); + + if (dwError == ERROR_INSUFFICIENT_BUFFER || nSize == 0) + { + /* The buffer is too small, find the required buffer size. + * NOTE: ExpandEnvironmentStringsForUser doesn't support retrieving buffer size. */ + WCHAR szExpanded[1024]; + + if (ExpandEnvironmentStringsForUserW(hToken, lpSrc, szExpanded, ARRAY_SIZE(szExpanded))) + { + /* We success, return the required buffer size */ + dwLength = lstrlenW(szExpanded) + 1; + goto Cleanup; + } + } + + ERR("ExpandEnvironmentStringsForUser failed (0x%x)\n", dwError); + } + else + { + /* We success, return the size of the string */ + dwLength = lstrlenW(lpDst) + 1; + } + +Cleanup: + CloseHandle(hToken); + return dwLength; +} + static HMMIO get_mmioFromFile(LPCWSTR lpszName) { HMMIO ret; @@ -158,7 +214,7 @@ Next: if (type == REG_EXPAND_SZ) { - count = ExpandEnvironmentStringsW(str, NULL, 0); + count = PlaySound_ExpandEnvironmentStrings(str, NULL, 0); if (count == 0) goto None; @@ -166,7 +222,7 @@ Next: if (!pszSnd) goto None; - if (ExpandEnvironmentStringsW(str, pszSnd, count) == 0) + if (PlaySound_ExpandEnvironmentStrings(str, pszSnd, count) == 0) { HeapFree(GetProcessHeap(), 0, pszSnd); goto None;
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [VGAFONTEDIT] Update Romanian (ro-RO) translation (#7354)
by Andrei Miloiu
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e6c18b4497fddfe56adf4…
commit e6c18b4497fddfe56adf458d6e75bd7d9541bec6 Author: Andrei Miloiu <miloiuandrei(a)gmail.com> AuthorDate: Fri Dec 6 22:15:51 2024 +0200 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Dec 6 21:15:51 2024 +0100 [VGAFONTEDIT] Update Romanian (ro-RO) translation (#7354) --- .../devutils/vgafontedit/lang/ro-RO.rc | 56 +++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/modules/rosapps/applications/devutils/vgafontedit/lang/ro-RO.rc b/modules/rosapps/applications/devutils/vgafontedit/lang/ro-RO.rc index 8c18c22973f..cd36a4ddcc4 100644 --- a/modules/rosapps/applications/devutils/vgafontedit/lang/ro-RO.rc +++ b/modules/rosapps/applications/devutils/vgafontedit/lang/ro-RO.rc @@ -2,34 +2,34 @@ * PROJECT: ReactOS VGA Font Editor * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+
) * PURPOSE: Romanian resource file - * TRANSLATORS: Copyright 2008 Ștefan Fulea <stefan.fulea(a)mail.com> - * Copyright 2023 Andrei Miloiu <miloiuandrei(a)gmail.com> + * TRANSLATORS: Copyright 2014-2018 Ștefan Fulea <stefan.fulea(a)mail.com> + * Copyright 2023-2024 Andrei Miloiu <miloiuandrei(a)gmail.com> */ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL IDD_ABOUT DIALOGEX 10, 10, 130, 62 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "About" +CAPTION "Despre" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_MAIN, IDC_STATIC, 10, 10, 20, 20 LTEXT "Editor de font VGA ReactOS", IDC_STATIC, 37, 10, 93, 10 LTEXT "Drept de autor 2008 Colin Finck", IDC_STATIC, 37, 20, 93, 10 - DEFPUSHBUTTON "Î&nchide", IDCANCEL, 40, 44, 55, 15 + DEFPUSHBUTTON "Î&nchidere", IDCANCEL, 40, 44, 55, 15 END IDD_EDITGLYPH DIALOGEX 32768, 32768, 246, 197 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Editare glifă" +CAPTION "Editare a glifei" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_EDIT_GLYPH_TOOLBOX, TOOLBARCLASSNAMEA, CCS_NODIVIDER | CCS_NORESIZE, 5, 5, 24, 82 CONTROL "", IDC_EDIT_GLYPH_EDIT, EDIT_GLYPH_EDIT_CLASSW, 0, 39, 5, 160, 160 CONTROL "", IDC_EDIT_GLYPH_PREVIEW, EDIT_GLYPH_PREVIEW_CLASSW, 0, 209, 5, 32, 32 - DEFPUSHBUTTON "Con&firmă", IDOK, 48, 177, 70, 14 - PUSHBUTTON "A&nulează", IDCANCEL, 125, 177, 70, 14 + DEFPUSHBUTTON "OK", IDOK, 48, 177, 70, 14 + PUSHBUTTON "Revocare", IDCANCEL, 125, 177, 70, 14 END IDM_MAINMENU MENU @@ -40,31 +40,31 @@ BEGIN MENUITEM "&Deschidere…\tCtrl+O", ID_FILE_OPEN MENUITEM "În&chide", ID_FILE_CLOSE MENUITEM SEPARATOR - MENUITEM "Sal&vează\tCtrl+S", ID_FILE_SAVE - MENUITEM "Salvea&ză ca…", ID_FILE_SAVE_AS + MENUITEM "&Salvare\tCtrl+S", ID_FILE_SAVE + MENUITEM "S&alvare ca…", ID_FILE_SAVE_AS MENUITEM SEPARATOR MENUITEM "I&eșire\tAlt+F4", ID_FILE_EXIT END POPUP "&Editare" BEGIN - MENUITEM "&Copiază\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Lipește\tCtrl+V", ID_EDIT_PASTE + MENUITEM "&Copiere\tCtrl+C", ID_EDIT_COPY + MENUITEM "&Lipire\tCtrl+V", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "&Editare glifă…", ID_EDIT_GLYPH + MENUITEM "&Editare a glifei…", ID_EDIT_GLYPH END POPUP "Fe&restre" BEGIN - MENUITEM "Aranjare în &cascadă", ID_WINDOW_CASCADE - MENUITEM "Aranjări &orizontale", ID_WINDOW_TILE_HORZ - MENUITEM "Aranjări &verticale", ID_WINDOW_TILE_VERT - MENUITEM "&Aranjează pictograme", ID_WINDOW_ARRANGE + MENUITEM "&Cascadă", ID_WINDOW_CASCADE + MENUITEM "Dale &orizontale", ID_WINDOW_TILE_HORZ + MENUITEM "Dale &verticale", ID_WINDOW_TILE_VERT + MENUITEM "&Aranjare a pictogramelor", ID_WINDOW_ARRANGE MENUITEM SEPARATOR - MENUITEM "&Următoarea\tCtrl+F6", ID_WINDOW_NEXT + MENUITEM "&Următorul\tCtrl+F6", ID_WINDOW_NEXT END - POPUP "&?" + POPUP "&Ajutor" BEGIN MENUITEM "&Despre…", ID_HELP_ABOUT END @@ -72,22 +72,22 @@ END STRINGTABLE BEGIN - IDS_OPENFILTER, "Toate formatele compatibile (*.bin,*.psf)|*.bin;*.psf|Fișiere de font binar (*.bin)|*.bin|Fonturi (de versiune 1) PC Screen (*.psf)|*.psf|" - IDS_SAVEFILTER, "Fișiere de font binar (*.bin)|*.bin|" + IDS_OPENFILTER, "Toate formatele compatibile (*.bin,*.psf)|*.bin;*.psf|Fișiere de font binare (*.bin)|*.bin|Fonturi pentru ecranul PC Versiunea 1 (*.psf)|*.psf|" + IDS_SAVEFILTER, "Fișiere de font binare (*.bin)|*.bin|" IDS_OPENERROR, "Eroare la deschiderea fișierului! (Număr de eroare %1!u!)" IDS_READERROR, "Eroare la citirea fișierului! (Număr de eroare %1!u!)" IDS_WRITEERROR, "Eroare la scrierea fișierului! (Număr de eroare %1!u!)" IDS_UNSUPPORTEDFORMAT, "Format de fișier incompatibil!" IDS_UNSUPPORTEDPSF, "Format incompatibil de font PSF! Posibilitățile editorului se limitează la fonturile 8x8 fără moduri speciale." IDS_DOCNAME, "Font %1!u!" - IDS_SAVEPROMPT, "Modificările în fișierul „%1” încă nu au fost salvate.\n\nDoriți salvarea lor?" - IDS_APPTITLE, "Editor de font VGA ReactOS" - IDS_CLOSEEDIT, "Închideți mai întâi toate ferestrele de editare!" + IDS_SAVEPROMPT, "Fișierul ""%1"" a fost modificat, dar nu salvat.\n\nDoriți salvarea lor?" + IDS_APPTITLE, "Editorul de font VGA ReactOS" + IDS_CLOSEEDIT, "Închideți mai întâi toate ferestrele de Editare deschise!" IDS_TOOLTIP_NEW, "Nou" - IDS_TOOLTIP_OPEN, "Deschide" - IDS_TOOLTIP_SAVE, "Salvează" - IDS_TOOLTIP_EDIT_GLYPH, "Editează glifă" - IDS_TOOLTIP_COPY, "Copiază" - IDS_TOOLTIP_PASTE, "Lipește" + IDS_TOOLTIP_OPEN, "Deschidere" + IDS_TOOLTIP_SAVE, "Salvare" + IDS_TOOLTIP_EDIT_GLYPH, "Editare a glifei" + IDS_TOOLTIP_COPY, "Copiere" + IDS_TOOLTIP_PASTE, "Lipire" END
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [CONSOLE] Update Romanian (ro-RO) translation (#7404)
by Andrei Miloiu
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=29ef7062a7a6ae87398e8…
commit 29ef7062a7a6ae87398e84b1636e96a2fd26865d Author: Andrei Miloiu <miloiuandrei(a)gmail.com> AuthorDate: Fri Dec 6 22:12:45 2024 +0200 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Dec 6 21:12:45 2024 +0100 [CONSOLE] Update Romanian (ro-RO) translation (#7404) --- dll/cpl/console/lang/ro-RO.rc | 80 +++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/dll/cpl/console/lang/ro-RO.rc b/dll/cpl/console/lang/ro-RO.rc index 0fa6fd79d65..fc60aff96f3 100644 --- a/dll/cpl/console/lang/ro-RO.rc +++ b/dll/cpl/console/lang/ro-RO.rc @@ -14,27 +14,27 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Opțiuni" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Dimensiune cursor", IDC_STATIC, 7, 7, 120, 70, WS_CHILD | WS_VISIBLE | WS_GROUP - AUTORADIOBUTTON "Red&usă", IDC_RADIO_SMALL_CURSOR, 15, 20, 90, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "Me&die", IDC_RADIO_MEDIUM_CURSOR, 15, 40, 90, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "&Mărită", IDC_RADIO_LARGE_CURSOR, 15, 60, 90, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - GROUPBOX "Mod de afișare", IDC_STATIC, 133, 7, 112, 70, WS_CHILD | WS_VISIBLE | WS_GROUP - AUTORADIOBUTTON "În fere&astră", IDC_RADIO_DISPLAY_WINDOW, 142, 20, 70, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "Pe t&ot ecranul", IDC_RADIO_DISPLAY_FULL, 142, 40, 70, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - GROUPBOX "Istoric pentru comenzi", IDC_STATIC, 7, 85, 120, 77, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Ma&xim înregistrări:", IDC_STATIC, 14, 101, 70, 12 + GROUPBOX "Dimensiunea cursorului", IDC_STATIC, 7, 7, 120, 70, WS_CHILD | WS_VISIBLE | WS_GROUP + AUTORADIOBUTTON "&Mică", IDC_RADIO_SMALL_CURSOR, 15, 20, 90, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTORADIOBUTTON "M&edie", IDC_RADIO_MEDIUM_CURSOR, 15, 40, 90, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTORADIOBUTTON "M&are", IDC_RADIO_LARGE_CURSOR, 15, 60, 90, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + GROUPBOX "Opțiuni de afișare", IDC_STATIC, 133, 7, 112, 70, WS_CHILD | WS_VISIBLE | WS_GROUP + AUTORADIOBUTTON "&Fereastră", IDC_RADIO_DISPLAY_WINDOW, 142, 20, 70, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTORADIOBUTTON "E&cran complet", IDC_RADIO_DISPLAY_FULL, 142, 40, 70, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + GROUPBOX "Istoricul comenzilor", IDC_STATIC, 7, 85, 120, 77, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "&Dimensiune tampon:", IDC_STATIC, 14, 101, 70, 12 EDITTEXT IDC_EDIT_BUFFER_SIZE, 90, 97, 30, 15, ES_RIGHT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_BUFFER_SIZE, UPDOWN_CLASS, UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 119, 97, 12, 15 - LTEXT "&Cantitate registre:", IDC_STATIC, 14, 124, 70, 12 + LTEXT "&Număr tampoane:", IDC_STATIC, 14, 124, 70, 12 EDITTEXT IDC_EDIT_NUM_BUFFER, 90, 120, 30, 15, ES_RIGHT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_NUM_BUFFER, UPDOWN_CLASS, UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 119, 120, 12, 15 - AUTOCHECKBOX "Înlătură duplicatele &vechi", IDC_CHECK_DISCARD_DUPLICATES, 12, 140, 110, 15 + AUTOCHECKBOX "Anulare a duplicatelor &vechi", IDC_CHECK_DISCARD_DUPLICATES, 12, 140, 110, 15 GROUPBOX "Opțiuni de editare", IDC_STATIC, 133, 85, 112, 77, BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP - AUTOCHECKBOX "Mod de &editare rapidă", IDC_CHECK_QUICK_EDIT, 140, 97, 102, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTOCHECKBOX "Mod de inse&rție", IDC_CHECK_INSERT_MODE, 140, 113, 76, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP - GROUPBOX "Cod de pagină", IDC_STATIC, 7, 170, 238, 31 + AUTOCHECKBOX "M&odul de editare rapidă", IDC_CHECK_QUICK_EDIT, 140, 97, 102, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTOCHECKBOX "Modul de inse&rare", IDC_CHECK_INSERT_MODE, 140, 113, 76, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP + GROUPBOX "Pagina de cod", IDC_STATIC, 7, 170, 238, 31 COMBOBOX IDL_CODEPAGE, 13, 181, 224, 58, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP END @@ -43,15 +43,15 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Font" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Previzionare:", IDC_STATIC, 7, 7, 115, 10 + LTEXT "Previzionare a ferestrei:", IDC_STATIC, 7, 7, 115, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "WinPreview", WS_BORDER | WS_CHILD | WS_VISIBLE, 7, 20, 115, 70 LTEXT "Mărime:", IDC_STATIC, 130, 7, 45, 10 LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 50, 86, LBS_SORT | LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_CBOX_FONTSIZE, 130, 20, 30, 86, CBS_SIMPLE | CBS_SORT | WS_VSCROLL | WS_TABSTOP AUTORADIOBUTTON "pi&xeli", IDC_RADIO_PIXEL_UNIT, 165, 17, 60, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "p&uncte", IDC_RADIO_POINT_UNIT, 165, 28, 60, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "F&ont:", IDC_STATIC, 10, 105, 33, 10 - AUTOCHECKBOX "&Aldin", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 + AUTORADIOBUTTON "&puncte", IDC_RADIO_POINT_UNIT, 165, 28, 60, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "&Font:", IDC_STATIC, 10, 105, 33, 10 + AUTOCHECKBOX "Fonturi &aldine", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP GROUPBOX "Font selectat", IDC_GROUPBOX_FONT_NAME, 7, 156, 240, 50 CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 12, 166, 104, 35, WS_EX_CLIENTEDGE @@ -66,11 +66,11 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Aspect" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Previzionare:", IDC_STATIC, 7, 7, 115, 10 + LTEXT "Previzionare a ferestrei:", IDC_STATIC, 7, 7, 115, 10 CONTROL "", IDC_STATIC_LAYOUT_WINDOW_PREVIEW, "WinPreview", WS_BORDER | WS_CHILD | WS_VISIBLE, 7, 20, 115, 70 - GROUPBOX "Dimensiunea textului", IDC_STATIC, 130, 12, 115, 50 - LTEXT "&Coloane:", IDC_STATIC, 140, 28, 40, 10 - LTEXT "&Rânduri:", IDC_STATIC, 140, 46, 39, 10 + GROUPBOX "Dimensiunea tamponului de ecran", IDC_STATIC, 130, 12, 115, 50 + LTEXT "&Lăţime:", IDC_STATIC, 140, 28, 40, 10 + LTEXT "&Înălțime:", IDC_STATIC, 140, 46, 39, 10 EDITTEXT IDC_EDIT_SCREEN_BUFFER_WIDTH, 203, 25, 35, 14, ES_RIGHT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_SCREEN_BUFFER_WIDTH, UPDOWN_CLASS, UDS_NOTHOUSANDS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 238, 25, 13, 14 @@ -78,8 +78,8 @@ BEGIN CONTROL "", IDC_UPDOWN_SCREEN_BUFFER_HEIGHT, UPDOWN_CLASS, UDS_NOTHOUSANDS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 238, 42, 13, 14 GROUPBOX "Dimensiunea ferestrei", IDC_STATIC, 130, 65, 115, 47 - LTEXT "C&oloane:", IDC_STATIC, 140, 78, 39, 10 - LTEXT "Rân&duri:", IDC_STATIC, 140, 95, 37, 10 + LTEXT "Lăți&me:", IDC_STATIC, 140, 78, 39, 10 + LTEXT "Î&nălțime:", IDC_STATIC, 140, 95, 37, 10 EDITTEXT IDC_EDIT_WINDOW_SIZE_WIDTH, 203, 75, 35, 14, ES_RIGHT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_WINDOW_SIZE_WIDTH, UPDOWN_CLASS, UDS_NOTHOUSANDS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 238, 75, 13, 14 @@ -95,7 +95,7 @@ BEGIN EDITTEXT IDC_EDIT_WINDOW_POS_TOP, 203, 146, 35, 14, ES_RIGHT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_WINDOW_POS_TOP, UPDOWN_CLASS, UDS_NOTHOUSANDS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 238, 146, 13, 14 - AUTOCHECKBOX "Po&ziționat de sistem", IDC_CHECK_SYSTEM_POS_WINDOW, 137, 165, 104, 10 + AUTOCHECKBOX "Fereastră po&ziționată de sist.", IDC_CHECK_SYSTEM_POS_WINDOW, 137, 165, 104, 10 END IDD_PROPPAGECOLORS DIALOGEX 0, 0, 253, 220 @@ -103,11 +103,11 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Culori" FONT 8, "MS Shell Dlg" BEGIN - AUTORADIOBUTTON "T&ext ecran", IDC_RADIO_SCREEN_TEXT, 10, 12, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "F&undal ecran", IDC_RADIO_SCREEN_BACKGROUND, 10, 30, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "Te&xt ferestre popup", IDC_RADIO_POPUP_TEXT, 10, 48, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "Fun&dal ferestre popup", IDC_RADIO_POPUP_BACKGROUND, 10, 67, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - GROUPBOX "Paleta culorii selectate:", IDC_STATIC, 129, 7, 118, 73 + AUTORADIOBUTTON "&Textul ecranului", IDC_RADIO_SCREEN_TEXT, 10, 12, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTORADIOBUTTON "&Fundalul ecranului", IDC_RADIO_SCREEN_BACKGROUND, 10, 30, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTORADIOBUTTON "Te&xtul ferestrelor popup", IDC_RADIO_POPUP_TEXT, 10, 48, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTORADIOBUTTON "F&undalul ferestrelor popup", IDC_RADIO_POPUP_BACKGROUND, 10, 67, 112, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + GROUPBOX "Componentele de culoare selectate", IDC_STATIC, 129, 7, 118, 73 LTEXT "&Roșu:", IDC_STATIC, 140, 25, 48, 10 EDITTEXT IDC_EDIT_COLOR_RED, 210, 22, 30, 14, ES_RIGHT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_COLOR_RED, UPDOWN_CLASS, UDS_SETBUDDYINT | UDS_ALIGNRIGHT | @@ -144,20 +144,20 @@ END IDD_APPLYOPTIONS DIALOGEX 0, 0, 220, 79 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Aplicare proprietăți" +CAPTION "Aplicare a proprietăților" FONT 8, "MS Shell Dlg" BEGIN - AUTORADIOBUTTON "&Doar pentru această fereastră", IDC_RADIO_APPLY_CURRENT, 12, 12, 207, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - AUTORADIOBUTTON "&Pentru toate ferestrele cu acest titlu", IDC_RADIO_APPLY_ALL, 12, 31, 207, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "Con&firmă", IDOK, 58, 58, 50, 14, WS_VISIBLE - PUSHBUTTON "A&nulează", IDCANCEL, 114, 58, 50, 14, WS_VISIBLE + AUTORADIOBUTTON "&Aplicare a proprietăților doar pentru festrele curente", IDC_RADIO_APPLY_CURRENT, 12, 12, 207, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + AUTORADIOBUTTON "&Salvare proprietăți pentru ferestrele viitoare cu același titlu", IDC_RADIO_APPLY_ALL, 12, 31, 207, 10, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "OK", IDOK, 58, 58, 50, 14, WS_VISIBLE + PUSHBUTTON "Revocare", IDCANCEL, 114, 58, 50, 14, WS_VISIBLE END STRINGTABLE BEGIN - IDS_CPLNAME "Linie de comandă" - IDS_CPLDESCRIPTION "Configurarea proprietăților pentru programe linie de comandă." - IDS_APPLY_SHORTCUT_ALL "Modifică scurtătura care a pornit aplicația" - IDS_RASTERFONTS "Fonturi rastre" - IDS_GROUPBOX_FONT_NAME "Font selectat: " + IDS_CPLNAME "Consolă" + IDS_CPLDESCRIPTION "Configurează proprietățile pentru consolă." + IDS_APPLY_SHORTCUT_ALL "Modifică &scurtătura care a pornit această aplicație" + IDS_RASTERFONTS "Fonturi raster" + IDS_GROUPBOX_FONT_NAME "Fontul selectat: " END
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [IEFRAME] Update Romanian (ro-RO) translation (#7356)
by Andrei Miloiu
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d8daf05e4a01bf7de65f5…
commit d8daf05e4a01bf7de65f55a5d55f393122d22a5f Author: Andrei Miloiu <miloiuandrei(a)gmail.com> AuthorDate: Fri Dec 6 22:05:33 2024 +0200 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Dec 6 21:05:33 2024 +0100 [IEFRAME] Update Romanian (ro-RO) translation (#7356) --- dll/win32/ieframe/lang/ro-RO.rc | 44 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/dll/win32/ieframe/lang/ro-RO.rc b/dll/win32/ieframe/lang/ro-RO.rc index f188dca9899..c31364a70ec 100644 --- a/dll/win32/ieframe/lang/ro-RO.rc +++ b/dll/win32/ieframe/lang/ro-RO.rc @@ -3,7 +3,7 @@ * LICENSE: LGPL-2.1-or-later (
https://spdx.org/licenses/LGPL-2.1-or-later
) * PURPOSE: Romanian resource file * TRANSLATORS: Copyright 2011-2018 Ștefan Fulea <stefan.fulea(a)mail.com> - * Copyright 2023 Andrei Miloiu <miloiuandrei(a)gmail.com> + * Copyright 2023-2024 Andrei Miloiu <miloiuandrei(a)gmail.com> */ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL @@ -17,30 +17,30 @@ IDR_BROWSE_MAIN_MENU MENU MENUITEM "&Fereastră", ID_BROWSE_NEW_WINDOW } MENUITEM "&Deschidere…", ID_BROWSE_OPEN - MENUITEM "S&alvează", ID_BROWSE_SAVE - MENUITEM "Salvea&ză ca…", ID_BROWSE_SAVE_AS + MENUITEM "&Salvează", ID_BROWSE_SAVE + MENUITEM "S&alvare ca…", ID_BROWSE_SAVE_AS MENUITEM SEPARATOR - MENUITEM "Formatare imprima&bil…", ID_BROWSE_PRINT_FORMAT - MENUITEM "I&mprimare…", ID_BROWSE_PRINT - MENUITEM "Pre&vizionează pagină", ID_BROWSE_PRINT_PREVIEW + MENUITEM "Formatare i&mprimare…", ID_BROWSE_PRINT_FORMAT + MENUITEM "Im&primare…", ID_BROWSE_PRINT + MENUITEM "&Previzionare a paginii", ID_BROWSE_PRINT_PREVIEW MENUITEM SEPARATOR MENUITEM "Pr&oprietăți…", ID_BROWSE_PROPERTIES MENUITEM "I&eșire", ID_BROWSE_QUIT } POPUP "&Afișare" { - POPUP "&Bare" + POPUP "&Bare de instrumente" { MENUITEM "Bară stan&dard", ID_BROWSE_BAR_STD - MENUITEM "Bară de &adrasă", ID_BROWSE_BAR_ADDR + MENUITEM "Bară de &adresă", ID_BROWSE_BAR_ADDR } } POPUP "Fa&vorite" { - MENUITEM "&Adaugă la Favorite…", ID_BROWSE_ADDFAV + MENUITEM "&Adăugare la Favorite…", ID_BROWSE_ADDFAV MENUITEM SEPARATOR } - POPUP "Aj&utor" + POPUP "A&jutor" { MENUITEM "&Despre Internet Explorer", ID_BROWSE_ABOUT } @@ -48,13 +48,13 @@ IDR_BROWSE_MAIN_MENU MENU STRINGTABLE { - IDS_INTERNET "Navigatorul de Internet" - IDS_INTERNET_DESCRIPTION "Deschide navigatorul de rețea și afișează informații din Internet." + IDS_INTERNET "Browserul de Internet" + IDS_INTERNET_DESCRIPTION "Deschide un browser Web și afișează informații de pe Internet." IDS_TB_BACK "Înapoi" IDS_TB_FORWARD "Înainte" - IDS_TB_STOP "Oprește" - IDS_TB_REFRESH "Împrospătează" + IDS_TB_STOP "Oprire" + IDS_TB_REFRESH "Împrospătare" IDS_TB_HOME "Acasă" IDS_TB_PRINT "Imprimare…" } @@ -66,24 +66,24 @@ STRINGTABLE STRINGTABLE { - IDS_FINDINGRESOURCE "În căutarea resursei %s" - IDS_BEGINDOWNLOADDATA "În început de descărcare din %s" - IDS_ENDDOWNLOADDATA "În curs de descărcare din %s" - IDS_SENDINGREQUEST "În așteptarea răspunsului de la %s" + IDS_FINDINGRESOURCE "Se caută %s" + IDS_BEGINDOWNLOADDATA "Începe descărcarea %s" + IDS_ENDDOWNLOADDATA "Se descarcă %s" + IDS_SENDINGREQUEST "Se interoghează %s" } IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70 STYLE DS_MODALFRAME | WS_CAPTION -CAPTION "Deschide URL" +CAPTION "Deschidere URL" FONT 8, "MS Shell Dlg" { - LTEXT "Specificați adresa URL pe care doriți s-o deschideți în Internet Explorer",-1, 35,5,160,25 + LTEXT "Specificați adresa URL pe care doriți să o deschideți în Internet Explorer",-1, 35,5,160,25 LTEXT "Deschide:", -1, 5, 32, 30, 15 #ifdef __REACTOS__ ICON IDC_PAGEICO, IDC_PAGEICO, 2, 5, 21, 20, SS_ICON #endif EDITTEXT IDC_BROWSE_OPEN_URL, 35, 30, 160, 13 - DEFPUSHBUTTON "Con&firmă", IDOK, 90, 50, 50, 14 - PUSHBUTTON "A&nulează", IDCANCEL, 145, 50, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 90, 50, 50, 14 + PUSHBUTTON "Revocare", IDCANCEL, 145, 50, 50, 14 }
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [MSCTFIME] Add Romanian (ro-RO) translation (#7365)
by Andrei Miloiu
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5251d086630c81ebc61f2…
commit 5251d086630c81ebc61f25dae23ad80691346ac6 Author: Andrei Miloiu <miloiuandrei(a)gmail.com> AuthorDate: Fri Dec 6 22:02:30 2024 +0200 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Dec 6 21:02:30 2024 +0100 [MSCTFIME] Add Romanian (ro-RO) translation (#7365) --- dll/ime/msctfime/lang/ro-RO.rc | 23 +++++++++++++++++++++++ dll/ime/msctfime/msctfime.rc | 3 +++ 2 files changed, 26 insertions(+) diff --git a/dll/ime/msctfime/lang/ro-RO.rc b/dll/ime/msctfime/lang/ro-RO.rc new file mode 100644 index 00000000000..91cfb965760 --- /dev/null +++ b/dll/ime/msctfime/lang/ro-RO.rc @@ -0,0 +1,23 @@ +/* + * PROJECT: ReactOS msctfime.ime + * LICENSE: LGPL-2.1-or-later (
https://spdx.org/licenses/LGPL-2.1-or-later
) + * PURPOSE: Romanian resource file + * TRANSLATOR: Copyright 2024 Andrei Miloiu <miloiuandrei(a)gmail.com> + */ + +LANGUAGE LANG_ROMANIAN, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_OK "OK" + IDS_CANCEL "Revocare" + IDS_ABORT "Î&ntrerupere" + IDS_RETRY "&Reîncercare" + IDS_IGNORE "&Ignorare" + IDS_YES "&Da" + IDS_NO "&Nu" + + IDS_ENTER "Intrare" + IDS_FINALIZE_STRING "Finalizare a șirului" + IDS_CONVERSION "Conversie" +END diff --git a/dll/ime/msctfime/msctfime.rc b/dll/ime/msctfime/msctfime.rc index 412ac4783f0..59311d805e4 100644 --- a/dll/ime/msctfime/msctfime.rc +++ b/dll/ime/msctfime/msctfime.rc @@ -33,6 +33,9 @@ IDI_DOWN ICON "res/down.ico" #ifdef LANGUAGE_PT_PT #include "lang/pt-PT.rc" #endif +#ifdef LANGUAGE_RO_RO + #include "lang/ro-RO.rc" +#endif #ifdef LANGUAGE_RU_RU #include "lang/ru-RU.rc" #endif
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [WINED3DCFG] Update Romanian (ro-RO) translation (#7406)
by Andrei Miloiu
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5a030eaa334def1410e03…
commit 5a030eaa334def1410e0383a25e15908aa88b3c1 Author: Andrei Miloiu <miloiuandrei(a)gmail.com> AuthorDate: Fri Dec 6 21:58:25 2024 +0200 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Dec 6 20:58:25 2024 +0100 [WINED3DCFG] Update Romanian (ro-RO) translation (#7406) --- dll/cpl/wined3dcfg/lang/ro-RO.rc | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/dll/cpl/wined3dcfg/lang/ro-RO.rc b/dll/cpl/wined3dcfg/lang/ro-RO.rc index 157eafb3cdd..8152264d0ea 100644 --- a/dll/cpl/wined3dcfg/lang/ro-RO.rc +++ b/dll/cpl/wined3dcfg/lang/ro-RO.rc @@ -1,39 +1,45 @@ -/* Translator: Ștefan Fulea (stefan dot fulea at mail dot com) */ +/* + * PROJECT: ReactOS WineD3D Configuration Control Panel + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Romanian resource file + * TRANSLATORS: Copyright 2011-2018 Ștefan Fulea <stefan.fulea(a)mail.com> + * Copyright 2024 Andrei Miloiu <miloiuandrei(a)gmail.com> + */ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL IDD_PROPPAGEGENERAL DIALOGEX 0, 0, 246, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Generale" +CAPTION "General" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Efecte de umbrire", -1, 5, 25, 230, 80 - LTEXT "Activează GLSL:", -1, 15, 42, 120, 10 + LTEXT "&Activare a GLSL:", -1, 15, 42, 120, 10 COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Nivelul GS maxim:", -1, 15, 57, 120, 10 + LTEXT "Nivelul &GS maxim:", -1, 15, 57, 120, 10 COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Nivelul PS maxim:", -1, 15, 72, 120, 10 + LTEXT "Nivelul &PS maxim:", -1, 15, 72, 120, 10 COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Nivelul VS maxim:", -1, 15, 87, 120, 10 + LTEXT "Nivelul &VS maxim:", -1, 15, 87, 120, 10 COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Randare", -1, 5, 110, 230, 110 - LTEXT "Multieșantionare:", -1, 15, 127, 120, 10 + LTEXT "&Multieșantionare:", -1, 15, 127, 120, 10 COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Ordinea strictă de desenare:", -1, 15, 142, 120, 10 + LTEXT "&Ordine strictă de desenare:", -1, 15, 142, 120, 10 COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Randarea extra-ecran:", -1, 15, 157, 120, 10 + LTEXT "&Randare extra-ecran:", -1, 15, 157, 120, 10 COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Întotdeauna extra-ecran:", -1, 15, 172, 120, 10, SS_LEFT + LTEXT "Î&ntotdeauna extra-ecran:", -1, 15, 172, 120, 10, SS_LEFT COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Dimensiunea memoriei video:", -1, 15, 187, 120, 10, SS_LEFT + LTEXT "Dim&ensiunea memoriei video:", -1, 15, 187, 120, 10, SS_LEFT COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Randator DirectDraw:", -1, 15, 202, 120, 10, SS_LEFT + LTEXT "Randator &DirectDraw:", -1, 15, 202, 120, 10, SS_LEFT COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE BEGIN IDS_CPLNAME "Opțiuni WineD3D" - IDS_CPLDESCRIPTION "Configurarea opțiunilor de execuție WineD3D." + IDS_CPLDESCRIPTION "Configurează setările de rulare WineD3D." END
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [EVENTVWR] Update Romanian (ro-RO) translation (#7352)
by Andrei Miloiu
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c212c184f39109ea6d745…
commit c212c184f39109ea6d745f45d2b3169406c6a33e Author: Andrei Miloiu <miloiuandrei(a)gmail.com> AuthorDate: Fri Dec 6 21:54:26 2024 +0200 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Dec 6 20:54:26 2024 +0100 [EVENTVWR] Update Romanian (ro-RO) translation (#7352) --- base/applications/mscutils/eventvwr/lang/ro-RO.rc | 88 +++++++++++------------ 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/base/applications/mscutils/eventvwr/lang/ro-RO.rc b/base/applications/mscutils/eventvwr/lang/ro-RO.rc index baa02ec0431..947cfad7da7 100644 --- a/base/applications/mscutils/eventvwr/lang/ro-RO.rc +++ b/base/applications/mscutils/eventvwr/lang/ro-RO.rc @@ -14,21 +14,21 @@ BEGIN POPUP "&Jurnal" BEGIN MENUITEM "&Deschidere…", IDM_OPEN_EVENTLOG - MENUITEM "&Salvare jurnal de evenimente ca…", IDM_SAVE_EVENTLOG//FIXME: accelerator collision &S + MENUITEM "&Salvare a jurnalului de evenimente ca…", IDM_SAVE_EVENTLOG MENUITEM "Î&nchidere", IDM_CLOSE_EVENTLOG MENUITEM SEPARATOR MENUITEM "Înlăt&urare a tuturor evenimentelor", IDM_CLEAR_EVENTS MENUITEM "&Redenumire\tF2", IDM_RENAME_EVENTLOG - MENUITEM "&Setări pentru jurnal…", IDM_EVENTLOG_SETTINGS//FIXME: accelerator collision &S + MENUITEM "Se&tări pentru jurnal…", IDM_EVENTLOG_SETTINGS MENUITEM SEPARATOR MENUITEM "I&eșire", IDM_EXIT END POPUP "&Afișare" BEGIN - MENUITEM "După vârstă &crescător", IDM_LIST_NEWEST - MENUITEM "După vârstă &descrescător", IDM_LIST_OLDEST//FIXME: accelerator collision &D + MENUITEM "Cel mai &nou primul", IDM_LIST_NEWEST + MENUITEM "Cel mai &vechi primul", IDM_LIST_OLDEST MENUITEM SEPARATOR - MENUITEM "&Detalii…\tEnter", IDM_EVENT_DETAILS//FIXME: accelerator collision &D + MENUITEM "&Detalii…\tEnter", IDM_EVENT_DETAILS MENUITEM SEPARATOR MENUITEM "Împ&rospătare\tF5", IDM_REFRESH END @@ -41,7 +41,7 @@ BEGIN END POPUP "Aj&utor" BEGIN - MENUITEM "&Manual…", IDM_HELP + MENUITEM "Aju&tor", IDM_HELP MENUITEM SEPARATOR MENUITEM "&Despre…", IDM_ABOUT END @@ -51,12 +51,12 @@ IDM_EVENTWR_CTX MENU BEGIN POPUP "" BEGIN - MENUITEM "&Deschidere jurnalul de evenimente...", IDM_OPEN_EVENTLOG - MENUITEM "Salv&are jurnal de evenimente ca...", IDM_SAVE_EVENTLOG + MENUITEM "&Deschidere jurnalul de evenimente…", IDM_OPEN_EVENTLOG + MENUITEM "Salv&are a jurnalului de evenimente ca…", IDM_SAVE_EVENTLOG MENUITEM SEPARATOR - MENUITEM "Șter&gere toate evenimentele", IDM_CLEAR_EVENTS + MENUITEM "Șter&gere a tuturor evenimentelor", IDM_CLEAR_EVENTS MENUITEM "&Redenumire\tF2", IDM_RENAME_EVENTLOG - MENUITEM "Setări de &jurnal...", IDM_EVENTLOG_SETTINGS + MENUITEM "Setări ale &jurnalului…", IDM_EVENTLOG_SETTINGS END END @@ -71,12 +71,12 @@ END IDD_EVENTDETAILS_DLG DIALOGEX 0, 0, 266, 240 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_THICKFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Detalii eveniment" +CAPTION "Detalii despre eveniment" FONT 8, "MS Shell Dlg" BEGIN LTEXT "EvtDetailsCtrl", IDC_STATIC, 0, 0, 266, 215 - PUSHBUTTON "&Manual…", IDHELP, 8, 220, 50, 14 - DEFPUSHBUTTON "Î&nchide", IDOK, 208, 220, 50, 14 + PUSHBUTTON "&Ajutor", IDHELP, 8, 220, 50, 14 + DEFPUSHBUTTON "Î&nchidere", IDOK, 208, 220, 50, 14 END IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215 @@ -115,79 +115,79 @@ END IDD_LOGPROPERTIES_GENERAL DIALOGEX 0, 0, 252, 234 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Generale" +CAPTION "General" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "N&ume afișat:", IDC_STATIC, 7, 9, 60, 8 + LTEXT "&Nume afișat:", IDC_STATIC, 7, 9, 60, 8 EDITTEXT IDC_DISPLAYNAME, 67, 7, 178, 12, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP - LTEXT "Nume de ju&rnal:", IDC_STATIC, 7, 25, 60, 8 + LTEXT "Numele &jurnalului:", IDC_STATIC, 7, 25, 60, 8 EDITTEXT IDC_LOGNAME, 67, 23, 178, 12, ES_LEFT | ES_AUTOHSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP - LTEXT "Fiși&er de jurnal:", IDC_STATIC, 7, 41, 60, 8 + LTEXT "&Fișier de jurnal:", IDC_STATIC, 7, 41, 60, 8 EDITTEXT IDC_LOGFILE, 67, 39, 178, 12, ES_LEFT | ES_AUTOHSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP // The following 4 IDC_STATIC shall have accels in ReactOS, although MS doesn't have accels for them. // Translation note: First fill out ALL accels that MS has in this dialog for your language, // and only then as a final step use some remaining unused letters for those 4 controls! - LTEXT "Dimen&siune:", IDC_STATIC, 7, 57, 60, 8 + LTEXT "&Dimensiune:", IDC_STATIC, 7, 57, 60, 8 EDITTEXT IDC_SIZE_LABEL, 67, 57, 178, 12, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "Crea&t:", IDC_STATIC, 7, 69, 60, 8 + LTEXT "&Creat:", IDC_STATIC, 7, 69, 60, 8 EDITTEXT IDC_CREATED_LABEL, 67, 69, 178, 12, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL LTEXT "&Modificat:", IDC_STATIC, 7, 81, 60, 8 EDITTEXT IDC_MODIFIED_LABEL, 67, 81, 178, 12, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL LTEXT "&Accesat:", IDC_STATIC, 7, 93, 60, 8 EDITTEXT IDC_ACCESSED_LABEL, 67, 93, 178, 12, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - GROUPBOX "Dimensiune jurnal", IDC_STATIC, 7, 106, 238, 99 - LTEXT "Dimensiune ma&ximă pentru jurnal:", IDC_STATIC, 17, 122, 58, 8 + GROUPBOX "Dimensiunea jurnalului", IDC_STATIC, 7, 106, 238, 99 + LTEXT "Dimensiune ma&ximă a jurnalului:", IDC_STATIC, 17, 122, 58, 8 EDITTEXT IDC_EDIT_MAXLOGSIZE, 80, 119, 40, 14, ES_LEFT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_MAXLOGSIZE, UPDOWN_CLASS, UDS_SETBUDDYINT | UDS_NOTHOUSANDS | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 120, 119, 10, 14 - LTEXT "Kio", IDC_STATIC, 130, 122, 20, 8 + LTEXT "KB", IDC_STATIC, 130, 122, 20, 8 LTEXT "Când dimensiunea maximă este atinsă:", IDC_STATIC, 17, 140, 219, 8 - AUTORADIOBUTTON "Suprascrie evenimentele cân&d este necesar", IDC_OVERWRITE_AS_NEEDED, 17, 155, 219, 10, WS_GROUP | WS_TABSTOP - AUTORADIOBUTTON "Suprascrie evenimentele mai &vechi de", IDC_OVERWRITE_OLDER_THAN, 17, 168, 155, 10 - AUTORADIOBUTTON "Inter&zice suprascrierea\n(gestiune manuală de jurnal)", IDC_NO_OVERWRITE, 17, 180, 143, 20, BS_MULTILINE | WS_TABSTOP + AUTORADIOBUTTON "&Suprascriere a evenimentelor când este necesar", IDC_OVERWRITE_AS_NEEDED, 17, 155, 219, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "Suprascriere a evenimentelor mai &vechi de", IDC_OVERWRITE_OLDER_THAN, 17, 168, 155, 10 + AUTORADIOBUTTON "Nu se suprascriu evenimentele\n(&golire manuală a jurnalului)", IDC_NO_OVERWRITE, 17, 180, 143, 20, BS_MULTILINE | WS_TABSTOP EDITTEXT IDC_EDIT_EVENTS_AGE, 175, 165, 35, 14, ES_LEFT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_EVENTS_AGE, UPDOWN_CLASS, UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS, 104, 165, 10, 14 LTEXT "zile", IDC_STATIC, 215, 168, 20, 8 - PUSHBUTTON "&Opțiuni implicite", IDC_RESTOREDEFAULTS, 166, 183, 70, 14 - AUTOCHECKBOX "Conexiune de &bandă limitată", IDC_LOW_SPEED_CONNECTION, 7, 217, 167, 10 + PUSHBUTTON "&Restaurare implicite", IDC_RESTOREDEFAULTS, 166, 183, 70, 14 + AUTOCHECKBOX "&Folosind o conexiune de viteză mică", IDC_LOW_SPEED_CONNECTION, 7, 217, 167, 10 PUSHBUTTON "&Curăță jurnal", ID_CLEARLOG, 195, 213, 50, 14 END STRINGTABLE BEGIN IDS_COPYRIGHT "Drept de autor (C) 2007 Marc Piulachs (marc.piulachs(a)codexchange.net)" - IDS_APP_TITLE "Observator de evenimente" + IDS_APP_TITLE "Vizualizator de evenimente" IDS_APP_TITLE_EX "%s - %s autentificat pe \\\\" IDS_STATUS_MSG "%s are %lu (de) eveniment(e) (afișate: %lu)" - IDS_LOADING_WAIT "Jurnal de evenimente în încărcare. Așteptați…" - IDS_NO_ITEMS "Nu există elemente de afișat." // "No events in this log." + IDS_LOADING_WAIT "Se încarcă jurnalele de evenimente. Așteptați…" + IDS_NO_ITEMS "Nu există elemente de afișat în această vizualizare." // "No events in this log." IDS_EVENTLOG_SYSTEM "Jurnale de sistem" - IDS_EVENTLOG_APP "Jurnale de aplicație" + IDS_EVENTLOG_APP "Jurnale de aplicații" IDS_EVENTLOG_USER "Jurnale de utilizator" IDS_SAVE_FILTER "Jurnal de evenimente (*.evt)\0*.evt\0" IDS_CLEAREVENTS_MSG "Doriți să salvați acest jurnal de evenimente înainte de a-l închide?" - IDS_RESTOREDEFAULTS "Doriți să restaurați toate setările pentru acest jurnal la valorile lor implicite?" - IDS_EVENTSTRINGIDNOTFOUND "Descrierea evenimentului cu ID-ul ( %lu ) în sursa ( %s ) nu a fost găsită. Este posibil ca în calculatorul local să nu existe informațiile de registru necesare sau fișierele dll de mesaje să afișeze mesaje de la un calculator din rețea.\n\nInformații aferente evenimentului:\n\n" + IDS_RESTOREDEFAULTS "Doriți să restabiliți toate setările pentru acest jurnal la valorile lor implicite?" + IDS_EVENTSTRINGIDNOTFOUND "Imposibil de găsit descrierea evenimentului cu ID-ul ( %lu ) în sursa ( %s ). Este posibil ca computerul local să nu aibă informațiile de registru necesare sau fișierele DLL de mesaje pentru a afișa mesaje de la un computer la distanță.\n\nUrmătoarele informații fac parte din eveniment:\n\n" END STRINGTABLE BEGIN /* Please note that explicit TAB characters '\t' are used to fix the alignment of the message in the MessageBox */ - IDS_USAGE "Inspector de Evenimente ReactOS\n\ + IDS_USAGE "Vizualizatorul de evenimente ReactOS\n\ \n\ -EventVwr [nume calculator] [/L:<fișier jurnal de evenimente>] [/?]\n\ +EventVwr [numele computerului] [/L:<fișier de jurnal de evenimente>] [/?]\n\ \n\ -""nume calculator"" : Specifică calculatorul la distanță de la care\n\ -\tvor fi preluate evenimentele afișate. Dacă nu e furnizat un\n\ -\tnume de calculator, va fi utilizat calculatorul local.\n\ +""numele computerului"" : Specifică computerul de la distanță unde să se conecteze\n\ +\pentru a prelua evenimentele de afișat. Dacă nu este specificat niciun nume,\n\ +\tcomputerul local este folosit.\n\ \n\ -/L:<fișier jurnal de evenimente> : Specifică deschiderea unui fișier.\n\ +/L:<fișier de jurnal de evenimente> : Specifică deschiderea unui fișier.\n\ \tSunt acceptate doar fișierele în format .evt (NT ≤ 5.2)\n\ \n\ /? : Afișează acest mesaj cu informații de utilizare.\n\ " - IDS_EVENTLOGFILE "Fișier jurnal de evenimente" + IDS_EVENTLOGFILE "Fișier de jurnal de evenimente" END STRINGTABLE @@ -216,7 +216,7 @@ BEGIN IDS_COLUMNCATEGORY "Categorie" IDS_COLUMNEVENT "Eveniment" IDS_COLUMNUSER "Utilizator" - IDS_COLUMNCOMPUTER "Calculator" + IDS_COLUMNCOMPUTER "Computer" END STRINGTABLE @@ -229,12 +229,12 @@ ID eveniment: %s\r\n\ Dată: %s\r\n\ Oră: %s\r\n\ Utilizator: %s\r\n\ -Calculator: %s\r\n\ +Computer: %s\r\n\ Descriere:\r\n%s" END STRINGTABLE BEGIN - IDS_NONE "Nespecificată" - IDS_NOT_AVAILABLE "Nespecificat" + IDS_NONE "Nespecificat" + IDS_NOT_AVAILABLE "N/A" END
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [FDEBUG] Update Romanian (ro-RO) translation (#7340)
by Andrei Miloiu
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6ec5f8841beae660c9dd9…
commit 6ec5f8841beae660c9dd92d36a4451d6b6da5ba8 Author: Andrei Miloiu <miloiuandrei(a)gmail.com> AuthorDate: Fri Dec 6 21:48:33 2024 +0200 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Dec 6 20:48:33 2024 +0100 [FDEBUG] Update Romanian (ro-RO) translation (#7340) --- boot/freeldr/fdebug/lang/ro-RO.rc | 40 +++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/boot/freeldr/fdebug/lang/ro-RO.rc b/boot/freeldr/fdebug/lang/ro-RO.rc index ac354a92b50..4df4ad77df7 100644 --- a/boot/freeldr/fdebug/lang/ro-RO.rc +++ b/boot/freeldr/fdebug/lang/ro-RO.rc @@ -1,4 +1,10 @@ -/* Translator: Ștefan Fulea (stefan dot fulea at mail dot com) */ +/* + * PROJECT: ReactOS FreeLoader Debugger + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Romanian resource file + * TRANSLATORS: Copyright 2011-2018 Ștefan Fulea <stefan.fulea(a)mail.com> + * Copyright 2024 Andrei Miloiu <miloiuandrei(a)gmail.com> + */ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL @@ -10,16 +16,16 @@ BEGIN MENUITEM "&Conectare", IDM_FILE_CONNECT MENUITEM "&Deconectare", IDM_FILE_DISCONNECT, GRAYED MENUITEM SEPARATOR - MENUITEM "C&urăță ecran", IDM_FILE_CLEARDISPLAY + MENUITEM "C&urățare a ecranului", IDM_FILE_CLEARDISPLAY MENUITEM SEPARATOR - MENUITEM "&Pornește captură", IDM_FILE_STARTCAPTURE - MENUITEM "&Oprește captură", IDM_FILE_STOPCAPTURE, GRAYED + MENUITEM "&Pornire a capturii", IDM_FILE_STARTCAPTURE + MENUITEM "&Oprire a capturii", IDM_FILE_STOPCAPTURE, GRAYED MENUITEM SEPARATOR MENUITEM "Ecou loc&al", IDM_FILE_LOCALECHO MENUITEM SEPARATOR MENUITEM "I&eșire", IDM_EXIT END - POPUP "Aj&utor" + POPUP "&Ajutor" BEGIN MENUITEM "&Despre…", IDM_ABOUT END @@ -41,8 +47,6 @@ FONT 8, "MS Shell Dlg" BEGIN CONTROL "Depanatorul FreeLoader\nDrept de autor (C) 2003\nde Brian Palmer (brianp(a)reactos.org)", IDC_STATIC, "Static", SS_LEFTNOWORDWRAP | WS_GROUP, 53, 28, 122, 26 DEFPUSHBUTTON "Î&nchide", IDOK, 189, 44, 50, 14, WS_GROUP - ICON IDI_FDEBUG, IDC_STATIC, 19, 30, 20, 20 - EDITTEXT IDC_LICENSE_EDIT, 53, 63, 174, 107, ES_MULTILINE | ES_READONLY | WS_VSCROLL END IDD_CONNECTION DIALOGEX 0, 0, 196, 100 @@ -50,12 +54,12 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Opțiuni de conectare" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Alegeți portul COM (ex. COM1):", IDC_STATIC, 7, 7, 108, 8 + LTEXT "Treceți portul COM (ex. COM1):", IDC_STATIC, 7, 7, 108, 8 EDITTEXT IDC_COMPORT, 7, 17, 182, 14, ES_AUTOHSCROLL - LTEXT "Rata baud (ex. 115200):", IDC_STATIC, 7, 38, 114, 8 + LTEXT "Treceți rata baud (ex. 115200):", IDC_STATIC, 7, 38, 114, 8 EDITTEXT IDC_BAUTRATE, 7, 48, 182, 14, ES_AUTOHSCROLL - DEFPUSHBUTTON "Con&firmă", IDOK, 45, 79, 50, 14 - PUSHBUTTON "A&nulează", IDCANCEL, 100, 79, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 45, 79, 50, 14 + PUSHBUTTON "Revocare", IDCANCEL, 100, 79, 50, 14 END IDD_CAPTURE DIALOGEX 0, 0, 251, 95 @@ -63,23 +67,23 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Fișierul de captură" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Numele fișierului:", IDC_STATIC, 7, 17, 62, 8 + LTEXT "Nume fișier capt.:", IDC_STATIC, 7, 17, 62, 8 EDITTEXT IDC_CAPTUREFILENAME, 7, 26, 181, 14, ES_AUTOHSCROLL - PUSHBUTTON "&Caută", IDC_BROWSE, 194, 26, 50, 14 - DEFPUSHBUTTON "Con&firmă", IDOK, 139, 74, 50, 14 - PUSHBUTTON "A&nulează", IDCANCEL, 194, 74, 50, 14 + PUSHBUTTON "&Specificare", IDC_BROWSE, 194, 26, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 139, 74, 50, 14 + PUSHBUTTON "Revocare", IDCANCEL, 194, 74, 50, 14 END /* String Tables */ STRINGTABLE BEGIN - IDS_APP_TITLE "Program de depanare FreeLoader" - IDS_HELLO "Salut, lume!" + IDS_APP_TITLE "Depanatorul FreeLoader" + IDS_HELLO "Salut lume!" IDC_FDEBUG "FDEBUG" END STRINGTABLE BEGIN - IDS_LICENSE "Această aplicație este un soft public; poate fi redistribuită și/sau modificată respectând termenii Licenței Publice Generale GNU publicată de Free Software Foundation; sau respectând Licența în versiunea 2, sau (la alegere) o altă versiune ulterioară.\r\n\r\nAceastă aplicație este distribuită în speranța că va fi utilă, FĂRĂ însă NICI O GARANŢIE; nici măcar cu garanția implicită a VANDABILITĂŢII sau a UTILITĂŢII ÎNTR-UN SCOP ANUME. Consultați Licența Publică Generală G [...] + IDS_LICENSE "Acest program este un software liber: dumneavoastră îl puteţi redistribui şi/sau modifica, în condiţiile Licenţei publice generale GNU, aşa cum a fost aceasta publicată de către Free Software Foundation, fie versiunea 2 a acestei Licenţe, fie (la alegerea dumneavoastră), orice versiune ulterioară.\r\n\r\nAcest program este distribuit în speranţa că va fi util, dar FĂRĂ NICIO GARANŢIE; chiar şi fără garanţia implicită de MERCANTILITATE sau de ADECVARE PENTRU UN ANUMIT SCO [...] END
6 months, 3 weeks
1
0
0
0
[reactos] 01/01: [CABVIEW] Add CabView shell extension (#7494)
by Whindmar Saksit
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=63bb46a2fd416f539ae11…
commit 63bb46a2fd416f539ae118b7a656f162252dadd4 Author: Whindmar Saksit <whindsaks(a)proton.me> AuthorDate: Thu Dec 5 15:14:55 2024 +0100 Commit: GitHub <noreply(a)github.com> CommitDate: Thu Dec 5 15:14:55 2024 +0100 [CABVIEW] Add CabView shell extension (#7494) CORE-14616 --- dll/shellext/CMakeLists.txt | 1 + dll/shellext/cabview/CMakeLists.txt | 21 + dll/shellext/cabview/cabview.cpp | 66 +++ dll/shellext/cabview/cabview.h | 240 +++++++++ dll/shellext/cabview/cabview.rc | 75 +++ dll/shellext/cabview/cabview.spec | 4 + dll/shellext/cabview/extract.cpp | 248 ++++++++++ dll/shellext/cabview/folder.cpp | 857 +++++++++++++++++++++++++++++++++ dll/shellext/cabview/lang/de-DE.rc | 21 + dll/shellext/cabview/lang/en-US.rc | 21 + dll/shellext/cabview/lang/et-EE.rc | 21 + dll/shellext/cabview/lang/fr-FR.rc | 21 + dll/shellext/cabview/lang/hi-IN.rc | 21 + dll/shellext/cabview/lang/it-IT.rc | 21 + dll/shellext/cabview/lang/ja-JP.rc | 21 + dll/shellext/cabview/lang/pl-PL.rc | 22 + dll/shellext/cabview/lang/pt-PT.rc | 21 + dll/shellext/cabview/lang/ro-RO.rc | 22 + dll/shellext/cabview/lang/ru-RU.rc | 21 + dll/shellext/cabview/lang/sv-SE.rc | 21 + dll/shellext/cabview/lang/tr-TR.rc | 21 + dll/shellext/cabview/lang/zh-CN.rc | 22 + dll/shellext/cabview/lang/zh-HK.rc | 22 + dll/shellext/cabview/lang/zh-TW.rc | 23 + dll/shellext/cabview/precomp.h | 34 ++ dll/shellext/cabview/res/cabview.rgs | 47 ++ dll/shellext/cabview/res/folder.ico | Bin 0 -> 26070 bytes dll/shellext/cabview/resource.h | 25 + dll/shellext/cabview/util.h | 156 ++++++ dll/win32/browseui/CProgressDialog.cpp | 1 + media/inf/syssetup.inf | 1 + 31 files changed, 2118 insertions(+) diff --git a/dll/shellext/CMakeLists.txt b/dll/shellext/CMakeLists.txt index 8d005319c4c..a9c8fe256ef 100644 --- a/dll/shellext/CMakeLists.txt +++ b/dll/shellext/CMakeLists.txt @@ -1,5 +1,6 @@ add_subdirectory(acppage) +add_subdirectory(cabview) add_subdirectory(cryptext) add_subdirectory(deskadp) add_subdirectory(deskmon) diff --git a/dll/shellext/cabview/CMakeLists.txt b/dll/shellext/cabview/CMakeLists.txt new file mode 100644 index 00000000000..3a574a8933f --- /dev/null +++ b/dll/shellext/cabview/CMakeLists.txt @@ -0,0 +1,21 @@ + +spec2def(cabview.dll cabview.spec) + +list(APPEND SOURCE + cabview.cpp + extract.cpp + folder.cpp + resource.h) + +add_library(cabview MODULE + ${SOURCE} + cabview.spec + cabview.rc + ${CMAKE_CURRENT_BINARY_DIR}/cabview.def) + +set_module_type(cabview win32dll UNICODE) +target_link_libraries(cabview uuid cpprt atl_classes) +set_target_cpp_properties(cabview WITH_EXCEPTIONS) +add_importlibs(cabview cabinet oleaut32 ole32 shlwapi comctl32 shell32 user32 advapi32 msvcrt kernel32 ntdll) +add_pch(cabview precomp.h SOURCE) +add_cd_file(TARGET cabview DESTINATION reactos/system32 FOR all) diff --git a/dll/shellext/cabview/cabview.cpp b/dll/shellext/cabview/cabview.cpp new file mode 100644 index 00000000000..fc6d2d7302e --- /dev/null +++ b/dll/shellext/cabview/cabview.cpp @@ -0,0 +1,66 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: DLL entry point + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#include "cabview.h" + +#include <initguid.h> +DEFINE_GUID(CLSID_CabFolder, 0x0CD7A5C0,0x9F37,0x11CE,0xAE,0x65,0x08,0x00,0x2B,0x2E,0x12,0x62); + +CComModule g_Module; + +BEGIN_OBJECT_MAP(ObjectMap) + OBJECT_ENTRY(CLSID_CabFolder, CCabFolder) +END_OBJECT_MAP() + +EXTERN_C BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hInstance); + g_Module.Init(ObjectMap, hInstance, NULL); + break; + } + + return TRUE; +} + +STDAPI DllCanUnloadNow() +{ + return g_Module.DllCanUnloadNow(); +} + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + return g_Module.DllGetClassObject(rclsid, riid, ppv); +} + +STDAPI DllRegisterServer() +{ + HRESULT hr; + + hr = g_Module.DllRegisterServer(FALSE); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + hr = g_Module.UpdateRegistryFromResource(IDR_FOLDER, TRUE, NULL); + if (FAILED(hr)) + return hr; + + return S_OK; +} + +STDAPI DllUnregisterServer() +{ + HRESULT hr1 = g_Module.DllUnregisterServer(FALSE); + HRESULT hr2 = g_Module.UpdateRegistryFromResource(IDR_FOLDER, FALSE, NULL); + if (FAILED_UNEXPECTEDLY(hr1)) + return hr1; + if (FAILED_UNEXPECTEDLY(hr2)) + return hr2; + return S_OK; +} diff --git a/dll/shellext/cabview/cabview.h b/dll/shellext/cabview/cabview.h new file mode 100644 index 00000000000..dbc20744dfd --- /dev/null +++ b/dll/shellext/cabview/cabview.h @@ -0,0 +1,240 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Main header file + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#pragma once +#include "precomp.h" +#include "resource.h" + +#define FLATFOLDER TRUE + +EXTERN_C const GUID CLSID_CabFolder; + +enum EXTRACTCALLBACKMSG { ECM_BEGIN, ECM_FILE, ECM_PREPAREPATH, ECM_ERROR }; +struct EXTRACTCALLBACKDATA +{ + LPCWSTR Path; + const FDINOTIFICATION *pfdin; + HRESULT hr; +}; +typedef HRESULT (CALLBACK*EXTRACTCALLBACK)(EXTRACTCALLBACKMSG msg, const EXTRACTCALLBACKDATA &data, LPVOID cookie); +HRESULT ExtractCabinet(LPCWSTR cab, LPCWSTR destination, EXTRACTCALLBACK callback, LPVOID cookie); + +class CEnumIDList : + public CComObjectRootEx<CComMultiThreadModelNoCS>, + public IEnumIDList +{ +protected: + HDPA m_Items; + ULONG m_Pos; + +public: + static int CALLBACK DPADestroyCallback(void *pidl, void *pData) + { + SHFree(pidl); + return TRUE; + } + + CEnumIDList() : m_Pos(0) + { + m_Items = DPA_Create(0); + } + + virtual ~CEnumIDList() + { + DPA_DestroyCallback(m_Items, DPADestroyCallback, NULL); + } + + int FindNamedItem(PCUITEMID_CHILD pidl) const; + HRESULT Fill(LPCWSTR path, HWND hwnd = NULL, SHCONTF contf = 0); + HRESULT Fill(PCIDLIST_ABSOLUTE pidl, HWND hwnd = NULL, SHCONTF contf = 0); + + HRESULT Append(LPCITEMIDLIST pidl) + { + return DPA_AppendPtr(m_Items, (void*)pidl) != DPA_ERR ? S_OK : E_OUTOFMEMORY; + } + + UINT GetCount() const { return m_Items ? DPA_GetPtrCount(m_Items) : 0; } + + // IEnumIDList + IFACEMETHODIMP Next(ULONG celt, PITEMID_CHILD *rgelt, ULONG *pceltFetched) + { + if (!rgelt) + return E_INVALIDARG; + HRESULT hr = S_FALSE; + UINT count = GetCount(), fetched = 0; + if (m_Pos < count && fetched < celt) + { + if (SUCCEEDED(hr = SHILClone(DPA_FastGetPtr(m_Items, m_Pos), &rgelt[fetched]))) + fetched++; + } + if (pceltFetched) + *pceltFetched = fetched; + m_Pos += fetched; + return FAILED(hr) ? hr : (celt == fetched && fetched) ? S_OK : S_FALSE; + } + + IFACEMETHODIMP Reset() + { + m_Pos = 0; + return S_OK; + } + + IFACEMETHODIMP Skip(ULONG celt) + { + UINT count = GetCount(), newpos = m_Pos + celt; + if (celt > count || newpos >= count) + return E_INVALIDARG; + m_Pos = newpos; + return S_OK; + } + + IFACEMETHODIMP Clone(IEnumIDList **ppenum) + { + UNIMPLEMENTED; + *ppenum = NULL; + return E_NOTIMPL; + } + + static CEnumIDList* CreateInstance() + { + CComPtr<CEnumIDList> obj; + return SUCCEEDED(ShellObjectCreator(obj)) ? obj.Detach() : NULL; + } + + DECLARE_NO_REGISTRY() + DECLARE_NOT_AGGREGATABLE(CEnumIDList) + + BEGIN_COM_MAP(CEnumIDList) + COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList) + END_COM_MAP() +}; + +class CCabFolder : + public CComCoClass<CCabFolder, &CLSID_CabFolder>, + public CComObjectRootEx<CComMultiThreadModelNoCS>, + public IShellFolder2, + public IPersistFolder2, + public IShellFolderViewCB, + public IShellIcon +{ +protected: + CComHeapPtr<ITEMIDLIST> m_CurDir; + HWND m_ShellViewWindow = NULL; + +public: + HRESULT ExtractFilesUI(HWND hWnd, IDataObject *pDO); + HRESULT GetItemDetails(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd, VARIANT *pv); + int MapSCIDToColumn(const SHCOLUMNID &scid); + HRESULT CompareID(LPARAM lParam, PCUITEMID_CHILD pidl1, PCUITEMID_CHILD pidl2); + + HRESULT CreateEnum(CEnumIDList **List) + { + CEnumIDList *pEIDL = CEnumIDList::CreateInstance(); + *List = pEIDL; + return pEIDL ? pEIDL->Fill(m_CurDir) : E_OUTOFMEMORY; + } + + // IShellFolder2 + IFACEMETHODIMP GetDefaultSearchGUID(GUID *pguid) override + { + return E_NOTIMPL; + } + + IFACEMETHODIMP EnumSearches(IEnumExtraSearch **ppenum) override + { + return E_NOTIMPL; + } + + IFACEMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override; + + IFACEMETHODIMP GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags) override; + + IFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override; + + IFACEMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override; + + IFACEMETHODIMP MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override; + + IFACEMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override + { + UNIMPLEMENTED; + return E_NOTIMPL; + } + + IFACEMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override; + + IFACEMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override; + + IFACEMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override + { + UNIMPLEMENTED; + return E_NOTIMPL; + } + + IFACEMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override; + + IFACEMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override; + + IFACEMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut) override; + + IFACEMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override; + + IFACEMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET pName) override; + + IFACEMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override + { + return E_NOTIMPL; + } + + // IPersistFolder2 + IFACEMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE *pidl) override + { + LPITEMIDLIST curdir = (LPITEMIDLIST)m_CurDir; + return curdir ? SHILClone(curdir, pidl) : E_UNEXPECTED; + } + + IFACEMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidl) override + { + WCHAR path[MAX_PATH]; + if (SHGetPathFromIDListW(pidl, path)) + { + PIDLIST_ABSOLUTE curdir = ILClone(pidl); + if (curdir) + { + m_CurDir.Attach(curdir); + return S_OK; + } + return E_OUTOFMEMORY; + } + return E_INVALIDARG; + } + + IFACEMETHODIMP GetClassID(CLSID *lpClassId) override + { + *lpClassId = CLSID_CabFolder; + return S_OK; + } + + // IShellFolderViewCB + IFACEMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override; + + // IShellIcon + IFACEMETHODIMP GetIconOf(PCUITEMID_CHILD pidl, UINT flags, int *pIconIndex) override; + + DECLARE_NO_REGISTRY() + DECLARE_NOT_AGGREGATABLE(CCabFolder) + + BEGIN_COM_MAP(CCabFolder) + COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder) + COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder) + COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2) + COM_INTERFACE_ENTRY_IID(IID_IShellFolderViewCB, IShellFolderViewCB) + COM_INTERFACE_ENTRY_IID(IID_IShellIcon, IShellIcon) + END_COM_MAP() +}; diff --git a/dll/shellext/cabview/cabview.rc b/dll/shellext/cabview/cabview.rc new file mode 100644 index 00000000000..526888b7b69 --- /dev/null +++ b/dll/shellext/cabview/cabview.rc @@ -0,0 +1,75 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Main resource file + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#include <windef.h> +#include <winuser.h> + +#include "resource.h" + +IDI_FOLDER ICON "res/folder.ico" + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Cabinet Shell Extension" +#define REACTOS_STR_INTERNAL_NAME "cabview" +#define REACTOS_STR_ORIGINAL_FILENAME "cabview.dll" +#include <reactos/version.rc> + +#include <reactos/manifest_dll.rc> + +IDR_FOLDER REGISTRY "res/cabview.rgs" + +/* UTF-8 */ +#pragma code_page(65001) + +#ifdef LANGUAGE_DE_DE + #include "lang/de-DE.rc" +#endif +#ifdef LANGUAGE_EN_US + #include "lang/en-US.rc" +#endif +#ifdef LANGUAGE_ET_EE + #include "lang/et-EE.rc" +#endif +#ifdef LANGUAGE_FR_FR + #include "lang/fr-FR.rc" +#endif +#ifdef LANGUAGE_HI_IN + #include "lang/hi-IN.rc" +#endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif +#ifdef LANGUAGE_JA_JP + #include "lang/ja-JP.rc" +#endif +#ifdef LANGUAGE_PL_PL + #include "lang/pl-PL.rc" +#endif +#ifdef LANGUAGE_PT_PT + #include "lang/pt-PT.rc" +#endif +#ifdef LANGUAGE_RO_RO + #include "lang/ro-RO.rc" +#endif +#ifdef LANGUAGE_RU_RU + #include "lang/ru-RU.rc" +#endif +#ifdef LANGUAGE_SV_SE + #include "lang/sv-SE.rc" +#endif +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" +#endif +#ifdef LANGUAGE_ZH_CN + #include "lang/zh-CN.rc" +#endif +#ifdef LANGUAGE_ZH_HK + #include "lang/zh-HK.rc" +#endif +#ifdef LANGUAGE_ZH_TW + #include "lang/zh-TW.rc" +#endif diff --git a/dll/shellext/cabview/cabview.spec b/dll/shellext/cabview/cabview.spec new file mode 100644 index 00000000000..b16365d0c9f --- /dev/null +++ b/dll/shellext/cabview/cabview.spec @@ -0,0 +1,4 @@ +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() diff --git a/dll/shellext/cabview/extract.cpp b/dll/shellext/cabview/extract.cpp new file mode 100644 index 00000000000..cdb1ff19d79 --- /dev/null +++ b/dll/shellext/cabview/extract.cpp @@ -0,0 +1,248 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: FDI API wrapper + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#include "precomp.h" +#include "cabview.h" +#include "util.h" +#include <fcntl.h> + +struct EXTRACTCABINETINTERNALDATA +{ + LPCWSTR destination; + EXTRACTCALLBACK callback; + LPVOID cookie; +}; + +static LPWSTR BuildPath(LPCWSTR Dir, LPCSTR File, UINT Attr) +{ + UINT cp = Attr & _A_NAME_IS_UTF ? CP_UTF8 : CP_ACP; + UINT cchfile = MultiByteToWideChar(cp, 0, File, -1, 0, 0); + SIZE_T lendir = lstrlenW(Dir), cch = lendir + 1 + cchfile; + LPWSTR path = (LPWSTR)SHAlloc(cch * sizeof(*path)); + if (path) + { + lstrcpyW(path, Dir); + if (lendir && !IsPathSep(path[lendir - 1])) + path[lendir++] = '\\'; + + LPWSTR dst = &path[lendir]; + MultiByteToWideChar(cp, 0, File + IsPathSep(*File), -1, dst, cchfile); + for (SIZE_T i = 0; dst[i]; ++i) + { + if (dst[i] == L':' && lendir) // Don't allow absolute paths + dst[i] = L'_'; + if (dst[i] == L'/') // Normalize + dst[i] = L'\\'; + } + } + return path; +} + +static HRESULT HResultFrom(const ERF &erf) +{ + switch (erf.fError ? erf.erfOper : FDIERROR_NONE) + { + case FDIERROR_NONE: + return erf.fError ? HRESULT_FROM_WIN32(erf.erfType) : S_OK; + case FDIERROR_CABINET_NOT_FOUND: + return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + case FDIERROR_ALLOC_FAIL: + return E_OUTOFMEMORY; + case FDIERROR_USER_ABORT: + return S_FALSE; + default: + return erf.erfType ? HRESULT_FROM_WIN32(erf.erfType) : E_FAIL; + } +} + +FNFREE(CabMemFree) +{ + SHFree(pv); +} + +FNALLOC(CabMemAlloc) +{ + return SHAlloc(cb); +} + +FNCLOSE(CabClose) +{ + return CloseHandle((HANDLE)hf) ? 0 : -1; +} + +static INT_PTR CabOpenEx(LPCWSTR path, UINT access, UINT share, UINT disp, UINT attr) +{ + return (INT_PTR)CreateFileW(path, access, share, NULL, disp, attr, NULL); +} + +FNOPEN(CabOpen) +{ + UINT disp = (oflag & _O_CREAT) ? CREATE_ALWAYS : OPEN_EXISTING; + UINT access = GENERIC_READ; + if (oflag & _O_RDWR) + access = GENERIC_READ | GENERIC_WRITE; + else if (oflag & _O_WRONLY) + access = GENERIC_WRITE; + UNREFERENCED_PARAMETER(pmode); + WCHAR buf[MAX_PATH * 2]; + MultiByteToWideChar(CP_UTF8, 0, pszFile, -1, buf, _countof(buf)); + return CabOpenEx(buf, access, FILE_SHARE_READ, disp, FILE_ATTRIBUTE_NORMAL); +} + +FNREAD(CabRead) +{ + DWORD dwBytesRead; + return ReadFile((HANDLE)hf, pv, cb, &dwBytesRead, NULL) ? dwBytesRead : -1; +} + +FNWRITE(CabWrite) +{ + DWORD dwBytesWritten; + return WriteFile((HANDLE)hf, pv, cb, &dwBytesWritten, NULL) ? dwBytesWritten : -1; +} + +FNSEEK(CabSeek) +{ + return SetFilePointer((HANDLE)hf, dist, NULL, seektype); +} + +static HRESULT Init(HFDI &hfdi, ERF &erf) +{ + const int cpu = cpuUNKNOWN; + hfdi = FDICreate(CabMemAlloc, CabMemFree, CabOpen, CabRead, CabWrite, CabClose, CabSeek, cpu, &erf); + return hfdi ? S_OK : HResultFrom(erf); +} + +FNFDINOTIFY(ExtractCabinetCallback) +{ + const UINT attrmask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE; + EXTRACTCABINETINTERNALDATA &ecd = *(EXTRACTCABINETINTERNALDATA*)pfdin->pv; + EXTRACTCALLBACKDATA noti; + HRESULT hr; + FILETIME ft; + + noti.pfdin = pfdin; + switch (fdint) + { + case fdintCOPY_FILE: + hr = ecd.callback(ECM_FILE, noti, ecd.cookie); + if (hr == S_OK) + { + hr = E_OUTOFMEMORY; + LPWSTR path = BuildPath(ecd.destination, pfdin->psz1, pfdin->attribs); + if (path) + { + // Callee is using SHPPFW_IGNOREFILENAME so we don't need to remove the name. + /*LPWSTR file = PathFindFileNameW(path); + if (file > path) + { + file[-1] = L'\0';*/ + noti.Path = path; + ecd.callback(ECM_PREPAREPATH, noti, ecd.cookie); + /* file[-1] = L'\\'; + }*/ + UINT attr = pfdin->attribs & attrmask; + UINT access = GENERIC_READ | GENERIC_WRITE, share = FILE_SHARE_DELETE; + INT_PTR handle = CabOpenEx(path, access, share, CREATE_NEW, attr | FILE_FLAG_SEQUENTIAL_SCAN); + noti.hr = HResultFromWin32(GetLastError()); + SHFree(path); + if (handle != (INT_PTR)-1) + return handle; + if (ecd.callback(ECM_ERROR, noti, ecd.cookie) != E_NOTIMPL) + hr = noti.hr; + } + } + return hr == S_FALSE ? 0 : -1; + + case fdintCLOSE_FILE_INFO: + if (DosDateTimeToFileTime(pfdin->date, pfdin->time, &ft)) + SetFileTime((HANDLE)(pfdin->hf), NULL, NULL, &ft); + return !CabClose(pfdin->hf); + + case fdintNEXT_CABINET: + if (pfdin->fdie && pfdin->fdie != FDIERROR_USER_ABORT) + { + if (pfdin->fdie == FDIERROR_CABINET_NOT_FOUND) + noti.hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + else + noti.hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); + ecd.callback(ECM_ERROR, noti, ecd.cookie); + } + return pfdin->fdie ? -1 : 0; + + case fdintPARTIAL_FILE: + return 0; + + case fdintCABINET_INFO: + return 0; + + case fdintENUMERATE: + return 0; + } + return -1; +} + +HRESULT ExtractCabinet(LPCWSTR cab, LPCWSTR destination, EXTRACTCALLBACK callback, LPVOID cookie) +{ + BOOL quick = !destination; + if (!destination) + destination = L"?:"; // Dummy path for callers that enumerate without extracting + EXTRACTCABINETINTERNALDATA data = { destination, callback, cookie }; + EXTRACTCALLBACKDATA noti; + ERF erf = { }; + HFDI hfdi; + UINT total = 0, files = 0; + HRESULT hr = Init(hfdi, erf); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + UINT share = FILE_SHARE_READ | FILE_SHARE_DELETE; + INT_PTR hf = quick ? -1 : CabOpenEx(cab, GENERIC_READ, share, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); + if (hf != -1) + { + FDICABINETINFO ci; + if (FDIIsCabinet(hfdi, hf, &ci)) + { + total = ci.cbCabinet; + files = ci.cFiles; + } + CabClose(hf); + } + + hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + char buf[MAX_PATH * 2], *name = 0; + if (!WideCharToMultiByte(CP_UTF8, 0, cab, -1, buf, _countof(buf), NULL, NULL)) + { + *buf = '\0'; + hr = E_INVALIDARG; + } + for (UINT i = 0; buf[i]; ++i) + { + if (buf[i] == '\\' || buf[i] == '/') + name = &buf[i + 1]; + } + if (name > buf && *name) + { + // Format the name the way FDI likes it + name[-1] = ANSI_NULL; + char namebuf[MAX_PATH]; + namebuf[0] = '\\'; + lstrcpyA(namebuf + 1, name); + name = namebuf; + + FDINOTIFICATION fdin; + fdin.cb = total; + fdin.hf = files; + noti.Path = cab; + noti.pfdin = &fdin; + callback(ECM_BEGIN, noti, cookie); + + hr = FDICopy(hfdi, name, buf, 0, ExtractCabinetCallback, NULL, &data) ? S_OK : HResultFrom(erf); + } + FDIDestroy(hfdi); + return hr; +} diff --git a/dll/shellext/cabview/folder.cpp b/dll/shellext/cabview/folder.cpp new file mode 100644 index 00000000000..c96e941392c --- /dev/null +++ b/dll/shellext/cabview/folder.cpp @@ -0,0 +1,857 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Shell folder implementation + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#include "cabview.h" +#include "util.h" + +enum FOLDERCOLUMNS +{ + COL_NAME, // PKEY_ItemNameDisplay + COL_SIZE, // PKEY_Size + COL_TYPE, // PKEY_ItemTypeText + COL_MDATE, // PKEY_DateModified + COL_PATH, // PKEY_?: Archive-relative path + COL_ATT, // PKEY_FileAttributes + COLCOUNT +}; + +static const struct FOLDERCOLUMN +{ + BYTE TextId; + BYTE LvcFmt; + BYTE LvcChars; + BYTE ColFlags; + const GUID *pkg; + BYTE pki; +} g_Columns[] = +{ + { IDS_COL_NAME, LVCFMT_LEFT, 20, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, &FMTID_Storage, PID_STG_NAME }, + { IDS_COL_SIZE, LVCFMT_RIGHT, 16, SHCOLSTATE_TYPE_INT | SHCOLSTATE_ONBYDEFAULT, &FMTID_Storage, PID_STG_SIZE }, + { IDS_COL_TYPE, LVCFMT_LEFT, 20, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, &FMTID_Storage, PID_STG_STORAGETYPE }, + { IDS_COL_MDATE, LVCFMT_LEFT, 20, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, &FMTID_Storage, PID_STG_WRITETIME }, + { IDS_COL_PATH, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, &CLSID_CabFolder, 0 }, + { IDS_COL_ATT, LVCFMT_RIGHT, 10, SHCOLSTATE_TYPE_STR, &FMTID_Storage, PID_STG_ATTRIBUTES }, +}; + +#include <pshpack1.h> +struct CABITEM +{ + WORD cb; + WORD Unknown; // Not sure what Windows uses this for, we always store 0 + UINT Size; + WORD Date, Time; // DOS + WORD Attrib; + WORD NameOffset; + WCHAR Path[ANYSIZE_ARRAY]; + +#if FLATFOLDER + inline bool IsFolder() const { return false; } +#else + inline BOOL IsFolder() const { return Attrib & FILE_ATTRIBUTE_DIRECTORY; } +#endif + enum { FSATTS = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | + FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY }; + WORD GetFSAttributes() const { return Attrib & FSATTS; } + LPCWSTR GetName() const { return Path + NameOffset; } + + template<class PIDL> static CABITEM* Validate(PIDL pidl) + { + CABITEM *p = (CABITEM*)pidl; + return p && p->cb > FIELD_OFFSET(CABITEM, Path[1]) && p->Unknown == 0 ? p : NULL; + } +}; +#include <poppack.h> + +static CABITEM* CreateItem(LPCWSTR Path, UINT Attrib, UINT Size, UINT DateTime) +{ + const SIZE_T len = lstrlenW(Path), cb = FIELD_OFFSET(CABITEM, Path[len + 1]); + if (cb > 0xffff) + return NULL; + CABITEM *p = (CABITEM*)SHAlloc(cb + sizeof(USHORT)); + if (p) + { + p->cb = (USHORT)cb; + p->Unknown = 0; + p->Size = Size; + p->Attrib = Attrib; + p->Date = HIWORD(DateTime); + p->Time = LOWORD(DateTime); + p->NameOffset = 0; + for (UINT i = 0;; ++i) + { + WCHAR c = Path[i]; + if (c == L':') // Don't allow absolute paths + c = L'_'; + if (c == L'/') // Normalize + c = L'\\'; + if (c == '\\') + p->NameOffset = i + 1; + p->Path[i] = c; + if (!c) + break; + } + ((SHITEMID*)((BYTE*)p + cb))->cb = 0; + } + return p; +} + +static CABITEM* CreateItem(LPCSTR Path, UINT Attrib, UINT Size = 0, UINT DateTime = 0) +{ + WCHAR buf[MAX_PATH * 2]; + UINT codepage = (Attrib & _A_NAME_IS_UTF) ? CP_UTF8 : CP_ACP; + if (MultiByteToWideChar(codepage, 0, Path, -1, buf, _countof(buf))) + return CreateItem(buf, Attrib, Size, DateTime); + return NULL; +} + +static HRESULT CALLBACK ItemMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, + UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + enum { IDC_EXTRACT, IDC_EXTRACTALL }; + HRESULT hr = E_NOTIMPL; + const BOOL Background = !pdtobj; + + switch (uMsg) + { + case DFM_MODIFYQCMFLAGS: + { + *((UINT*)lParam) = wParam | CMF_NOVERBS | (Background ? 0 : CMF_VERBSONLY); + return S_OK; + } + + case DFM_MERGECONTEXTMENU: + { + QCMINFO &qcmi = *(QCMINFO*)lParam; + UINT pos = qcmi.indexMenu, id = 0; + if (Background || SUCCEEDED(hr = InsertMenuItem(qcmi, pos, id, IDC_EXTRACT, IDS_EXTRACT, MFS_DEFAULT))) + { + hr = InsertMenuItem(qcmi, pos, id, IDC_EXTRACTALL, IDS_EXTRACTALL); + if (SUCCEEDED(hr) && !Background) + { + --pos; + InsertMenuItem(qcmi, pos, id, 0, -1); // Separator + } + } + if (SUCCEEDED(hr)) + { + qcmi.idCmdFirst = id + 1; + hr = S_FALSE; // Don't add verbs + } + break; + } + + case DFM_INVOKECOMMAND: + { + hr = S_FALSE; + CCabFolder *pCabFolder = static_cast<CCabFolder*>(psf); + switch (wParam) + { + case IDC_EXTRACT: + case IDC_EXTRACTALL: + hr = pCabFolder->ExtractFilesUI(hwnd, wParam == IDC_EXTRACT ? pdtobj : NULL); + break; + } + break; + } + } + return hr; +} + +static HRESULT CALLBACK FolderBackgroundMenuCallback(IShellFolder *psf, HWND hwnd, + IDataObject *pdtobj, UINT uMsg, + WPARAM wParam, LPARAM lParam) +{ + return ItemMenuCallback(psf, hwnd, NULL, uMsg, wParam, lParam); +} + +int CEnumIDList::FindNamedItem(PCUITEMID_CHILD pidl) const +{ + CABITEM *needle = (CABITEM*)pidl; + for (ULONG i = 0, c = GetCount(); i < c; ++i) + { + CABITEM *item = (CABITEM*)DPA_FastGetPtr(m_Items, i); + if (!lstrcmpiW(needle->Path, item->Path)) + return i; + } + return -1; +} + +struct FILLCALLBACKDATA +{ + CEnumIDList *pEIDL; + SHCONTF ContF; +}; + +static HRESULT CALLBACK EnumFillCallback(EXTRACTCALLBACKMSG msg, const EXTRACTCALLBACKDATA &ecd, LPVOID cookie) +{ + FILLCALLBACKDATA &data = *(FILLCALLBACKDATA*)cookie; + + switch ((UINT)msg) + { + case ECM_FILE: + { + const FDINOTIFICATION &fdin = *ecd.pfdin; + HRESULT hr = S_FALSE; + SFGAOF attr = MapFSToSFAttributes(fdin.attribs & CABITEM::FSATTS); + if (IncludeInEnumIDList(data.ContF, attr)) + { + UINT datetime = MAKELONG(fdin.time, fdin.date); + CABITEM *item = CreateItem(fdin.psz1, fdin.attribs, fdin.cb, datetime); + if (!item) + return E_OUTOFMEMORY; + if (FAILED(hr = data.pEIDL->Append((LPCITEMIDLIST)item))) + SHFree(item); + } + return SUCCEEDED(hr) ? S_FALSE : hr; // Never extract + } + } + return E_NOTIMPL; +} + +HRESULT CEnumIDList::Fill(LPCWSTR path, HWND hwnd, SHCONTF contf) +{ + FILLCALLBACKDATA data = { this, contf }; + return ExtractCabinet(path, NULL, EnumFillCallback, &data); +} + +HRESULT CEnumIDList::Fill(PCIDLIST_ABSOLUTE pidl, HWND hwnd, SHCONTF contf) +{ + WCHAR path[MAX_PATH]; + if (SHGetPathFromIDListW(pidl, path)) + return Fill(path, hwnd, contf); + return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); +} + +IFACEMETHODIMP CCabFolder::GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) +{ + if (pSort) + *pSort = COL_NAME; + if (pDisplay) + *pDisplay = COL_NAME; + return S_OK; +} + +IFACEMETHODIMP CCabFolder::GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags) +{ + if (!pcsFlags || iColumn >= _countof(g_Columns)) + return E_INVALIDARG; + *pcsFlags = g_Columns[iColumn].ColFlags; + return S_OK; +} + +IFACEMETHODIMP CCabFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET pName) +{ + CABITEM *item = CABITEM::Validate(pidl); + if (!item || !pName) + return E_INVALIDARG; + + if (dwFlags & SHGDN_FORPARSING) + { + if (dwFlags & SHGDN_INFOLDER) + return StrTo(FLATFOLDER ? item->Path : item->GetName(), *pName); + + WCHAR parent[MAX_PATH]; + if (!SHGetPathFromIDListW(m_CurDir, parent)) + return E_FAIL; + UINT cch = lstrlenW(parent) + 1 + lstrlenW(item->Path) + 1; + pName->uType = STRRET_WSTR; + pName->pOleStr = (LPWSTR)SHAlloc(cch * sizeof(WCHAR)); + if (!pName->pOleStr) + return E_OUTOFMEMORY; + lstrcpyW(pName->pOleStr, parent); + PathAppendW(pName->pOleStr, item->Path); + return S_OK; + } + + SHFILEINFO fi; + DWORD attr = item->IsFolder() ? FILE_ATTRIBUTE_DIRECTORY : 0; + UINT flags = SHGFI_DISPLAYNAME | SHGFI_USEFILEATTRIBUTES; + if (SHGetFileInfo(item->GetName(), attr, &fi, sizeof(fi), flags)) + return StrTo(fi.szDisplayName, *pName); + return StrTo(item->GetName(), *pName); +} + +HRESULT CCabFolder::GetItemDetails(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd, VARIANT *pv) +{ + HRESULT hr = E_FAIL; + STRRET *psr = &psd->str, srvar; + CABITEM *item = CABITEM::Validate(pidl); + if (!item) + return E_INVALIDARG; + + switch (iColumn) + { + case COL_NAME: + { + hr = GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, pv ? &srvar : psr); + return SUCCEEDED(hr) && pv ? StrRetToVariantBSTR(&srvar, *pv) : hr; + } + + case COL_SIZE: + { + UINT data = item->Size; + if (pv) + { + V_VT(pv) = VT_UI4; + V_UI4(pv) = data; + } + else + { + psr->uType = STRRET_CSTR; + StrFormatByteSizeA(data, psr->cStr, _countof(psr->cStr)); + } + return S_OK; + } + + case COL_TYPE: + { + SHFILEINFO fi; + LPCWSTR data = fi.szTypeName; + DWORD attr = item->GetFSAttributes(); + UINT flags = SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES; + if (SHGetFileInfo(item->GetName(), attr, &fi, sizeof(fi), flags)) + return pv ? StrTo(data, *pv) : StrTo(data, *psr); + break; + } + + case COL_MDATE: + { + if (pv) + { + if (DosDateTimeToVariantTime(item->Date, item->Time, &V_DATE(pv))) + { + V_VT(pv) = VT_DATE; + return S_OK; + } + } + else + { + FILETIME utc, loc; + if (DosDateTimeToFileTime(item->Date, item->Time, &utc) && FileTimeToLocalFileTime(&utc, &loc)) + { + psr->uType = STRRET_CSTR; + if (SHFormatDateTimeA(&loc, NULL, psr->cStr, _countof(psr->cStr))) + { + return S_OK; + } + } + } + break; + } + + case COL_PATH: + { + UINT len = item->NameOffset ? item->NameOffset - 1 : 0; + return pv ? StrTo(item->Path, len, *pv) : StrTo(item->Path, len, *psr); + } + + case COL_ATT: + { + UINT data = item->GetFSAttributes(); + if (pv) + { + V_VT(pv) = VT_UI4; + V_UI4(pv) = data; + } + else + { + UINT i = 0; + psr->uType = STRRET_CSTR; + if (data & FILE_ATTRIBUTE_READONLY) psr->cStr[i++] = 'R'; + if (data & FILE_ATTRIBUTE_HIDDEN) psr->cStr[i++] = 'H'; + if (data & FILE_ATTRIBUTE_SYSTEM) psr->cStr[i++] = 'S'; + if (data & FILE_ATTRIBUTE_ARCHIVE) psr->cStr[i++] = 'A'; + psr->cStr[i++] = '\0'; + } + return S_OK; + } + } + return hr; +} + +IFACEMETHODIMP CCabFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) +{ + if (!pscid || !pv) + return E_INVALIDARG; + + CABITEM *item; + int col = MapSCIDToColumn(*pscid); + if (col >= 0) + { + return GetItemDetails(pidl, col, NULL, pv); + } + else if ((item = CABITEM::Validate(pidl)) == NULL) + { + return E_INVALIDARG; + } + else if (IsEqual(*pscid, FMTID_ShellDetails, PID_FINDDATA)) + { + WIN32_FIND_DATA wfd; + ZeroMemory(&wfd, sizeof(wfd)); + wfd.dwFileAttributes = item->GetFSAttributes(); + wfd.nFileSizeLow = item->Size; + DosDateTimeToFileTime(item->Date, item->Time, &wfd.ftLastWriteTime); + lstrcpyn(wfd.cFileName, item->GetName(), MAX_PATH); + return InitVariantFromBuffer(&wfd, sizeof(wfd), pv); + } + return E_FAIL; +} + +IFACEMETHODIMP CCabFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) +{ + if (!psd || iColumn >= _countof(g_Columns)) + { + return E_INVALIDARG; + } + else if (!pidl) + { + psd->fmt = g_Columns[iColumn].LvcFmt; + psd->cxChar = g_Columns[iColumn].LvcChars; + WCHAR buf[MAX_PATH]; + if (LoadStringW(_AtlBaseModule.GetResourceInstance(), g_Columns[iColumn].TextId, buf, _countof(buf))) + return StrTo(buf, psd->str); + return E_FAIL; + } + return GetItemDetails(pidl, iColumn, psd, NULL); +} + +int CCabFolder::MapSCIDToColumn(const SHCOLUMNID &scid) +{ + for (UINT i = 0; i < _countof(g_Columns); ++i) + { + if (g_Columns[i].pkg && IsEqual(scid, *g_Columns[i].pkg, g_Columns[i].pki)) + return i; + } + return -1; +} + +IFACEMETHODIMP CCabFolder::MapColumnToSCID(UINT column, SHCOLUMNID *pscid) +{ + if (column < _countof(g_Columns) && g_Columns[column].pkg) + { + pscid->fmtid = *g_Columns[column].pkg; + pscid->pid = g_Columns[column].pki; + return S_OK; + } + return E_FAIL; +} + +IFACEMETHODIMP CCabFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) +{ + CEnumIDList *p = CEnumIDList::CreateInstance(); + *ppEnumIDList = static_cast<LPENUMIDLIST>(p); + return p ? p->Fill(m_CurDir, hwndOwner, dwFlags) : E_OUTOFMEMORY; +} + +IFACEMETHODIMP CCabFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT CCabFolder::CompareID(LPARAM lParam, PCUITEMID_CHILD pidl1, PCUITEMID_CHILD pidl2) +{ + CABITEM *p1 = (CABITEM*)pidl1, *p2 = (CABITEM*)pidl2; + HRESULT hr = S_OK; + int ret = 0; + + if (lParam & (SHCIDS_ALLFIELDS | SHCIDS_CANONICALONLY)) + { + ret = lstrcmpiW(p1->Path, p2->Path); + if (ret && (lParam & SHCIDS_ALLFIELDS)) + { + for (UINT i = 0; ret && SUCCEEDED(hr) && i < COLCOUNT; ++i) + { + hr = (i == COL_NAME) ? 0 : CompareID(i, pidl1, pidl2); + ret = (short)HRESULT_CODE(hr); + } + } + } + else + { + UINT col = lParam & SHCIDS_COLUMNMASK; + switch (col) + { + case COL_NAME: + ret = StrCmpLogicalW(p1->GetName(), p2->GetName()); + break; + + case COL_SIZE: + ret = p1->Size - p2->Size; + break; + + case COL_MDATE: + ret = MAKELONG(p1->Time, p1->Date) - MAKELONG(p2->Time, p2->Date); + break; + + default: + { + if (col < COLCOUNT) + { + PWSTR str1, str2; + if (SUCCEEDED(hr = ::GetDetailsOf(*this, pidl1, col, str1))) + { + if (SUCCEEDED(hr = ::GetDetailsOf(*this, pidl2, col, str2))) + { + ret = StrCmpLogicalW(str1, str2); + SHFree(str2); + } + SHFree(str1); + } + } + else + { + hr = E_INVALIDARG; + } + } + } + } + return SUCCEEDED(hr) ? MAKE_COMPARE_HRESULT(ret) : hr; +} + +IFACEMETHODIMP CCabFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) +{ + C_ASSERT(FLATFOLDER); + if (!pidl1 || !ILIsSingle(pidl1) || !pidl2 || !ILIsSingle(pidl2)) + return E_UNEXPECTED; + + return CompareID(lParam, pidl1, pidl2); +} + +IFACEMETHODIMP CCabFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppv) +{ + if (riid == IID_IShellView) + { + SFV_CREATE sfvc = { sizeof(SFV_CREATE), static_cast<IShellFolder*>(this) }; + return SHCreateShellFolderView(&sfvc, (IShellView**)ppv); + } + if (riid == IID_IContextMenu) + { + LPFNDFMCALLBACK func = FolderBackgroundMenuCallback; + IContextMenu **ppCM = (IContextMenu**)ppv; + return CDefFolderMenu_Create2(m_CurDir, hwndOwner, 0, NULL, this, func, 0, NULL, ppCM); + } + return E_NOINTERFACE; +} + +IFACEMETHODIMP CCabFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut) +{ + if (!cidl) + { + const SFGAOF ThisFolder = (SFGAO_FOLDER | SFGAO_BROWSABLE | SFGAO_CANLINK); + *rgfInOut = *rgfInOut & ThisFolder; + return S_OK; + } + else if (!apidl) + { + return E_INVALIDARG; + } + HRESULT hr = S_OK; + const SFGAOF filemask = SFGAO_READONLY | SFGAO_HIDDEN | SFGAO_SYSTEM | SFGAO_ISSLOW; + SFGAOF remain = *rgfInOut & filemask, validate = *rgfInOut & SFGAO_VALIDATE; + CComPtr<CEnumIDList> list; + for (UINT i = 0; i < cidl && (remain || validate); ++i) + { + CABITEM *item = CABITEM::Validate(apidl[i]); + if (!item) + { + hr = E_INVALIDARG; + break; + } + else if (validate) + { + if (!list && FAILED_UNEXPECTEDLY(hr = CreateEnum(&list))) + return hr; + if (list->FindNamedItem((PCUITEMID_CHILD)item) == -1) + return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + } + SFGAOF att = MapFSToSFAttributes(item->GetFSAttributes()) | SFGAO_ISSLOW; + remain &= att & ~(FLATFOLDER ? SFGAO_FOLDER : 0); + } + *rgfInOut = remain; + return hr; +} + +IFACEMETHODIMP CCabFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) +{ + HRESULT hr = E_NOINTERFACE; + if (riid == IID_IExtractIconA || riid == IID_IExtractIconW) + { + if (cidl != 1) + return E_INVALIDARG; + CABITEM *item = CABITEM::Validate(apidl[0]); + if (!item) + return E_INVALIDARG; + + DWORD attr = item->GetFSAttributes(); + return SHCreateFileExtractIconW(item->GetName(), attr, riid, ppvOut); + } + else if (riid == IID_IContextMenu && cidl) + { + LPFNDFMCALLBACK func = ItemMenuCallback; + IContextMenu **ppCM = (IContextMenu**)ppvOut; + return CDefFolderMenu_Create2(NULL, hwndOwner, cidl, apidl, this, func, 0, NULL, ppCM); + } + else if (riid == IID_IDataObject && cidl) + { + // Note: This IDataObject is only compatible with IContextMenu, it cannot handle drag&drop of virtual items! + return CIDLData_CreateFromIDArray(m_CurDir, cidl, apidl, (IDataObject**)ppvOut); + } + return hr; +} + +IFACEMETHODIMP CCabFolder::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case SFVM_WINDOWCREATED: + m_ShellViewWindow = (HWND)wParam; + return S_OK; + case SFVM_WINDOWCLOSING: + m_ShellViewWindow = NULL; + return S_OK; + } + return E_NOTIMPL; +} + +IFACEMETHODIMP CCabFolder::GetIconOf(PCUITEMID_CHILD pidl, UINT flags, int *pIconIndex) +{ + if (CABITEM *item = CABITEM::Validate(pidl)) + { + int index = MapPIDLToSystemImageListIndex(this, pidl, flags); + if (index == -1 && item->IsFolder()) + index = (flags & GIL_OPENICON) ? SIID_FOLDEROPEN : SIID_FOLDER; + if (index != -1) + { + *pIconIndex = index; + return S_OK; + } + } + return S_FALSE; +} + +static HRESULT GetFsPathFromIDList(PCIDLIST_ABSOLUTE pidl, PWSTR pszPath) +{ + BOOL ret = SHGetPathFromIDListW(pidl, pszPath); + if (!ret && ILIsEmpty(pidl)) + ret = SHGetSpecialFolderPathW(NULL, pszPath, CSIDL_DESKTOPDIRECTORY, TRUE); + return ret ? S_OK : HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); +} + +static int CALLBACK FolderBrowseCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) +{ + WCHAR buf[MAX_PATH]; + switch (uMsg) + { + case BFFM_INITIALIZED: + { + if (LoadStringW(_AtlBaseModule.GetResourceInstance(), IDS_EXTRACT, buf, _countof(buf))) + { + // Remove leading and trailing dots + WCHAR *s = buf, *e = s + lstrlenW(s); + while (*s == '.') ++s; + while (e > s && e[-1] == '.') *--e = UNICODE_NULL; + SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)s); + SendMessageW(GetDlgItem(hwnd, IDOK), WM_SETTEXT, 0, (LPARAM)s); + } + if (lpData) + { + SendMessageW(hwnd, BFFM_SETEXPANDED, FALSE, lpData); + SendMessageW(hwnd, BFFM_SETSELECTION, FALSE, lpData); + } + break; + } + + case BFFM_SELCHANGED: + { + SFGAOF wanted = SFGAO_FILESYSTEM | SFGAO_FOLDER, query = wanted | SFGAO_STREAM; + PCIDLIST_ABSOLUTE pidl = (PCIDLIST_ABSOLUTE)lParam; + BOOL enable = ILIsEmpty(pidl); // Allow the desktop + PCUITEMID_CHILD child; + IShellFolder *pSF; + if (SUCCEEDED(SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &pSF), &child))) + { + SFGAOF attrib = query; + if (SUCCEEDED(pSF->GetAttributesOf(1, &child, &attrib))) + enable = (attrib & query) == wanted; + pSF->Release(); + } + if (enable) + { + // We don't trust .zip folders, check the file-system to make sure + UINT attrib = SUCCEEDED(GetFsPathFromIDList(pidl, buf)) ? GetFileAttributesW(buf) : 0; + enable = (attrib & FILE_ATTRIBUTE_DIRECTORY) && attrib != INVALID_FILE_ATTRIBUTES; + } + PostMessageW(hwnd, BFFM_ENABLEOK, 0, enable); + break; + } + } + return 0; +} + +struct EXTRACTFILESDATA +{ + CCabFolder *pLifetimeCF; + HWND hWndOwner; + CIDA *pCIDA; + STGMEDIUM cidamedium; + IDataObject *pDO; + IStream *pMarshalDO; + IProgressDialog *pPD; + UINT cabfiles, completed; + WCHAR path[MAX_PATH], cab[MAX_PATH]; +}; + +static HWND GetUiOwner(const EXTRACTFILESDATA &data) +{ + HWND hWnd; + if (SUCCEEDED(IUnknown_GetWindow(data.pPD, &hWnd)) && IsWindowVisible(hWnd)) + return hWnd; + return IsWindowVisible(data.hWndOwner) ? data.hWndOwner : NULL; +} + +static HRESULT CALLBACK ExtractFilesCallback(EXTRACTCALLBACKMSG msg, const EXTRACTCALLBACKDATA &ecd, LPVOID cookie) +{ + EXTRACTFILESDATA &data = *(EXTRACTFILESDATA*)cookie; + switch ((UINT)msg) + { + case ECM_BEGIN: + { + data.cabfiles = (UINT)(SIZE_T)ecd.pfdin->hf; + return S_OK; + } + + case ECM_FILE: + { + if (data.pPD && data.pPD->HasUserCancelled()) + return HRESULT_FROM_WIN32(ERROR_CANCELLED); + HRESULT hr = data.pCIDA ? S_FALSE : S_OK; // Filtering or all items? + if (hr != S_OK) + { + CABITEM *needle = CreateItem(ecd.pfdin->psz1, ecd.pfdin->attribs); + if (!needle) + return E_OUTOFMEMORY; + for (UINT i = 0; i < data.pCIDA->cidl && hr == S_FALSE; ++i) + { + C_ASSERT(FLATFOLDER); + LPCITEMIDLIST pidlChild = ILFindLastID(HIDA_GetPIDLItem(data.pCIDA, i)); + CABITEM *haystack = CABITEM::Validate(pidlChild); + if (!haystack && FAILED_UNEXPECTEDLY(hr = E_FAIL)) + break; + if (!lstrcmpiW(needle->Path, haystack->Path)) + { + if (data.pPD) + data.pPD->SetLine(1, needle->Path, TRUE, NULL); + hr = S_OK; // Found it in the list of files to extract + } + } + SHFree(needle); + } + if (data.pPD) + data.pPD->SetProgress(data.completed++, data.cabfiles); + return hr; + } + + case ECM_PREPAREPATH: + { + UINT flags = SHPPFW_DIRCREATE | SHPPFW_IGNOREFILENAME; + return SHPathPrepareForWriteW(GetUiOwner(data), NULL, ecd.Path, flags); + } + + case ECM_ERROR: + { + return ErrorBox(GetUiOwner(data), ecd.hr); + } + } + return E_NOTIMPL; +} + +static void Free(EXTRACTFILESDATA &data) +{ + if (data.pPD) + { + data.pPD->StopProgressDialog(); + data.pPD->Release(); + } + CDataObjectHIDA::DestroyCIDA(data.pCIDA, data.cidamedium); + IUnknown_Set((IUnknown**)&data.pDO, NULL); + IUnknown_Set((IUnknown**)&data.pMarshalDO, NULL); + IUnknown_Set((IUnknown**)&data.pLifetimeCF, NULL); + SHFree(&data); +} + +static DWORD CALLBACK ExtractFilesThread(LPVOID pParam) +{ + EXTRACTFILESDATA &data = *(EXTRACTFILESDATA*)pParam; + HRESULT hr = S_OK; + if (SUCCEEDED(SHCoCreateInstance(NULL, &CLSID_ProgressDialog, NULL, IID_PPV_ARG(IProgressDialog, &data.pPD)))) + { + // TODO: IActionProgress SPACTION_COPYING + if (SUCCEEDED(data.pPD->StartProgressDialog(data.hWndOwner, NULL, PROGDLG_NOTIME, NULL))) + { + data.pPD->SetTitle(data.cab); + data.pPD->SetLine(2, data.path, TRUE, NULL); + data.pPD->SetAnimation(GetModuleHandleW(L"SHELL32"), 161); + data.pPD->SetProgress(0, 0); + } + } + if (data.pMarshalDO) + { + hr = CoGetInterfaceAndReleaseStream(data.pMarshalDO, IID_PPV_ARG(IDataObject, &data.pDO)); + data.pMarshalDO = NULL; + if (SUCCEEDED(hr)) + hr = CDataObjectHIDA::CreateCIDA(data.pDO, &data.pCIDA, data.cidamedium); + } + if (SUCCEEDED(hr)) + { + ExtractCabinet(data.cab, data.path, ExtractFilesCallback, &data); + } + Free(data); + return 0; +} + +HRESULT CCabFolder::ExtractFilesUI(HWND hWnd, IDataObject *pDO) +{ + if (!IsWindowVisible(hWnd) && IsWindowVisible(m_ShellViewWindow)) + hWnd = m_ShellViewWindow; + + EXTRACTFILESDATA *pData = (EXTRACTFILESDATA*)SHAlloc(sizeof(*pData)); + if (!pData) + return E_OUTOFMEMORY; + ZeroMemory(pData, sizeof(*pData)); + pData->hWndOwner = hWnd; + pData->pLifetimeCF = this; + pData->pLifetimeCF->AddRef(); + + HRESULT hr = GetFsPathFromIDList(m_CurDir, pData->cab); + if (SUCCEEDED(hr) && pDO) + { + hr = CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDO, &pData->pMarshalDO); + } + if (SUCCEEDED(hr)) + { + hr = HRESULT_FROM_WIN32(ERROR_CANCELLED); + LPITEMIDLIST pidlInitial = ILClone(m_CurDir); + ILRemoveLastID(pidlInitial); // Remove the "name.cab" part (we can't extract into ourselves) + UINT bif = BIF_RETURNONLYFSDIRS | BIF_USENEWUI; + BROWSEINFO bi = { hWnd, NULL, NULL, pData->cab, bif, FolderBrowseCallback, (LPARAM)pidlInitial }; + if (PIDLIST_ABSOLUTE folder = SHBrowseForFolderW(&bi)) + { + hr = GetFsPathFromIDList(folder, pData->path); + ILFree(folder); + if (SUCCEEDED(hr)) + { + UINT ctf = CTF_COINIT | CTF_PROCESS_REF | CTF_THREAD_REF | CTF_FREELIBANDEXIT; + hr = SHCreateThread(ExtractFilesThread, pData, ctf, NULL) ? S_OK : E_OUTOFMEMORY; + } + } + ILFree(pidlInitial); + } + if (hr != S_OK) + Free(*pData); + return hr == HRESULT_FROM_WIN32(ERROR_CANCELLED) ? S_OK : hr; +} diff --git a/dll/shellext/cabview/lang/de-DE.rc b/dll/shellext/cabview/lang/de-DE.rc new file mode 100644 index 00000000000..3951491271b --- /dev/null +++ b/dll/shellext/cabview/lang/de-DE.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: German (Germany) resource file + * TRANSLATOR: Copyright 2018 Robert Naumann <gonzomdx(a)gmail.com> + */ + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_COL_NAME "Name" + IDS_COL_TYPE "Dateityp" + IDS_COL_SIZE "Größe" + IDS_COL_MDATE "Änderungsdatum" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/en-US.rc b/dll/shellext/cabview/lang/en-US.rc new file mode 100644 index 00000000000..4205c4912dc --- /dev/null +++ b/dll/shellext/cabview/lang/en-US.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: English (United States) resource file + * TRANSLATOR: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE +BEGIN + IDS_COL_NAME "Name" + IDS_COL_SIZE "Size" + IDS_COL_TYPE "Type" + IDS_COL_MDATE "Date modified" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/et-EE.rc b/dll/shellext/cabview/lang/et-EE.rc new file mode 100644 index 00000000000..bd1cd3029d9 --- /dev/null +++ b/dll/shellext/cabview/lang/et-EE.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Estonian resource file + * TRANSLATOR: Copyright 2018 Joann Mõndresku <joann.mondresku(a)gmail.com> + */ + +LANGUAGE LANG_ESTONIAN, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_COL_NAME "Nimi" + IDS_COL_TYPE "Tüüp" + IDS_COL_SIZE "Suurus" + IDS_COL_MDATE "Kuupäeval muudetud" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/fr-FR.rc b/dll/shellext/cabview/lang/fr-FR.rc new file mode 100644 index 00000000000..5c848d20827 --- /dev/null +++ b/dll/shellext/cabview/lang/fr-FR.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: French (France) resource file + * TRANSLATOR: Copyright 2018 Pierre Schweitzer <pierre(a)reactos.org> + */ + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_COL_NAME "Nom" + IDS_COL_TYPE "Type" + IDS_COL_SIZE "Taille" + IDS_COL_MDATE "Date de modification" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/hi-IN.rc b/dll/shellext/cabview/lang/hi-IN.rc new file mode 100644 index 00000000000..943076df123 --- /dev/null +++ b/dll/shellext/cabview/lang/hi-IN.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Hindi (India) resource file + * TRANSLATOR: Copyright 2019 Arnav Bhatt <arnavbhatt2004(a)gmail.com> +*/ + +LANGUAGE LANG_HINDI, SUBLANG_HINDI_INDIA + +STRINGTABLE +BEGIN + IDS_COL_NAME "नाम" + IDS_COL_TYPE "प्रकार" + IDS_COL_SIZE "साइज़" + IDS_COL_MDATE "तिथि संशोधित" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/it-IT.rc b/dll/shellext/cabview/lang/it-IT.rc new file mode 100644 index 00000000000..912949f98df --- /dev/null +++ b/dll/shellext/cabview/lang/it-IT.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Italian resource file + * TRANSLATOR: Copyright 2018 George Bișoc <george.bisoc(a)reactos.org> + */ + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_COL_NAME "Nome" + IDS_COL_TYPE "Tipo" + IDS_COL_SIZE "Dimensione" + IDS_COL_MDATE "Data modificata" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/ja-JP.rc b/dll/shellext/cabview/lang/ja-JP.rc new file mode 100644 index 00000000000..fcc6dc8d90e --- /dev/null +++ b/dll/shellext/cabview/lang/ja-JP.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Japanese resource file + * TRANSLATOR: Copyright 2018 Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com> + */ + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_COL_NAME "名前" + IDS_COL_TYPE "種類" + IDS_COL_SIZE "サイズ" + IDS_COL_MDATE "変更日" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/pl-PL.rc b/dll/shellext/cabview/lang/pl-PL.rc new file mode 100644 index 00000000000..0d6fb1ba41a --- /dev/null +++ b/dll/shellext/cabview/lang/pl-PL.rc @@ -0,0 +1,22 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Polish resource file + * TRANSLATORS: Copyright 2018-2019 Adam Słaboń <asaillen456esx(a)gmail.com> + * Copyright 2020 Piotr Hetnarowicz <piotrhwz(a)gmail.com> + */ + +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_COL_NAME "Nazwa" + IDS_COL_TYPE "Typ" + IDS_COL_SIZE "Rozmiar oryginalny" + IDS_COL_MDATE "Data modyfikacji" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/pt-PT.rc b/dll/shellext/cabview/lang/pt-PT.rc new file mode 100644 index 00000000000..9671f14a3bf --- /dev/null +++ b/dll/shellext/cabview/lang/pt-PT.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Portuguese (Portugal) resource file + * TRANSLATOR: Copyright 2020 Jose Carlos Jesus <zecarlos1957(a)hotmail.com> + */ + +LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_COL_NAME "Nome" + IDS_COL_TYPE "Tipo" + IDS_COL_SIZE "Tamanho" + IDS_COL_MDATE "Data da modificação" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/ro-RO.rc b/dll/shellext/cabview/lang/ro-RO.rc new file mode 100644 index 00000000000..9e9c0684fd3 --- /dev/null +++ b/dll/shellext/cabview/lang/ro-RO.rc @@ -0,0 +1,22 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Romanian resource file + * TRANSLATORS: Copyright 2018 George Bișoc <george.bisoc(a)reactos.org> + * Copyright 2022-2024 Andrei Miloiu <miloiuandrei(a)gmail.com> + */ + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_COL_NAME "Nume" + IDS_COL_TYPE "Tip" + IDS_COL_SIZE "Dimensiune" + IDS_COL_MDATE "Data modificată" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/ru-RU.rc b/dll/shellext/cabview/lang/ru-RU.rc new file mode 100644 index 00000000000..e377821fcb3 --- /dev/null +++ b/dll/shellext/cabview/lang/ru-RU.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Russian resource translation + * TRANSLATOR: Copyright 2018-2020 Stanislav Motylkov <x86corez(a)gmail.com> + */ + +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_COL_NAME "Название" + IDS_COL_TYPE "Тип" + IDS_COL_SIZE "Размер" + IDS_COL_MDATE "Дата изменения" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/sv-SE.rc b/dll/shellext/cabview/lang/sv-SE.rc new file mode 100644 index 00000000000..f65e8352d64 --- /dev/null +++ b/dll/shellext/cabview/lang/sv-SE.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Swedish resource file + * TRANSLATOR: Copyright 2018 Andreas Bjerkeholt <andreas.bjerkeholt(a)reactos.org> + */ + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_COL_NAME "Namn" + IDS_COL_TYPE "Typ" + IDS_COL_SIZE "Storlek" + IDS_COL_MDATE "Ändrad den" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extrahera..." + IDS_EXTRACTALL "Extrahera &alla..." +END diff --git a/dll/shellext/cabview/lang/tr-TR.rc b/dll/shellext/cabview/lang/tr-TR.rc new file mode 100644 index 00000000000..e0d5a7a81bf --- /dev/null +++ b/dll/shellext/cabview/lang/tr-TR.rc @@ -0,0 +1,21 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Turkish resource file + * TRANSLATOR: Copyright 2021 Süleyman Poyraz <zaryob.dev(a)gmail.com> + */ + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_COL_NAME "İsim" + IDS_COL_TYPE "Tür" + IDS_COL_SIZE "Boyut" + IDS_COL_MDATE "Değiştirilme Tarihi" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/zh-CN.rc b/dll/shellext/cabview/lang/zh-CN.rc new file mode 100644 index 00000000000..3437d81d1b3 --- /dev/null +++ b/dll/shellext/cabview/lang/zh-CN.rc @@ -0,0 +1,22 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Chinese (Simplified) resource file + * TRANSLATORS: Copyright 2018 Li Keqing <auroracloud4096(a)gmail.com> + * Copyright 2021 Wu Haotian <rigoligo03(a)gmail.com> + */ + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE +BEGIN + IDS_COL_NAME "名称" + IDS_COL_TYPE "类型" + IDS_COL_SIZE "大小" + IDS_COL_MDATE "修改日期" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/zh-HK.rc b/dll/shellext/cabview/lang/zh-HK.rc new file mode 100644 index 00000000000..a5969223b8d --- /dev/null +++ b/dll/shellext/cabview/lang/zh-HK.rc @@ -0,0 +1,22 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Chinese (Hong Kong) resources file + * TRANSLATOR: Copyright 2021 Chan Chilung <eason066(a)gmail.com> + * REFERENCES: Chinese (Simplified) resource file + */ + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_HONGKONG + +STRINGTABLE +BEGIN + IDS_COL_NAME "名稱" + IDS_COL_TYPE "類型" + IDS_COL_SIZE "大小" + IDS_COL_MDATE "修改日期" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/lang/zh-TW.rc b/dll/shellext/cabview/lang/zh-TW.rc new file mode 100644 index 00000000000..bbe5accd92f --- /dev/null +++ b/dll/shellext/cabview/lang/zh-TW.rc @@ -0,0 +1,23 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Chinese (Traditional) resource file + * TRANSLATOR: Copyright 2020-2021 Chan Chilung <eason066(a)gmail.com> + * REFERENCES: Chinese (Simplified) resource translation + * Copyright 2018 Li Keqing <auroracloud4096(a)gmail.com> + */ + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE +BEGIN + IDS_COL_NAME "名稱" + IDS_COL_TYPE "類型" + IDS_COL_SIZE "大小" + IDS_COL_MDATE "修改日期" + IDS_COL_PATH "Path" + IDS_COL_ATT "Attributes" + + IDS_EXTRACT "Extract..." + IDS_EXTRACTALL "Extract &All..." +END diff --git a/dll/shellext/cabview/precomp.h b/dll/shellext/cabview/precomp.h new file mode 100644 index 00000000000..d69f972a2e6 --- /dev/null +++ b/dll/shellext/cabview/precomp.h @@ -0,0 +1,34 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Precompiled header file + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#pragma once +#define NTOS_MODE_USER +#include <windows.h> +#include <atlbase.h> +#include <atlcom.h> +#include <strsafe.h> +#include <shlobj.h> +#include <shobjidl.h> +#include <shlwapi.h> +#include <shellapi.h> +#include <shlguid_undoc.h> +#define NTSTATUS LONG // for debug.h +#include <reactos/debug.h> +#include <shellutils.h> +#include <ntquery.h> +#include <fdi.h> + +#ifndef SFGAO_SYSTEM +#define SFGAO_SYSTEM 0x00001000 +#endif + +#ifndef SHGSI_ICONLOCATION +#define SIID_FOLDER 3 +#define SIID_FOLDEROPEN 4 +#endif + +EXTERN_C INT WINAPI SHFormatDateTimeA(const FILETIME UNALIGNED *fileTime, DWORD *flags, LPSTR buf, UINT size); diff --git a/dll/shellext/cabview/res/cabview.rgs b/dll/shellext/cabview/res/cabview.rgs new file mode 100644 index 00000000000..f9316200962 --- /dev/null +++ b/dll/shellext/cabview/res/cabview.rgs @@ -0,0 +1,47 @@ +HKCR +{ + NoRemove CLSID + { + '{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}' = s 'Cabinet Shell Folder' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + ShellFolder + { + val Attributes = d '0x680001a0' + } + 'Implemented Categories' + { + '{00021490-0000-0000-C000-000000000046}' + { + } + } + } + } + + NoRemove CABFolder + { + CLSID = s '{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}' + DefaultIcon = s '%MODULE%' + + NoRemove Shell + { + NoRemove Open + { + val BrowserFlags = d '0x10' + val ExplorerFlags = d '0x20' + command = s '"explorer.exe" "%%L"' + } + } + } + NoRemove '.cab' = s 'CABFolder' + { + } + + NoRemove SystemFileAssociations + { + '.cab' + { + CLSID = s '{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}' + } + } +} diff --git a/dll/shellext/cabview/res/folder.ico b/dll/shellext/cabview/res/folder.ico new file mode 100644 index 00000000000..04f98dcb2fd Binary files /dev/null and b/dll/shellext/cabview/res/folder.ico differ diff --git a/dll/shellext/cabview/resource.h b/dll/shellext/cabview/resource.h new file mode 100644 index 00000000000..b964a8c2c10 --- /dev/null +++ b/dll/shellext/cabview/resource.h @@ -0,0 +1,25 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Resource header file + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#pragma once + +/* Icons */ +#define IDI_FOLDER 1 + +/* Registry */ +#define IDR_FOLDER 8000 + +/* Strings */ +#define IDS_COL_NAME 1 +#define IDS_COL_SIZE 2 +#define IDS_COL_TYPE 3 +#define IDS_COL_MDATE 4 +#define IDS_COL_PATH 5 +#define IDS_COL_ATT 6 + +#define IDS_EXTRACT 72 +#define IDS_EXTRACTALL 82 diff --git a/dll/shellext/cabview/util.h b/dll/shellext/cabview/util.h new file mode 100644 index 00000000000..5f3d5e38196 --- /dev/null +++ b/dll/shellext/cabview/util.h @@ -0,0 +1,156 @@ +/* + * PROJECT: ReactOS CabView Shell Extension + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: Utility header file + * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks(a)proton.me> + */ + +#pragma once + +template<class H> static int ErrorBox(H hWnd, int Error) +{ + SHELL_ErrorBox(hWnd, Error); + return Error; +} + +template<class T> static inline bool IsPathSep(T c) +{ + return c == '\\' || c == '/'; +} + +inline bool IsEqual(const SHCOLUMNID &scid, REFGUID guid, UINT pid) +{ + return scid.pid == pid && IsEqualGUID(scid.fmtid, guid); +} + +inline HRESULT InitVariantFromBuffer(const void *buffer, UINT cb, VARIANT *pv) +{ + SAFEARRAY *pa = SafeArrayCreateVector(VT_UI1, 0, cb); + if (pa) + { + CopyMemory(pa->pvData, buffer, cb); + V_VT(pv) = VT_UI1 | VT_ARRAY; + V_UNION(pv, parray) = pa; + return S_OK; + } + V_VT(pv) = VT_EMPTY; + return E_OUTOFMEMORY; +} + +inline void FreeStrRet(STRRET &str) +{ + if (str.uType == STRRET_WSTR) + { + SHFree(str.pOleStr); + str.uType = STRRET_CSTR; + } +} + +inline HRESULT StrTo(LPCWSTR str, UINT len, STRRET &sr) +{ + LPWSTR data = (LPWSTR)SHAlloc(++len * sizeof(WCHAR)); + if (!data) + return E_OUTOFMEMORY; + lstrcpynW(data, str, len); + sr.uType = STRRET_WSTR; + sr.pOleStr = data; + return S_OK; +} + +inline HRESULT StrTo(LPCWSTR str, STRRET &sr) +{ + return StrTo(str, lstrlenW(str), sr); +} + +inline HRESULT StrTo(LPCWSTR str, UINT len, VARIANT &v) +{ + BSTR data = SysAllocStringLen(str, len); + if (!data) + return E_OUTOFMEMORY; + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = data; + return S_OK; +} + +inline HRESULT StrTo(LPCWSTR str, VARIANT &v) +{ + return StrTo(str, lstrlenW(str), v); +} + +inline HRESULT StrRetToVariantBSTR(STRRET *psr, VARIANT &v) +{ + HRESULT hr = StrRetToBSTR(psr, NULL, &V_BSTR(&v)); + if (SUCCEEDED(hr)) + V_VT(&v) = VT_BSTR; + return hr; +} + +inline HRESULT GetDetailsOf(IShellFolder2 &Folder, PCUITEMID_CHILD pidl, UINT Column, PWSTR &String) +{ + SHELLDETAILS details; + HRESULT hr = Folder.GetDetailsOf(pidl, Column, &details); + if (SUCCEEDED(hr)) + hr = StrRetToStrW(&details.str, pidl, &String); + return hr; +} + +inline HRESULT InsertMenuItem(QCMINFO &qcmi, UINT &Pos, UINT &TrackId, UINT Id, UINT ResId, int State = 0) +{ + UINT flags = 0; + WCHAR string[MAX_PATH]; + string[0] = UNICODE_NULL; + if ((Id += qcmi.idCmdFirst) > qcmi.idCmdLast) + return E_FAIL; + else if (ResId == (UINT)-1) + flags |= MF_SEPARATOR; + else if (!LoadStringW(_AtlBaseModule.GetResourceInstance(), ResId, string, _countof(string))) + return E_FAIL; + + MENUITEMINFOW mii; + mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); // USER32 version agnostic + mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING | MIIM_STATE; + mii.fType = flags; + mii.wID = Id; + mii.dwTypeData = string; + mii.cch = 0; + mii.fState = State; + if (!InsertMenuItemW(qcmi.hmenu, Pos, TRUE, &mii)) + return E_FAIL; + Pos++; + TrackId = max(TrackId, Id); + return S_OK; +} + +inline SFGAOF MapFSToSFAttributes(UINT att) +{ + return ((att & FILE_ATTRIBUTE_READONLY) ? SFGAO_READONLY : 0) | + ((att & FILE_ATTRIBUTE_HIDDEN) ? SFGAO_HIDDEN : 0) | + ((att & FILE_ATTRIBUTE_SYSTEM) ? SFGAO_SYSTEM : 0); +} + +inline bool IncludeInEnumIDList(SHCONTF contf, SFGAOF att) +{ + const SHCONTF both = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS; + const SFGAOF superbits = SFGAO_HIDDEN | SFGAO_READONLY | SFGAO_SYSTEM; + const bool isfile = (att & (SFGAO_STREAM | SFGAO_FOLDER)) != SFGAO_FOLDER; + if ((contf & both) != both && !(contf & SHCONTF_STORAGE)) + { + if (isfile && (contf & SHCONTF_FOLDERS)) + return false; + if ((att & SFGAO_FOLDER) && (contf & SHCONTF_NONFOLDERS)) + return false; + } + if ((att & SFGAO_HIDDEN) && !(contf & (SHCONTF_INCLUDEHIDDEN | SHCONTF_STORAGE))) + return false; + if ((att & superbits) > SFGAO_HIDDEN && !(contf & (SHCONTF_INCLUDESUPERHIDDEN | SHCONTF_STORAGE))) + return false; + return true; +} + +inline int MapPIDLToSystemImageListIndex(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT GilFlags = 0) +{ + int normal, open; + BOOL qopen = GilFlags & GIL_OPENICON; + normal = SHMapPIDLToSystemImageListIndex(pSF, pidl, qopen ? &open : NULL); + return qopen && open != -1 ? open : normal; +} diff --git a/dll/win32/browseui/CProgressDialog.cpp b/dll/win32/browseui/CProgressDialog.cpp index 6d32d01ecb2..4f748b12057 100644 --- a/dll/win32/browseui/CProgressDialog.cpp +++ b/dll/win32/browseui/CProgressDialog.cpp @@ -44,6 +44,7 @@ CProgressDialog::CProgressDialog() { + this->hwnd = NULL; this->lines[0] = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, BUFFER_SIZE); this->lines[1] = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, BUFFER_SIZE); this->lines[2] = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, BUFFER_SIZE); diff --git a/media/inf/syssetup.inf b/media/inf/syssetup.inf index 14700f060e1..1ef4a04bc3d 100644 --- a/media/inf/syssetup.inf +++ b/media/inf/syssetup.inf @@ -52,6 +52,7 @@ AddReg=Classes 11,,amstream.dll,1 11,,avifil32.dll,1 11,,browseui.dll,1 +11,,cabview.dll,1 11,,comcat.dll,1 11,,cryptdlg.dll,1 11,,cryptnet.dll,1
6 months, 4 weeks
1
0
0
0
[reactos] 01/01: [CRT] corecrt.h: add secure function overload macros
by Timo Kreuzer
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3bd9ddca94bda829b3977…
commit 3bd9ddca94bda829b3977918a1be0a92a8a610f6 Author: Timo Kreuzer <timo.kreuzer(a)reactos.org> AuthorDate: Tue Nov 12 12:47:51 2024 +0200 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Wed Dec 4 08:13:49 2024 +0200 [CRT] corecrt.h: add secure function overload macros Taken from MIT release of UCRT (
https://www.nuget.org/packages/Microsoft.Windows.SDK.CRTSource/10.0.22621.3
). These are used by newer mingw headers, which we include when compiling C++ code. Fixes build with GCC 13 based RosBE. --- sdk/include/crt/corecrt.h | 169 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) diff --git a/sdk/include/crt/corecrt.h b/sdk/include/crt/corecrt.h index 4bae8184255..d50f160aa98 100644 --- a/sdk/include/crt/corecrt.h +++ b/sdk/include/crt/corecrt.h @@ -1,3 +1,9 @@ +/* + * PROJECT: ReactOS CRT headers + * LICENSE: MIT (
https://spdx.org/licenses/MIT
) + * PURPOSE: Declarations used throughout the CoreCRT library. + * COPYRIGHT: Copyright (c) Microsoft Corporation. All rights reserved. + */ #pragma once @@ -20,6 +26,169 @@ typedef struct localeinfo_struct #define DEFINED_localeinfo_struct 1 #endif +#ifndef RC_INVOKED + #if defined __cplusplus && _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_0(_ReturnType, _FuncName, _DstType, _Dst) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size]) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_Dst, _Size); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size], _TType1 _TArg1) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_Dst, _Size, _TArg1); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_2(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size], _TType1 _TArg1, _TType2 _TArg2) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_Dst, _Size, _TArg1, _TArg2); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_3(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size], _TType1 _TArg1, _TType2 _TArg2, _TType3 _TArg3) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_Dst, _Size, _TArg1, _TArg2, _TArg3); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_4(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3, _TType4, _TArg4) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size], _TType1 _TArg1, _TType2 _TArg2, _TType3 _TArg3, _TType4 _TArg4) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_Dst, _Size, _TArg1, _TArg2, _TArg3, _TArg4); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_1(_ReturnType, _FuncName, _HType1, _HArg1, _DstType, _Dst, _TType1, _TArg1) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_HType1 _HArg1, _DstType (&_Dst)[_Size], _TType1 _TArg1) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_HArg1, _Dst, _Size, _TArg1); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_2(_ReturnType, _FuncName, _HType1, _HArg1, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_HType1 _HArg1, _DstType (&_Dst)[_Size], _TType1 _TArg1, _TType2 _TArg2) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_HArg1, _Dst, _Size, _TArg1, _TArg2); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_3(_ReturnType, _FuncName, _HType1, _HArg1, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_HType1 _HArg1, _DstType (&_Dst)[_Size], _TType1 _TArg1, _TType2 _TArg2, _TType3 _TArg3) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_HArg1, _Dst, _Size, _TArg1, _TArg2, _TArg3); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_2_0(_ReturnType, _FuncName, _HType1, _HArg1, _HType2, _HArg2, _DstType, _Dst) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_HType1 _HArg1, _HType2 _HArg2, _DstType (&_Dst)[_Size]) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_HArg1, _HArg2, _Dst, _Size); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1_ARGLIST(_ReturnType, _FuncName, _VFuncName, _DstType, _Dst, _TType1, _TArg1) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size], _TType1 _TArg1, ...) _CRT_SECURE_CPP_NOTHROW \ + { \ + va_list _ArgList; \ + __crt_va_start(_ArgList, _TArg1); \ + return _VFuncName(_Dst, _Size, _TArg1, _ArgList); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_2_ARGLIST(_ReturnType, _FuncName, _VFuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2) \ + extern "C++" \ + { \ + template <size_t _Size> \ + inline \ + _ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size], _TType1 _TArg1, _TType2 _TArg2, ...) _CRT_SECURE_CPP_NOTHROW \ + { \ + va_list _ArgList; \ + __crt_va_start(_ArgList, _TArg2); \ + return _VFuncName(_Dst, _Size, _TArg1, _TArg2, _ArgList); \ + } \ + } + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_SPLITPATH(_ReturnType, _FuncName, _DstType, _Src) \ + extern "C++" \ + { \ + template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> \ + inline \ + _ReturnType __CRTDECL _FuncName( \ + _In_z_ _DstType const* _Src, \ + _Post_z_ _DstType (&_Drive)[_DriveSize], \ + _Post_z_ _DstType (&_Dir)[_DirSize], \ + _Post_z_ _DstType (&_Name)[_NameSize], \ + _Post_z_ _DstType (&_Ext)[_ExtSize] \ + ) _CRT_SECURE_CPP_NOTHROW \ + { \ + return _FuncName(_Src, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); \ + } \ + } + + #else // ^^^ _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES ^^^ // vvv !_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES vvv // + + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_0(_ReturnType, _FuncName, _DstType, _Dst) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_2(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_3(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_4(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3, _TType4, _TArg4) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_1(_ReturnType, _FuncName, _HType1, _HArg1, _DstType, _Dst, _TType1, _TArg1) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_2(_ReturnType, _FuncName, _HType1, _HArg1, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_3(_ReturnType, _FuncName, _HType1, _HArg1, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2, _TType3, _TArg3) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_2_0(_ReturnType, _FuncName, _HType1, _HArg1, _HType2, _HArg2, _DstType, _Dst) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1_ARGLIST(_ReturnType, _FuncName, _VFuncName, _DstType, _Dst, _TType1, _TArg1) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_2_ARGLIST(_ReturnType, _FuncName, _VFuncName, _DstType, _Dst, _TType1, _TArg1, _TType2, _TArg2) + #define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_SPLITPATH(_ReturnType, _FuncName, _DstType, _Src) + + #endif // !_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES +#endif + #ifdef __cplusplus } // extern "C" #endif
6 months, 4 weeks
1
0
0
0
← Newer
1
...
6
7
8
9
10
11
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
Results per page:
10
25
50
100
200