Skip to content

Commit 0b5e11c

Browse files
committed
Add GetLastErrorCode() to expose errno-based failures
1 parent 98ec4d9 commit 0b5e11c

File tree

7 files changed

+51
-7
lines changed

7 files changed

+51
-7
lines changed

src/WinIMerge/WinIMerge.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@ void UpdateWindowTitle(HWND hWnd)
154154
SetWindowTextW(hWnd, title);
155155
}
156156

157+
void ShowErrorMessageBox(HWND hWnd, const std::string& msg)
158+
{
159+
std::error_code ec(m_pImgMergeWindow->GetLastErrorCode(), std::generic_category());
160+
std::string msg2 = msg + ": " + ec.message();
161+
MessageBoxA(hWnd, msg2.c_str(), NULL, MB_OK | MB_ICONERROR);
162+
}
163+
157164
bool NewImages(HWND hWnd, int nImages)
158165
{
159166
bool bSucceeded;
@@ -173,6 +180,8 @@ bool OpenImages(HWND hWnd, int nImages, const std::wstring filename[3])
173180
bSucceeded = m_pImgMergeWindow->OpenImages(filename[0].c_str(), filename[1].c_str(), filename[2].c_str());
174181
if (bSucceeded)
175182
UpdateWindowTitle(hWnd);
183+
else
184+
ShowErrorMessageBox(hWnd, "Failed to open files");
176185
InvalidateRect(hWnd, NULL, TRUE);
177186
return bSucceeded;
178187
}
@@ -199,9 +208,7 @@ void SaveImageAs(HWND hWnd, int pane)
199208
if (GetSaveFileNameW(&ofn) != 0)
200209
{
201210
if (!m_pImgMergeWindow->SaveImageAs(pane, ofn.lpstrFile))
202-
{
203-
MessageBoxW(hWnd, L"Failed to save file", nullptr, MB_OK | MB_ICONERROR);
204-
}
211+
ShowErrorMessageBox(hWnd, "Failed to save file");
205212
}
206213
}
207214

@@ -830,7 +837,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
830837
case ID_HELP_ABOUT:
831838
MessageBoxW(hWnd,
832839
L"WinIMerge\n\n"
833-
L"(c) 2014-2021 sdottaka@users.sourceforge.net All rights reserved.\n\n"
840+
L"(c) 2014-2025 sdottaka@users.sourceforge.net All rights reserved.\n\n"
834841
L"This software uses the FreeImage open source image library. \n"
835842
L"See http://freeimage.sourceforge.net for details.\n"
836843
L"FreeImage is used under the GNU GPL version.\n", L"WinIMerge", MB_OK | MB_ICONINFORMATION);

src/WinIMerge/WinIMerge.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ BEGIN
328328
VALUE "FileDescription", "WinIMerge"
329329
VALUE "FileVersion", STRFILEVER
330330
VALUE "InternalName", "WinIMerge.exe"
331-
VALUE "LegalCopyright", "Copyright (C) 2014-2021 sdottaka@users.sourceforge.net"
331+
VALUE "LegalCopyright", "Copyright (C) 2014-2025 sdottaka@users.sourceforge.net"
332332
VALUE "OriginalFilename", "WinIMerge.exe"
333333
VALUE "ProductName", "WinIMerge"
334334
VALUE "ProductVersion", STRPRODUCTVER

src/WinIMergeLib/ImgDiffBuffer.hpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ class CImgDiffBuffer
518518
, m_diffAlgorithm(MYERS_DIFF)
519519
, m_blinkInterval(BLINK_INTERVAL)
520520
, m_overlayAnimationInterval(OVERLAY_ANIMATION_INTERVAL)
521+
, m_lastErrorCode(0)
521522
{
522523
for (int i = 0; i < 3; ++i)
523524
m_currentPage[i] = 0;
@@ -1190,7 +1191,14 @@ class CImgDiffBuffer
11901191
{
11911192
if (pane < 0 || pane >= m_nImages)
11921193
return false;
1193-
return !!m_imgDiff[pane].save(filename);
1194+
int savedErrno = errno;
1195+
errno = 0;
1196+
bool result = !!m_imgDiff[pane].save(filename);
1197+
if (!result)
1198+
m_lastErrorCode = errno != 0 ? errno : ENOTSUP;
1199+
if (errno == 0)
1200+
errno = savedErrno;
1201+
return result;
11941202
}
11951203

11961204
int GetImageWidth(int pane) const
@@ -1496,9 +1504,16 @@ class CImgDiffBuffer
14961504
m_imgOrig32[pane].copySubImage(image, x, y, x2, y2);
14971505
}
14981506

