Skip to content

Commit

Permalink
Add "One per job" mode (fixes #51)
Browse files Browse the repository at this point in the history
  • Loading branch information
OV2 committed Apr 8, 2018
1 parent b1d363f commit 5d0db9f
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 17 deletions.
22 changes: 12 additions & 10 deletions RapidCRC.rc
Expand Up @@ -104,23 +104,25 @@ BEGIN
LTEXT "kB",IDC_STATIC,403,208,19,8
END

IDD_DLG_FILE_CREATION DIALOGEX 0, 0, 251, 148
IDD_DLG_FILE_CREATION DIALOGEX 0, 0, 251, 170
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,138,127,50,14
PUSHBUTTON "Cancel",IDCANCEL,196,127,50,14
DEFPUSHBUTTON "OK",IDOK,138,149,50,14
PUSHBUTTON "Cancel",IDCANCEL,196,149,50,14
LTEXT "",IDC_STATIC_INTRO_TEXT,7,6,239,8
GROUPBOX "",IDC_GRPBOX_CREATE_FILE,3,15,243,65
GROUPBOX "",IDC_GRPBOX_CREATE_FILE,3,15,243,89
CONTROL "",IDC_RADIO_ONE_PER_FILE,"Button",BS_AUTORADIOBUTTON,7,26,236,10
CONTROL "",IDC_RADIO_ONE_PER_DIR,"Button",BS_AUTORADIOBUTTON,7,38,235,10
CONTROL "",IDC_RADIO_ONE_FILE,"Button",BS_AUTORADIOBUTTON,7,50,236,10
CONTROL "",IDC_RADIO_ONE_FILE_DIR_NAME,"Button",BS_AUTORADIOBUTTON,7,62,236,10
LTEXT "",IDC_STATIC_EXPLANATION,4,96,242,8
LTEXT "Use this filename:",IDC_STATIC,5,110,58,8
EDITTEXT IDC_EDIT_FILENAME_CHECKSUM,65,108,180,14,ES_AUTOHSCROLL
PUSHBUTTON "Default",IDC_BTN_DEFAULT,4,127,50,14,BS_CENTER
CONTROL "Save absolute paths",IDC_CHECK_ABSOLUTE_PATHS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,82,194,13
CONTROL "",IDC_RADIO_ONE_PER_JOB,"Button",BS_AUTORADIOBUTTON,7,75,236,10
CONTROL "",IDC_RADIO_ONE_PER_JOB_DIR_NAME,"Button",BS_AUTORADIOBUTTON,7,88,236,10
LTEXT "",IDC_STATIC_EXPLANATION,4,118,242,8
LTEXT "Use this filename:",IDC_STATIC,5,132,58,8
EDITTEXT IDC_EDIT_FILENAME_CHECKSUM,65,130,180,14,ES_AUTOHSCROLL
PUSHBUTTON "Default",IDC_BTN_DEFAULT,4,149,50,14,BS_CENTER
CONTROL "Save absolute paths",IDC_CHECK_ABSOLUTE_PATHS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,104,194,13
END


Expand All @@ -145,7 +147,7 @@ BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 244
TOPMARGIN, 7
BOTTOMMARGIN, 141
BOTTOMMARGIN, 163
END
END
#endif // APSTUDIO_INVOKED
Expand Down
62 changes: 55 additions & 7 deletions actfcts.cpp
Expand Up @@ -23,10 +23,12 @@
#include "resource.h"
#include "CSyncQueue.h"
#include "COpenFileListener.h"
#include <set>

static DWORD CreateChecksumFiles_OnePerFile(CONST UINT uiMode, list<FILEINFO*> *finalList);
static DWORD CreateChecksumFiles_OnePerDir(CONST UINT uiMode, CONST TCHAR szChkSumFilename[MAX_PATH_EX], list<FILEINFO*> *finalList);
static DWORD CreateChecksumFiles_OneFile(CONST HWND arrHwnd[ID_NUM_WINDOWS], CONST UINT uiMode, list<FILEINFO*> *finalList, BOOL askForFilename);
static DWORD CreateChecksumFiles_OnePerJob(CONST HWND arrHwnd[ID_NUM_WINDOWS], CONST UINT uiMode, list<FILEINFO*> *finalList, BOOL askForFilename);
static BOOL SaveCRCIntoStream(TCHAR CONST *szFileName,DWORD crcResult);
static bool CheckIfRehashNecessary(CONST HWND arrHwnd[ID_NUM_WINDOWS],CONST UINT uiMode);
void UpdateFileInfoStatus(FILEINFO *pFileInfo, const HWND hwndListView);
Expand Down Expand Up @@ -448,10 +450,6 @@ DWORD CreateChecksumFiles(CONST HWND arrHwnd[ID_NUM_WINDOWS], CONST UINT uiMode)
return NOERROR;

FillFinalList(arrHwnd[ID_LISTVIEW],&finalList,ListView_GetSelectedCount(arrHwnd[ID_LISTVIEW]));
if(finalList.size()>1) {
finalList.sort(ListPointerCompFunction);
finalList.unique(ListPointerUniqFunction);
}

if((checkReturn = CreateChecksumFiles(arrHwnd,uiMode,&finalList)) != NOERROR) {
StringCchPrintf(szErrorMessage, MAX_PATH_EX,
Expand Down Expand Up @@ -493,6 +491,12 @@ DWORD CreateChecksumFiles(CONST HWND arrHwnd[ID_NUM_WINDOWS], CONST UINT uiMode,
DlgProcFileCreation, (LPARAM) & fco) != IDOK)
return NOERROR;

// one per job wants the list sorted by job, which it is by default
if(finalList->size() > 1 && fco.uiCreateFileMode < CREATE_ONE_PER_JOB) {
finalList->sort(ListPointerCompFunction);
finalList->unique(ListPointerUniqFunction);
}

g_program_options.bSaveAbsolutePaths[uiMode] = fco.bSaveAbsolute;
g_program_options.uiCreateFileMode[uiMode] = fco.uiCreateFileMode;
StringCchCopy(g_program_options.szFilename[uiMode], MAX_PATH_EX, fco.szFilename);
Expand All @@ -510,6 +514,12 @@ DWORD CreateChecksumFiles(CONST HWND arrHwnd[ID_NUM_WINDOWS], CONST UINT uiMode,
case CREATE_ONE_FILE_DIR_NAME:
dwResult = CreateChecksumFiles_OneFile(arrHwnd, uiMode, finalList, FALSE);
break;
case CREATE_ONE_PER_JOB:
dwResult = CreateChecksumFiles_OnePerJob(arrHwnd, uiMode, finalList, TRUE);
break;
case CREATE_ONE_PER_JOB_DIR_NAME:
dwResult = CreateChecksumFiles_OnePerJob(arrHwnd, uiMode, finalList, FALSE);
break;
}

return dwResult;
Expand Down Expand Up @@ -672,7 +682,7 @@ static DWORD CreateChecksumFiles_OnePerDir(CONST UINT uiMode,CONST TCHAR szChkSu
return NOERROR;
}

static BOOL GenerateFilename_OneFile(CONST HWND owner, CONST TCHAR *szDefault, UINT uiMode, TCHAR szFileOut[MAX_PATH_EX], BOOL askForFilename)
static BOOL GenerateFilename_OneFile(CONST HWND owner, CONST TCHAR *szDefault, UINT uiMode, TCHAR szFileOut[MAX_PATH_EX], BOOL askForFilename, CONST TCHAR *szRoot)
{
TCHAR szCurrentPath[MAX_PATH_EX] = TEXT("");
OPENFILENAME ofn;
Expand Down Expand Up @@ -704,7 +714,7 @@ static BOOL GenerateFilename_OneFile(CONST HWND owner, CONST TCHAR *szDefault, U
TCHAR filterString[MAX_PATH_EX];

StringCchPrintf(filterString,MAX_PATH_EX,TEXT(".%s files%c*.%s%cAll files%c*.*%c"),hashExt,TEXT('\0'),hashExt,TEXT('\0'),TEXT('\0'),TEXT('\0'));
StringCchPrintf(msgString,MAX_PATH_EX,TEXT("Please choose a filename for the .%s file"),hashExt);
StringCchPrintf(msgString,MAX_PATH_EX,TEXT("Please choose a filename for the .%s file (job-root: %s)"),hashExt, szRoot);

ZeroMemory(& ofn, sizeof (OPENFILENAME));
ofn.lStructSize = sizeof (OPENFILENAME);
Expand Down Expand Up @@ -741,13 +751,15 @@ static DWORD CreateChecksumFiles_OneFile(CONST HWND arrHwnd[ID_NUM_WINDOWS], CON
HANDLE hFile;
TCHAR szFileOut[MAX_PATH_EX];
TCHAR szDefaultDir[MAX_PATH_EX];
TCHAR szJobRoot[MAX_PATH_EX];
UINT uiSameCharCount;
DWORD dwResult;

uiSameCharCount = FindCommonPrefix(finalList);
StringCchCopyN(szDefaultDir, MAX_PATH_EX, finalList->front()->szFilename, uiSameCharCount);
RegularFromLongFilename(szJobRoot, finalList->front()->parentList->g_szBasePath);

if(!GenerateFilename_OneFile(arrHwnd[ID_MAIN_WND], szDefaultDir, uiMode, szFileOut, askForFilename))
if(!GenerateFilename_OneFile(arrHwnd[ID_MAIN_WND], szDefaultDir, uiMode, szFileOut, askForFilename, szJobRoot))
return NOERROR;

if(g_program_options.bSaveAbsolutePaths[uiMode] || uiSameCharCount == 4 || uiSameCharCount == 8) {
Expand Down Expand Up @@ -800,6 +812,42 @@ static DWORD CreateChecksumFiles_OneFile(CONST HWND arrHwnd[ID_NUM_WINDOWS], CON
return NOERROR;
}

/*****************************************************************************
static DWORD CreateChecksumFiles_OnePerJob(CONST HWND arrHwnd[ID_NUM_WINDOWS], CONST UINT uiMode, list<FILEINFO*> *finalList, BOOL askForFilename)
arrHwnd : (IN) array with window handles
uiMode : (IN) create MD5 or SFV files
finalList : (IN) pointer to list of fileinfo pointers on which the action is to be performed
askForFilename : (IN) determines if the user is prompted for a filename for each job
Return Value:
returns NOERROR or GetLastError()
Notes:
- handles the situation if the user want one sfv/md5 file for each job
*****************************************************************************/
static DWORD CreateChecksumFiles_OnePerJob(CONST HWND arrHwnd[ID_NUM_WINDOWS], CONST UINT uiMode, list<FILEINFO*> *finalList, BOOL askForFilename)
{
DWORD error = NOERROR;
list<FILEINFO*> tempList;
for(list<FILEINFO*>::iterator it = finalList->begin(); it != finalList->end();) {
lFILEINFO *currentParent = (*it)->parentList;
tempList.push_back(*it);

it++;
// job changed, or we reached the end of list -> create one file and start anew
if(it == finalList->end() || (*it)->parentList != currentParent) {
if(tempList.size() > 1) {
tempList.sort(ListPointerCompFunction);
tempList.unique(ListPointerUniqFunction);
}
if(error = CreateChecksumFiles_OneFile(arrHwnd, uiMode, &tempList, askForFilename) != NOERROR)
break;
tempList.clear();
}
}
return error;
}

/*****************************************************************************
VOID FillFinalList(CONST HWND hListView, list<FILEINFO*> *finalList,CONST UINT uiNumSelected)
arrHwnd : (IN) array with window handles
Expand Down
32 changes: 32 additions & 0 deletions dlgproc.cpp
Expand Up @@ -861,6 +861,14 @@ INT_PTR CALLBACK DlgProcFileCreation(HWND hDlg, UINT message, WPARAM wParam, LPA
hashExt, pfco->uiMode == MODE_MD5 ? TEXT(" (*)") : TEXT("") );
SetWindowText(GetDlgItem(hDlg, IDC_RADIO_ONE_FILE_DIR_NAME), szString);

StringCchPrintf(szString, MAX_PATH_EX, TEXT("Create one .%s file per job%s"),
hashExt, pfco->uiMode == MODE_MD5 ? TEXT(" (potentially not md5sum compatible *)") : TEXT("") );
SetWindowText(GetDlgItem(hDlg, IDC_RADIO_ONE_PER_JOB), szString);

StringCchPrintf(szString, MAX_PATH_EX, TEXT("Create one .%s file per job with automatic name%s"),
hashExt, pfco->uiMode == MODE_MD5 ? TEXT(" (*)") : TEXT("") );
SetWindowText(GetDlgItem(hDlg, IDC_RADIO_ONE_PER_JOB_DIR_NAME), szString);

SetWindowText(GetDlgItem(hDlg, IDC_STATIC_EXPLANATION),
pfco->uiMode == MODE_MD5 ? TEXT("* : md5sum compatible .MD5 files cannot hold directory information") : TEXT(""));

Expand All @@ -877,6 +885,12 @@ INT_PTR CALLBACK DlgProcFileCreation(HWND hDlg, UINT message, WPARAM wParam, LPA
case CREATE_ONE_FILE_DIR_NAME:
SendDlgItemMessage(hDlg, IDC_RADIO_ONE_FILE_DIR_NAME, BM_CLICK, 0, 0);
break;
case CREATE_ONE_PER_JOB:
SendDlgItemMessage(hDlg, IDC_RADIO_ONE_PER_JOB, BM_CLICK, 0, 0);
break;
case CREATE_ONE_PER_JOB_DIR_NAME:
SendDlgItemMessage(hDlg, IDC_RADIO_ONE_PER_JOB_DIR_NAME, BM_CLICK, 0, 0);
break;
}

if(pfco->bSaveAbsolute)
Expand Down Expand Up @@ -914,6 +928,20 @@ INT_PTR CALLBACK DlgProcFileCreation(HWND hDlg, UINT message, WPARAM wParam, LPA
return TRUE;
}
break;
case IDC_RADIO_ONE_PER_JOB:
if(HIWORD(wParam) == BN_CLICKED){
SetWindowText(GetDlgItem(hDlg, IDC_EDIT_FILENAME_CHECKSUM), TEXT("<You are asked in the next step>"));
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_FILENAME_CHECKSUM), FALSE);
return TRUE;
}
break;
case IDC_RADIO_ONE_PER_JOB_DIR_NAME:
if(HIWORD(wParam) == BN_CLICKED){
SetWindowText(GetDlgItem(hDlg, IDC_EDIT_FILENAME_CHECKSUM), TEXT("<You are asked in the next step>"));
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_FILENAME_CHECKSUM), FALSE);
return TRUE;
}
break;
case IDC_EDIT_FILENAME_CHECKSUM:
if(HIWORD(wParam) == EN_CHANGE){
if(IsDlgButtonChecked(hDlg, IDC_RADIO_ONE_PER_DIR) == BST_CHECKED){
Expand All @@ -933,6 +961,10 @@ INT_PTR CALLBACK DlgProcFileCreation(HWND hDlg, UINT message, WPARAM wParam, LPA
pfco->uiCreateFileMode = CREATE_ONE_PER_FILE;
else if(IsDlgButtonChecked(hDlg, IDC_RADIO_ONE_FILE_DIR_NAME) == BST_CHECKED)
pfco->uiCreateFileMode = CREATE_ONE_FILE_DIR_NAME;
else if(IsDlgButtonChecked(hDlg, IDC_RADIO_ONE_PER_JOB) == BST_CHECKED)
pfco->uiCreateFileMode = CREATE_ONE_PER_JOB;
else if(IsDlgButtonChecked(hDlg, IDC_RADIO_ONE_PER_JOB_DIR_NAME) == BST_CHECKED)
pfco->uiCreateFileMode = CREATE_ONE_PER_JOB_DIR_NAME;
else if(IsDlgButtonChecked(hDlg, IDC_RADIO_ONE_PER_DIR) == BST_CHECKED){
pfco->uiCreateFileMode = CREATE_ONE_PER_DIR;
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_FILENAME_CHECKSUM), pfco->szFilename, MAX_PATH_EX);
Expand Down
2 changes: 2 additions & 0 deletions globals.h
Expand Up @@ -162,6 +162,8 @@ PCHAR* CommandLineToArgvA(PCHAR CmdLine, int* _argc);
#define CREATE_ONE_PER_DIR 1
#define CREATE_ONE_FILE 2
#define CREATE_ONE_FILE_DIR_NAME 3
#define CREATE_ONE_PER_JOB 4
#define CREATE_ONE_PER_JOB_DIR_NAME 5

// this is a constant to specify the used version of the program options struct
#define PROG_OPTIONS_VERSION 1
Expand Down
2 changes: 2 additions & 0 deletions resource.h
Expand Up @@ -42,8 +42,10 @@
#define IDC_RADIO_ONE_FILE_DIR_NAME 1043
#define IDC_STATIC_EXPLANATION 1044
#define IDC_CRC_DELIM_LIST 1045
#define IDC_RADIO_ONE_PER_JOB 1045
#define IDC_GRPBOX_CREATE_FILE 1046
#define IDC_ALLOW_CRC_ANYWHERE 1047
#define IDC_RADIO_ONE_PER_JOB_DIR_NAME 1047
#define IDC_STATIC_INTRO_TEXT 1048
#define IDC_CHECK_INCLUDE_COMMENTS 1049
#define IDC_EDIT_FILENAME_CHECKSUM 1050
Expand Down

0 comments on commit 5d0db9f

Please sign in to comment.