1507+
int GetLastErrorCode() const
1508+
{
1509+
return m_lastErrorCode;
1510+
}
1511+
14991512
protected:
15001513
bool LoadImages()
15011514
{
1515+
int savedErrno = errno;
1516+
errno = 0;
15021517
bool bSucceeded = true;
15031518
for (int i = 0; i < m_nImages; ++i)
15041519
{
@@ -1523,6 +1538,7 @@ class CImgDiffBuffer
15231538
if (!m_imgConverter[i].isValid())
15241539
{
15251540
bSucceeded = false;
1541+
m_lastErrorCode = (errno != 0) ? errno : ENOTSUP;
15261542
}
15271543
}
15281544
m_imgOrig32[i] = m_imgOrig[i];
@@ -1554,6 +1570,8 @@ class CImgDiffBuffer
15541570
}
15551571
m_imgOrig32[i].convertTo32Bits();
15561572
}
1573+
if (errno == 0)
1574+
errno = savedErrno;
15571575
return bSucceeded;
15581576
}
15591577

@@ -2279,4 +2297,5 @@ class CImgDiffBuffer
22792297
DIFF_ALGORITHM m_diffAlgorithm;
22802298
int m_blinkInterval;
22812299
int m_overlayAnimationInterval;
2300+
int m_lastErrorCode;
22822301
};

src/WinIMergeLib/ImgMergeBuffer.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,16 +441,28 @@ class CImgMergeBuffer : public CImgDiffBuffer
441441
if (pane < 0 || pane >= m_nImages)
442442
return false;
443443
m_imgOrig[pane].pullImageKeepingBPP(m_imgOrig32[pane]);
444+
int savedErrno = errno;
445+
errno = 0;
444446
if (m_imgOrigMultiPage[pane].isValid())
445447
{
446448
m_imgOrigMultiPage[pane].replacePage(m_currentPage[pane], m_imgOrig[pane]);
447449
if (!m_imgOrigMultiPage[pane].save(filename))
450+
{
451+
m_lastErrorCode = errno != 0 ? errno : ENOTSUP;
452+
if (errno == 0)
453+
errno = savedErrno;
448454
return false;
455+
}
449456
}
450457
else
451458
{
452459
if (!m_imgOrig[pane].save(filename))
460+
{
461+
m_lastErrorCode = errno != 0 ? errno : ENOTSUP;
462+
if (errno == 0)
463+
errno = savedErrno;
453464
return false;
465+
}
454466
}
455467
m_undoRecords.save(pane);
456468
m_filename[pane] = filename;

src/WinIMergeLib/ImgMergeWindow.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,6 +1229,11 @@ class CImgMergeWindow : public IImgMergeWindow
12291229
}
12301230
}
12311231

1232+
int GetLastErrorCode() const
1233+
{
1234+
return m_buffer.GetLastErrorCode();
1235+
}
1236+
12321237
private:
12331238

12341239
ATOM MyRegisterClass(HINSTANCE hInstance)

src/WinIMergeLib/WinIMergeLib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ struct IImgMergeWindow
189189
virtual void SetOverlayAnimationInterval(int interval) = 0;
190190
virtual bool IsDarkBackgroundEnabled() const = 0;
191191
virtual void SetDarkBackgroundEnabled(bool enabled) = 0;
192+
virtual int GetLastErrorCode() const = 0;
192193
};
193194

194195
struct IImgToolWindow

src/WinIMergeLib/WinIMergeLib.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ BEGIN
144144
VALUE "FileDescription", "WInIMergeLib"
145145
VALUE "FileVersion", STRFILEVER
146146
VALUE "InternalName", "WinIMergeLib.dll"
147-
VALUE "LegalCopyright", "Copyright (C) 2014-2021 sdottaka@users.sourceforge.net"
147+
VALUE "LegalCopyright", "Copyright (C) 2014-2025 sdottaka@users.sourceforge.net"
148148
VALUE "OriginalFilename", "WinIMergeLib.dll"
149149
VALUE "ProductName", "WinIMergeLib"
150150
VALUE "ProductVersion", STRPRODUCTVER

0 commit comments

Comments
 (0)